chef 10.34.6-x86-mingw32 → 11.6.2-x86-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 (777) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTING.md +155 -0
  3. data/README.md +89 -0
  4. data/Rakefile +18 -1
  5. data/bin/chef-apply +25 -0
  6. data/bin/chef-service-manager +37 -0
  7. data/bin/chef-shell +34 -0
  8. data/bin/shef +6 -5
  9. data/distro/common/html/chef-client.8.html +4 -4
  10. data/distro/common/html/chef-expander.8.html +4 -4
  11. data/distro/common/html/chef-expanderctl.8.html +4 -4
  12. data/distro/common/html/chef-server-webui.8.html +4 -4
  13. data/distro/common/html/chef-server.8.html +4 -4
  14. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  15. data/distro/common/html/chef-solo.8.html +4 -4
  16. data/distro/common/html/chef-solr.8.html +5 -5
  17. data/distro/common/html/knife-bootstrap.1.html +4 -4
  18. data/distro/common/html/knife-client.1.html +4 -4
  19. data/distro/common/html/knife-configure.1.html +4 -4
  20. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  21. data/distro/common/html/knife-cookbook.1.html +4 -4
  22. data/distro/common/html/knife-data-bag.1.html +4 -4
  23. data/distro/common/html/knife-environment.1.html +4 -4
  24. data/distro/common/html/knife-exec.1.html +9 -9
  25. data/distro/common/html/knife-index.1.html +4 -4
  26. data/distro/common/html/knife-node.1.html +4 -4
  27. data/distro/common/html/knife-role.1.html +4 -4
  28. data/distro/common/html/knife-search.1.html +4 -4
  29. data/distro/common/html/knife-ssh.1.html +4 -4
  30. data/distro/common/html/knife-status.1.html +4 -4
  31. data/distro/common/html/knife-tag.1.html +4 -4
  32. data/distro/common/html/knife.1.html +8 -13
  33. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  34. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  35. data/distro/common/man/man1/knife-client.1 +0 -99
  36. data/distro/common/man/man1/knife-configure.1 +1 -1
  37. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  38. data/distro/common/man/man1/knife-cookbook.1 +1 -1
  39. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  40. data/distro/common/man/man1/knife-environment.1 +0 -168
  41. data/distro/common/man/man1/knife-exec.1 +4 -7
  42. data/distro/common/man/man1/knife-index.1 +1 -1
  43. data/distro/common/man/man1/knife-node.1 +1 -1
  44. data/distro/common/man/man1/knife-role.1 +1 -1
  45. data/distro/common/man/man1/knife-search.1 +1 -1
  46. data/distro/common/man/man1/knife-ssh.1 +1 -1
  47. data/distro/common/man/man1/knife-status.1 +1 -1
  48. data/distro/common/man/man1/knife-tag.1 +1 -1
  49. data/distro/common/man/man1/knife.1 +3 -6
  50. data/distro/common/man/man8/chef-client.8 +1 -1
  51. data/distro/common/man/man8/chef-expander.8 +1 -1
  52. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  53. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  54. data/distro/common/man/man8/chef-server.8 +1 -1
  55. data/distro/common/man/man8/chef-solo.8 +1 -1
  56. data/distro/common/man/man8/chef-solr.8 +1 -1
  57. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  58. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  59. data/distro/common/markdown/man1/knife.mkd +4 -9
  60. data/distro/debian/etc/default/chef-client +0 -1
  61. data/distro/debian/etc/init.d/chef-client +6 -4
  62. data/distro/windows/service_manager.rb +2 -146
  63. data/lib/chef.rb +3 -6
  64. data/lib/chef/api_client.rb +20 -130
  65. data/lib/chef/api_client/registration.rb +126 -0
  66. data/lib/chef/application.rb +68 -18
  67. data/lib/chef/application/apply.rb +162 -0
  68. data/lib/chef/application/client.rb +37 -22
  69. data/lib/chef/application/knife.rb +2 -4
  70. data/lib/chef/application/solo.rb +27 -13
  71. data/lib/chef/application/windows_service.rb +114 -54
  72. data/lib/chef/application/windows_service_manager.rb +179 -0
  73. data/lib/chef/applications.rb +1 -0
  74. data/lib/chef/chef_fs.rb +9 -0
  75. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  76. data/lib/chef/chef_fs/command_line.rb +284 -0
  77. data/lib/chef/chef_fs/config.rb +205 -0
  78. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  79. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  80. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  81. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  82. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  83. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  84. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  85. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  86. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  87. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  88. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  89. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  90. data/lib/chef/chef_fs/file_system.rb +426 -0
  91. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  92. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  93. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  94. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  95. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  96. data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
  97. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  98. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  99. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  100. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  101. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +60 -0
  102. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
  103. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
  104. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
  105. data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
  106. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  107. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  108. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  109. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
  110. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
  111. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
  112. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  113. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  114. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  115. data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
  116. data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
  117. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  118. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  119. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  120. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  121. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  122. data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
  123. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
  124. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  125. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  126. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  127. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +113 -0
  128. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
  129. data/lib/chef/chef_fs/knife.rb +116 -0
  130. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  131. data/lib/chef/chef_fs/path_utils.rb +90 -0
  132. data/lib/chef/chef_fs/raw_request.rb +79 -0
  133. data/lib/chef/client.rb +111 -34
  134. data/lib/chef/config.rb +111 -102
  135. data/lib/chef/cookbook/chefignore.rb +2 -1
  136. data/lib/chef/cookbook/metadata.rb +0 -2
  137. data/lib/chef/cookbook/syntax_check.rb +76 -14
  138. data/lib/chef/cookbook_loader.rb +39 -26
  139. data/lib/chef/cookbook_uploader.rb +16 -9
  140. data/lib/chef/cookbook_version.rb +2 -410
  141. data/lib/chef/daemon.rb +24 -19
  142. data/lib/chef/data_bag.rb +20 -104
  143. data/lib/chef/data_bag_item.rb +2 -65
  144. data/lib/chef/deprecation/mixin/template.rb +49 -0
  145. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  146. data/lib/chef/deprecation/provider/file.rb +197 -0
  147. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  148. data/lib/chef/deprecation/provider/template.rb +63 -0
  149. data/lib/chef/deprecation/warnings.rb +38 -0
  150. data/lib/chef/digester.rb +73 -0
  151. data/lib/chef/dsl.rb +6 -0
  152. data/lib/chef/dsl/data_query.rb +71 -0
  153. data/lib/chef/dsl/include_attribute.rb +63 -0
  154. data/lib/chef/dsl/include_recipe.rb +45 -0
  155. data/lib/chef/dsl/platform_introspection.rb +218 -0
  156. data/lib/chef/dsl/recipe.rb +87 -0
  157. data/lib/chef/dsl/registry_helper.rb +59 -0
  158. data/lib/chef/encrypted_data_bag_item.rb +171 -24
  159. data/lib/chef/environment.rb +39 -179
  160. data/lib/chef/event_dispatch/base.rb +3 -0
  161. data/lib/chef/exceptions.rb +107 -8
  162. data/lib/chef/file_access_control/unix.rb +64 -7
  163. data/lib/chef/file_access_control/windows.rb +22 -11
  164. data/lib/chef/file_content_management/content_base.rb +56 -0
  165. data/lib/chef/file_content_management/deploy.rb +38 -0
  166. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  167. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  168. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  169. data/lib/chef/file_content_management/tempfile.rb +61 -0
  170. data/lib/chef/formatters/base.rb +4 -1
  171. data/lib/chef/formatters/doc.rb +1 -1
  172. data/lib/chef/formatters/error_descriptor.rb +5 -4
  173. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  174. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +8 -0
  175. data/lib/chef/json_compat.rb +15 -14
  176. data/lib/chef/knife.rb +99 -41
  177. data/lib/chef/knife/bootstrap.rb +46 -2
  178. data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
  179. data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
  180. data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
  181. data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
  182. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
  183. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
  184. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
  185. data/lib/chef/knife/client_show.rb +2 -5
  186. data/lib/chef/knife/configure.rb +19 -17
  187. data/lib/chef/knife/cookbook_create.rb +6 -5
  188. data/lib/chef/knife/cookbook_download.rb +13 -5
  189. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  190. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  191. data/lib/chef/knife/cookbook_test.rb +4 -2
  192. data/lib/chef/knife/cookbook_upload.rb +4 -4
  193. data/lib/chef/knife/core/bootstrap_context.rb +11 -5
  194. data/lib/chef/knife/core/generic_presenter.rb +42 -13
  195. data/lib/chef/knife/core/node_editor.rb +36 -16
  196. data/lib/chef/knife/core/node_presenter.rb +1 -1
  197. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  198. data/lib/chef/knife/core/text_formatter.rb +23 -37
  199. data/lib/chef/knife/core/ui.rb +34 -13
  200. data/lib/chef/knife/delete.rb +106 -0
  201. data/lib/chef/knife/deps.rb +139 -0
  202. data/lib/chef/knife/diff.rb +63 -0
  203. data/lib/chef/knife/download.rb +63 -0
  204. data/lib/chef/knife/edit.rb +76 -0
  205. data/lib/chef/knife/environment_show.rb +2 -0
  206. data/lib/chef/knife/exec.rb +5 -5
  207. data/lib/chef/knife/help_topics.rb +1 -1
  208. data/lib/chef/knife/index_rebuild.rb +91 -7
  209. data/lib/chef/knife/list.rb +153 -0
  210. data/lib/chef/knife/node_run_list_set.rb +66 -0
  211. data/lib/chef/knife/node_show.rb +1 -7
  212. data/lib/chef/knife/raw.rb +64 -0
  213. data/lib/chef/knife/role_show.rb +2 -4
  214. data/lib/chef/knife/search.rb +45 -28
  215. data/lib/chef/knife/show.rb +55 -0
  216. data/lib/chef/knife/ssh.rb +14 -2
  217. data/lib/chef/knife/upload.rb +69 -0
  218. data/lib/chef/knife/user_create.rb +93 -0
  219. data/lib/chef/knife/user_delete.rb +46 -0
  220. data/lib/chef/knife/user_edit.rb +53 -0
  221. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
  222. data/lib/chef/knife/user_reregister.rb +59 -0
  223. data/lib/chef/knife/user_show.rb +49 -0
  224. data/lib/chef/knife/xargs.rb +265 -0
  225. data/lib/chef/log.rb +2 -2
  226. data/lib/chef/mixin/checksum.rb +3 -3
  227. data/lib/chef/mixin/deep_merge.rb +78 -194
  228. data/lib/chef/mixin/deprecation.rb +35 -0
  229. data/lib/chef/mixin/file_class.rb +0 -9
  230. data/lib/chef/mixin/language.rb +22 -223
  231. data/lib/chef/mixin/language_include_attribute.rb +10 -36
  232. data/lib/chef/mixin/language_include_recipe.rb +7 -33
  233. data/lib/chef/mixin/params_validate.rb +0 -3
  234. data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
  235. data/lib/chef/mixin/securable.rb +32 -7
  236. data/lib/chef/mixin/template.rb +156 -26
  237. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  238. data/lib/chef/mixins.rb +1 -5
  239. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
  240. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  241. data/lib/chef/monkey_patches/net_http.rb +0 -34
  242. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  243. data/lib/chef/monologger.rb +93 -0
  244. data/lib/chef/node.rb +139 -308
  245. data/lib/chef/node/attribute.rb +367 -473
  246. data/lib/chef/node/attribute_collections.rb +206 -0
  247. data/lib/chef/node/immutable_collections.rb +186 -0
  248. data/lib/chef/platform.rb +4 -496
  249. data/lib/chef/platform/provider_mapping.rb +529 -0
  250. data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
  251. data/lib/chef/provider.rb +14 -58
  252. data/lib/chef/provider/batch.rb +35 -0
  253. data/lib/chef/provider/breakpoint.rb +6 -6
  254. data/lib/chef/provider/cookbook_file.rb +11 -80
  255. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  256. data/lib/chef/provider/deploy.rb +26 -21
  257. data/lib/chef/provider/deploy/revision.rb +27 -0
  258. data/lib/chef/provider/directory.rb +12 -18
  259. data/lib/chef/provider/execute.rb +22 -5
  260. data/lib/chef/provider/file.rb +297 -248
  261. data/lib/chef/provider/file/content.rb +39 -0
  262. data/lib/chef/provider/git.rb +76 -43
  263. data/lib/chef/provider/group.rb +31 -51
  264. data/lib/chef/provider/group/dscl.rb +13 -53
  265. data/lib/chef/provider/group/gpasswd.rb +19 -14
  266. data/lib/chef/provider/group/groupadd.rb +1 -41
  267. data/lib/chef/provider/group/groupmod.rb +36 -46
  268. data/lib/chef/provider/group/pw.rb +16 -59
  269. data/lib/chef/provider/group/suse.rb +13 -16
  270. data/lib/chef/provider/group/usermod.rb +18 -40
  271. data/lib/chef/provider/group/windows.rb +6 -13
  272. data/lib/chef/provider/http_request.rb +25 -42
  273. data/lib/chef/provider/ifconfig.rb +25 -35
  274. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  275. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  276. data/lib/chef/provider/link.rb +12 -3
  277. data/lib/chef/provider/lwrp_base.rb +150 -0
  278. data/lib/chef/provider/mount.rb +1 -1
  279. data/lib/chef/provider/mount/mount.rb +8 -3
  280. data/lib/chef/provider/mount/windows.rb +4 -1
  281. data/lib/chef/provider/package/rpm.rb +2 -2
  282. data/lib/chef/provider/package/rubygems.rb +4 -1
  283. data/lib/chef/provider/package/smartos.rb +47 -36
  284. data/lib/chef/provider/package/zypper.rb +45 -55
  285. data/lib/chef/provider/powershell_script.rb +77 -0
  286. data/lib/chef/provider/registry_key.rb +156 -0
  287. data/lib/chef/provider/remote_directory.rb +6 -5
  288. data/lib/chef/provider/remote_file.rb +13 -100
  289. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  290. data/lib/chef/provider/remote_file/content.rb +75 -0
  291. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  292. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  293. data/lib/chef/provider/remote_file/http.rb +124 -0
  294. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  295. data/lib/chef/provider/route.rb +6 -2
  296. data/lib/chef/provider/ruby_block.rb +5 -2
  297. data/lib/chef/provider/script.rb +14 -2
  298. data/lib/chef/provider/service.rb +15 -0
  299. data/lib/chef/provider/service/init.rb +9 -7
  300. data/lib/chef/provider/service/macosx.rb +29 -81
  301. data/lib/chef/provider/service/simple.rb +1 -1
  302. data/lib/chef/provider/service/solaris.rb +6 -5
  303. data/lib/chef/provider/template.rb +16 -81
  304. data/lib/chef/provider/template/content.rb +61 -0
  305. data/lib/chef/provider/template_finder.rb +61 -0
  306. data/lib/chef/provider/user.rb +0 -1
  307. data/lib/chef/provider/user/dscl.rb +175 -568
  308. data/lib/chef/provider/user/useradd.rb +50 -54
  309. data/lib/chef/provider/windows_script.rb +73 -0
  310. data/lib/chef/providers.rb +18 -1
  311. data/lib/chef/recipe.rb +14 -8
  312. data/lib/chef/resource.rb +52 -146
  313. data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
  314. data/lib/chef/resource/conditional.rb +4 -0
  315. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  316. data/lib/chef/resource/file.rb +31 -3
  317. data/lib/chef/resource/group.rb +1 -11
  318. data/lib/chef/resource/http_request.rb +2 -1
  319. data/lib/chef/resource/link.rb +17 -0
  320. data/lib/chef/resource/lwrp_base.rb +132 -0
  321. data/lib/chef/resource/mount.rb +39 -13
  322. data/lib/chef/resource/powershell_script.rb +31 -0
  323. data/lib/chef/resource/registry_key.rb +86 -0
  324. data/lib/chef/resource/remote_directory.rb +6 -5
  325. data/lib/chef/resource/remote_file.rb +62 -25
  326. data/lib/chef/resource/route.rb +1 -1
  327. data/lib/chef/resource/ruby_block.rb +2 -2
  328. data/lib/chef/resource/service.rb +14 -0
  329. data/lib/chef/resource/template.rb +145 -0
  330. data/lib/chef/resource/user.rb +0 -18
  331. data/lib/chef/resource/windows_script.rb +62 -0
  332. data/lib/chef/resource_collection.rb +69 -31
  333. data/lib/chef/resource_reporter.rb +81 -52
  334. data/lib/chef/resources.rb +4 -1
  335. data/lib/chef/rest.rb +55 -127
  336. data/lib/chef/rest/auth_credentials.rb +4 -20
  337. data/lib/chef/rest/rest_request.rb +7 -8
  338. data/lib/chef/role.rb +1 -97
  339. data/lib/chef/run_context.rb +108 -130
  340. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  341. data/lib/chef/run_list.rb +0 -2
  342. data/lib/chef/run_list/run_list_expansion.rb +1 -16
  343. data/lib/chef/run_lock.rb +96 -0
  344. data/lib/chef/runner.rb +28 -6
  345. data/lib/chef/sandbox.rb +15 -148
  346. data/lib/chef/scan_access_control.rb +8 -5
  347. data/lib/chef/search/query.rb +2 -2
  348. data/lib/chef/shef/ext.rb +3 -575
  349. data/lib/chef/{shef.rb → shell.rb} +35 -40
  350. data/lib/chef/shell/ext.rb +593 -0
  351. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  352. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  353. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +15 -13
  354. data/lib/chef/shell_out.rb +7 -0
  355. data/lib/chef/user.rb +182 -0
  356. data/lib/chef/util/backup.rb +84 -0
  357. data/lib/chef/util/diff.rb +145 -0
  358. data/lib/chef/util/file_edit.rb +1 -1
  359. data/lib/chef/util/selinux.rb +100 -0
  360. data/lib/chef/util/windows/net_group.rb +1 -5
  361. data/lib/chef/util/windows/net_user.rb +14 -1
  362. data/lib/chef/util/windows/volume.rb +2 -2
  363. data/lib/chef/version.rb +1 -1
  364. data/lib/chef/version/platform.rb +42 -0
  365. data/lib/chef/version_class.rb +1 -1
  366. data/lib/chef/version_constraint.rb +6 -5
  367. data/lib/chef/{index_queue.rb → version_constraint/platform.rb} +11 -14
  368. data/lib/chef/win32/api/file.rb +8 -2
  369. data/lib/chef/win32/api/security.rb +45 -1
  370. data/lib/chef/win32/registry.rb +382 -0
  371. data/lib/chef/win32/security.rb +19 -0
  372. data/lib/chef/win32/version.rb +25 -8
  373. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  374. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  375. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  376. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  377. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  378. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  379. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  380. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  381. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  382. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  383. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  384. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  385. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  386. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  387. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  388. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  389. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  390. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  391. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  392. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  393. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  394. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  395. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  396. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  397. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  398. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  399. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  400. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  401. data/spec/data/apt/var/www/apt/db/version +4 -0
  402. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  403. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  404. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  405. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  406. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  407. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  408. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  409. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  410. data/spec/data/bootstrap/secret.erb +9 -0
  411. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  412. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  413. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  414. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  415. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  416. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  417. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  418. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  419. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  420. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  421. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  422. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  423. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  424. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  425. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  426. data/spec/data/nodes/default.rb +3 -3
  427. data/spec/data/nodes/test.example.com.rb +3 -3
  428. data/spec/data/nodes/test.rb +3 -3
  429. data/spec/data/null_config.rb +1 -0
  430. data/spec/data/partial_one.erb +1 -0
  431. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  432. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  433. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  434. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  435. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  436. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  437. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  438. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  439. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  440. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  441. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  442. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  443. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  444. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  445. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  446. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  447. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  448. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  449. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  450. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  451. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  452. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  453. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  454. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  455. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  456. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  457. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  458. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  459. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  460. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  461. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  462. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  463. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  464. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  465. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  466. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  467. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  468. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  469. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  470. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  471. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  472. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  473. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  474. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  475. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  476. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  477. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  478. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  479. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  480. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  481. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  482. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  483. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  484. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  485. data/spec/data/shef-config.rb +10 -0
  486. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  487. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  488. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  489. data/spec/functional/knife/exec_spec.rb +3 -3
  490. data/spec/functional/knife/smoke_test.rb +34 -0
  491. data/spec/functional/knife/ssh_spec.rb +5 -1
  492. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  493. data/spec/functional/resource/batch_spec.rb +64 -0
  494. data/spec/functional/resource/cookbook_file_spec.rb +15 -9
  495. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  496. data/spec/functional/resource/directory_spec.rb +5 -1
  497. data/spec/functional/resource/file_spec.rb +71 -21
  498. data/spec/functional/resource/git_spec.rb +259 -0
  499. data/spec/functional/resource/link_spec.rb +424 -388
  500. data/spec/functional/resource/package_spec.rb +297 -0
  501. data/spec/functional/resource/powershell_spec.rb +188 -0
  502. data/spec/functional/resource/registry_spec.rb +576 -0
  503. data/spec/functional/resource/remote_directory_spec.rb +143 -37
  504. data/spec/functional/resource/remote_file_spec.rb +99 -13
  505. data/spec/functional/resource/template_spec.rb +180 -3
  506. data/spec/functional/resource/user_spec.rb +547 -0
  507. data/spec/functional/run_lock_spec.rb +243 -0
  508. data/spec/functional/shell_spec.rb +102 -0
  509. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  510. data/spec/functional/win32/security_spec.rb +37 -0
  511. data/spec/functional/win32/service_manager_spec.rb +269 -0
  512. data/spec/functional/win32/versions_spec.rb +78 -0
  513. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  514. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  515. data/spec/integration/knife/chefignore_spec.rb +271 -0
  516. data/spec/integration/knife/delete_spec.rb +944 -0
  517. data/spec/integration/knife/deps_spec.rb +648 -0
  518. data/spec/integration/knife/diff_spec.rb +536 -0
  519. data/spec/integration/knife/download_spec.rb +962 -0
  520. data/spec/integration/knife/list_spec.rb +633 -0
  521. data/spec/integration/knife/raw_spec.rb +166 -0
  522. data/spec/integration/knife/redirection_spec.rb +57 -0
  523. data/spec/integration/knife/show_spec.rb +158 -0
  524. data/spec/integration/knife/upload_spec.rb +1060 -0
  525. data/spec/integration/solo/solo_spec.rb +41 -0
  526. data/spec/spec_helper.rb +49 -13
  527. data/spec/stress/win32/security_spec.rb +1 -1
  528. data/spec/support/chef_helpers.rb +33 -3
  529. data/spec/support/lib/chef/resource/cat.rb +3 -5
  530. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  531. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  532. data/spec/support/platform_helpers.rb +46 -13
  533. data/spec/support/platforms/win32/spec_service.rb +59 -0
  534. data/spec/support/shared/functional/diff_disabled.rb +10 -0
  535. data/spec/support/shared/functional/directory_resource.rb +129 -38
  536. data/spec/support/shared/functional/file_resource.rb +837 -71
  537. data/spec/support/shared/functional/securable_resource.rb +189 -58
  538. data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
  539. data/spec/support/shared/integration/integration_helper.rb +166 -0
  540. data/spec/support/shared/integration/knife_support.rb +171 -0
  541. data/spec/support/shared/unit/execute_resource.rb +125 -0
  542. data/spec/support/shared/unit/file_system_support.rb +70 -0
  543. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  544. data/spec/support/shared/unit/provider/file.rb +609 -0
  545. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  546. data/spec/support/shared/unit/script_resource.rb +52 -0
  547. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  548. data/spec/tiny_server.rb +13 -11
  549. data/spec/unit/api_client/registration_spec.rb +172 -0
  550. data/spec/unit/api_client_spec.rb +78 -156
  551. data/spec/unit/application/apply.rb +84 -0
  552. data/spec/unit/application/client_spec.rb +16 -14
  553. data/spec/unit/application/knife_spec.rb +17 -0
  554. data/spec/unit/application/solo_spec.rb +1 -1
  555. data/spec/unit/application_spec.rb +113 -3
  556. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  557. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  558. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  559. data/spec/unit/chef_fs/file_system_spec.rb +135 -0
  560. data/spec/unit/client_spec.rb +195 -23
  561. data/spec/unit/config_spec.rb +102 -51
  562. data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
  563. data/spec/unit/cookbook_loader_spec.rb +154 -91
  564. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  565. data/spec/unit/cookbook_spec.rb +3 -20
  566. data/spec/unit/cookbook_version_spec.rb +23 -122
  567. data/spec/unit/daemon_spec.rb +24 -19
  568. data/spec/unit/data_bag_spec.rb +13 -4
  569. data/spec/unit/deprecation_spec.rb +86 -0
  570. data/spec/unit/digester_spec.rb +50 -0
  571. data/spec/unit/dsl/data_query_spec.rb +66 -0
  572. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  573. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  574. data/spec/unit/encrypted_data_bag_item_spec.rb +197 -157
  575. data/spec/unit/environment_spec.rb +94 -126
  576. data/spec/unit/exceptions_spec.rb +8 -4
  577. data/spec/unit/file_access_control_spec.rb +21 -1
  578. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  579. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  580. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  581. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  582. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +6 -5
  583. data/spec/unit/json_compat_spec.rb +8 -0
  584. data/spec/unit/knife/bootstrap_spec.rb +130 -29
  585. data/spec/unit/knife/configure_spec.rb +64 -45
  586. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  587. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  588. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  589. data/spec/unit/knife/cookbook_upload_spec.rb +39 -0
  590. data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
  591. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  592. data/spec/unit/knife/core/ui_spec.rb +196 -124
  593. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  594. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  595. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  596. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  597. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  598. data/spec/unit/knife/knife_help.rb +7 -7
  599. data/spec/unit/knife/node_edit_spec.rb +6 -33
  600. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  601. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  602. data/spec/unit/knife/ssh_spec.rb +12 -15
  603. data/spec/unit/knife/status_spec.rb +2 -2
  604. data/spec/unit/knife/user_create_spec.rb +86 -0
  605. data/spec/unit/knife/user_delete_spec.rb +39 -0
  606. data/spec/unit/knife/user_edit_spec.rb +42 -0
  607. data/spec/unit/knife/user_list_spec.rb +32 -0
  608. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  609. data/spec/unit/knife/user_show_spec.rb +41 -0
  610. data/spec/unit/knife_spec.rb +74 -0
  611. data/spec/unit/lwrp_spec.rb +102 -60
  612. data/spec/unit/mixin/checksum_spec.rb +2 -2
  613. data/spec/unit/mixin/deep_merge_spec.rb +130 -791
  614. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  615. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
  616. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  617. data/spec/unit/mixin/securable_spec.rb +5 -3
  618. data/spec/unit/mixin/template_spec.rb +145 -14
  619. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  620. data/spec/unit/node/attribute_spec.rb +273 -173
  621. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  622. data/spec/unit/node_spec.rb +418 -370
  623. data/spec/unit/platform_spec.rb +21 -8
  624. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  625. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  626. data/spec/unit/provider/cookbook_file_spec.rb +26 -187
  627. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  628. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  629. data/spec/unit/provider/deploy_spec.rb +2 -2
  630. data/spec/unit/provider/directory_spec.rb +99 -67
  631. data/spec/unit/provider/env_spec.rb +2 -2
  632. data/spec/unit/provider/execute_spec.rb +27 -1
  633. data/spec/unit/provider/file/content_spec.rb +101 -0
  634. data/spec/unit/provider/file_spec.rb +25 -475
  635. data/spec/unit/provider/git_spec.rb +224 -28
  636. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  637. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  638. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  639. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  640. data/spec/unit/provider/group/pw_spec.rb +15 -12
  641. data/spec/unit/provider/group/usermod_spec.rb +9 -22
  642. data/spec/unit/provider/group/windows_spec.rb +8 -0
  643. data/spec/unit/provider/group_spec.rb +6 -28
  644. data/spec/unit/provider/http_request_spec.rb +28 -69
  645. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  646. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  647. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  648. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  649. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  650. data/spec/unit/provider/mount_spec.rb +16 -6
  651. data/spec/unit/provider/ohai_spec.rb +4 -4
  652. data/spec/unit/provider/package/apt_spec.rb +0 -1
  653. data/spec/unit/provider/package/ips_spec.rb +0 -1
  654. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  655. data/spec/unit/provider/package/rubygems_spec.rb +1 -1
  656. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  657. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  658. data/spec/unit/provider/package_spec.rb +7 -9
  659. data/spec/unit/provider/powershell_spec.rb +38 -0
  660. data/spec/unit/provider/registry_key_spec.rb +269 -0
  661. data/spec/unit/provider/remote_directory_spec.rb +7 -7
  662. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  663. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  664. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  665. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  666. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  667. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  668. data/spec/unit/provider/remote_file_spec.rb +33 -259
  669. data/spec/unit/provider/route_spec.rb +29 -12
  670. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  671. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  672. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  673. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  674. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  675. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  676. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  677. data/spec/unit/provider/service/macosx_spec.rb +176 -207
  678. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  679. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  680. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  681. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  682. data/spec/unit/provider/service/upstart_service_spec.rb +11 -11
  683. data/spec/unit/provider/service_spec.rb +3 -3
  684. data/spec/unit/provider/subversion_spec.rb +1 -1
  685. data/spec/unit/provider/template/content_spec.rb +78 -0
  686. data/spec/unit/provider/template_spec.rb +52 -160
  687. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  688. data/spec/unit/provider/user/solaris_spec.rb +39 -373
  689. data/spec/unit/provider/user/useradd_spec.rb +12 -379
  690. data/spec/unit/provider/user_spec.rb +1 -1
  691. data/spec/unit/recipe_spec.rb +10 -8
  692. data/spec/unit/registry_helper_spec.rb +376 -0
  693. data/spec/unit/resource/batch_spec.rb +48 -0
  694. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  695. data/spec/unit/resource/execute_spec.rb +3 -101
  696. data/spec/unit/resource/file_spec.rb +0 -5
  697. data/spec/unit/resource/group_spec.rb +9 -0
  698. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  699. data/spec/unit/resource/link_spec.rb +1 -0
  700. data/spec/unit/resource/mount_spec.rb +37 -11
  701. data/spec/unit/resource/powershell_spec.rb +48 -0
  702. data/spec/unit/resource/registry_key_spec.rb +171 -0
  703. data/spec/unit/resource/remote_file_spec.rb +63 -25
  704. data/spec/unit/resource/route_spec.rb +1 -1
  705. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  706. data/spec/unit/resource/script_spec.rb +13 -36
  707. data/spec/unit/resource/service_spec.rb +11 -0
  708. data/spec/unit/resource/template_spec.rb +111 -8
  709. data/spec/unit/resource/user_spec.rb +7 -0
  710. data/spec/unit/resource_collection_spec.rb +61 -32
  711. data/spec/unit/resource_reporter_spec.rb +115 -102
  712. data/spec/unit/resource_spec.rb +197 -5
  713. data/spec/unit/rest/auth_credentials_spec.rb +4 -21
  714. data/spec/unit/rest_spec.rb +134 -284
  715. data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -0
  716. data/spec/unit/run_context_spec.rb +18 -4
  717. data/spec/unit/run_list_spec.rb +0 -209
  718. data/spec/unit/run_lock_spec.rb +37 -0
  719. data/spec/unit/runner_spec.rb +102 -3
  720. data/spec/unit/scan_access_control_spec.rb +8 -6
  721. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  722. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  723. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +16 -58
  724. data/spec/unit/shell_out_spec.rb +18 -0
  725. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  726. data/spec/unit/user_spec.rb +255 -0
  727. data/spec/unit/util/backup_spec.rb +149 -0
  728. data/spec/unit/util/diff_spec.rb +596 -0
  729. data/spec/unit/util/selinux_spec.rb +172 -0
  730. data/spec/unit/version/platform_spec.rb +61 -0
  731. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  732. data/spec/unit/version_constraint_spec.rb +5 -0
  733. metadata +493 -264
  734. data/README.rdoc +0 -177
  735. data/distro/common/html/knife-recipe.1.html +0 -92
  736. data/lib/chef/certificate.rb +0 -161
  737. data/lib/chef/checksum.rb +0 -167
  738. data/lib/chef/checksum_cache.rb +0 -190
  739. data/lib/chef/cookbook_version_selector.rb +0 -168
  740. data/lib/chef/couchdb.rb +0 -246
  741. data/lib/chef/index_queue/amqp_client.rb +0 -116
  742. data/lib/chef/index_queue/consumer.rb +0 -76
  743. data/lib/chef/index_queue/indexable.rb +0 -109
  744. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  745. data/lib/chef/monkey_patches/dir.rb +0 -36
  746. data/lib/chef/monkey_patches/moneta.rb +0 -50
  747. data/lib/chef/monkey_patches/uri.rb +0 -70
  748. data/lib/chef/openid_registration.rb +0 -187
  749. data/lib/chef/solr_query.rb +0 -187
  750. data/lib/chef/solr_query/lucene.treetop +0 -150
  751. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  752. data/lib/chef/solr_query/query_transform.rb +0 -65
  753. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  754. data/lib/chef/webui_user.rb +0 -231
  755. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  756. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  757. data/spec/data/mac_users/10.7.plist.xml +0 -559
  758. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  759. data/spec/data/mac_users/10.8.plist.xml +0 -559
  760. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  761. data/spec/data/mac_users/10.9.plist.xml +0 -560
  762. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  763. data/spec/functional/resource/base.rb +0 -40
  764. data/spec/functional/resource/group_spec.rb +0 -343
  765. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  766. data/spec/unit/certificate_spec.rb +0 -76
  767. data/spec/unit/checksum_cache_spec.rb +0 -209
  768. data/spec/unit/checksum_spec.rb +0 -94
  769. data/spec/unit/couchdb_spec.rb +0 -274
  770. data/spec/unit/index_queue_spec.rb +0 -391
  771. data/spec/unit/mixin/language_spec.rb +0 -305
  772. data/spec/unit/openid_registration_spec.rb +0 -153
  773. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  774. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  775. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  776. data/spec/unit/solr_query_spec.rb +0 -203
  777. data/spec/unit/webui_user_spec.rb +0 -238
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
3
  # Author:: AJ Christensen (<aj@opscode.com>)
4
4
  # Copyright:: Copyright (c) 2008 Opscode, Inc.
@@ -17,488 +17,382 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
+ require 'chef/node/immutable_collections'
21
+ require 'chef/node/attribute_collections'
20
22
  require 'chef/mixin/deep_merge'
21
23
  require 'chef/log'
22
24
 
23
25
  class Chef
24
26
  class Node
25
- class Attribute
26
- HIDDEN_ATTRIBUES = [:@override, :@attribute, :@default, :@normal, :@automatic]
27
-
28
- attr_accessor :normal,
29
- :default,
30
- :override,
31
- :automatic,
32
- :current_normal,
33
- :current_default,
34
- :current_override,
35
- :current_automatic,
36
- :auto_vivifiy_on_read,
37
- :set_unless_value_present,
38
- :set_type
27
+
28
+ # == Attribute
29
+ # Attribute implements a nested key-value (Hash) and flat collection
30
+ # (Array) data structure supporting multiple levels of precedence, such
31
+ # that a given key may have multiple values internally, but will only
32
+ # return the highest precedence value when reading.
33
+ class Attribute < Mash
34
+
35
+ include Immutablize
39
36
 
40
37
  include Enumerable
41
38
 
42
- def initialize(normal, default, override, automatic, state=[])
43
- @normal = normal
44
- @current_normal = normal
45
- @default = default
46
- @current_default = default
47
- @override = override
48
- @current_override = override
49
- @automatic = automatic
50
- @current_automatic = automatic
51
- @current_nesting_level = state
52
- @auto_vivifiy_on_read = false
53
- @set_unless_value_present = false
54
- @set_type = nil
55
- @has_been_read = false
56
- end
57
-
58
- def attribute
59
- normal
60
- end
61
-
62
- def attribute=(value)
63
- normal = value
64
- end
65
-
66
- def set_type_hash
67
- case @set_type
68
- when :normal
69
- @normal
70
- when :override
71
- @override
72
- when :default
73
- @default
74
- when :automatic
75
- @automatic
76
- end
77
- end
78
-
79
- # Reset our internal current_nesting_level to the top of every tree
80
- def reset
81
- @current_normal = @normal
82
- @current_default = @default
83
- @current_override = @override
84
- @current_automatic = @automatic
85
- @has_been_read = false
86
- @current_nesting_level = []
87
- end
88
-
89
- def [](key)
90
- @current_nesting_level << key
91
-
92
- # We set this to so that we can cope with ||= as a setting.
93
- # See the comments in []= for more details.
94
- @has_been_read = true
95
-
96
- # If we have a set type, our destiny is to write
97
- if @set_type
98
- a_value = @set_type == :automatic ? value_or_descend(current_automatic, key, auto_vivifiy_on_read) : nil
99
- o_value = @set_type == :override ? value_or_descend(current_override, key, auto_vivifiy_on_read) : nil
100
- n_value = @set_type == :normal ? value_or_descend(current_normal, key, auto_vivifiy_on_read) : nil
101
- d_value = @set_type == :default ? value_or_descend(current_default, key, auto_vivifiy_on_read) : nil
102
-
103
- determine_value(a_value, o_value, n_value, d_value)
104
- # Our destiny is only to read, so we get the full list.
105
- else
106
- a_value = value_or_descend(current_automatic, key)
107
- o_value = value_or_descend(current_override, key)
108
- n_value = value_or_descend(current_normal, key)
109
- d_value = value_or_descend(current_default, key)
110
-
111
- determine_value(a_value, o_value, n_value, d_value)
112
- end
113
- end
114
-
115
- def has_key?(key)
116
- return true if component_has_key?(@default,key)
117
- return true if component_has_key?(@automatic,key)
118
- return true if component_has_key?(@normal,key)
119
- return true if component_has_key?(@override,key)
120
- false
121
- end
122
-
123
- alias :attribute? :has_key?
124
- alias :include? :has_key?
125
- alias :key? :has_key?
126
- alias :member? :has_key?
127
-
128
- def each(&block)
129
- get_keys.each do |key|
130
- value = determine_value(
131
- get_value(automatic, key),
132
- get_value(override, key),
133
- get_value(normal, key),
134
- get_value(default, key)
135
- )
136
- block.call([key, value])
137
- end
138
- end
139
-
140
- def each_pair(&block)
141
- get_keys.each do |key|
142
- value = determine_value(
143
- get_value(automatic, key),
144
- get_value(override, key),
145
- get_value(normal, key),
146
- get_value(default, key)
147
- )
148
- block.call(key, value)
149
- end
150
- end
151
-
152
- def each_attribute(&block)
153
- get_keys.each do |key|
154
- value = determine_value(
155
- get_value(automatic, key),
156
- get_value(override, key),
157
- get_value(normal, key),
158
- get_value(default, key)
159
- )
160
- block.call(key, value)
161
- end
162
- end
163
-
164
- def each_key(&block)
165
- get_keys.each do |key|
166
- block.call(key)
167
- end
168
- end
169
-
170
- def each_value(&block)
171
- get_keys.each do |key|
172
- value = determine_value(
173
- get_value(automatic, key),
174
- get_value(override, key),
175
- get_value(normal, key),
176
- get_value(default, key)
177
- )
178
- block.call(value)
179
- end
180
- end
181
-
182
- def empty?
183
- get_keys.empty?
184
- end
185
-
186
- def fetch(key, default_value=nil, &block)
187
- if get_keys.include? key
188
- determine_value(
189
- get_value(automatic, key),
190
- get_value(override, key),
191
- get_value(normal, key),
192
- get_value(default, key)
193
- )
194
- elsif default_value
195
- default_value
196
- elsif block_given?
197
- block.call(key)
198
- else
199
- raise IndexError, "Key #{key} does not exist"
200
- end
201
- end
202
-
203
- # Writing this method hurts me a little bit.
204
- #
205
- # TODO: Refactor all this stuff so this kind of horror is no longer needed
206
- #
207
- # We have invented a new kind of duck-typing, we call it Madoff typing.
208
- # We just lie and hope we die before you recognize our scheme. :)
209
- def kind_of?(klass)
210
- if klass == Hash || klass == Mash || klass == Chef::Node::Attribute
211
- true
212
- else
213
- false
214
- end
215
- end
216
-
217
- def has_value?(value)
218
- self.any? do |k,v|
219
- value == v
220
- end
221
- end
222
-
223
- alias :value? :has_value?
224
-
225
- def index(value)
226
- index = self.find do |h|
227
- value == h[1]
228
- end
229
- index.first if index.is_a? Array || nil
230
- end
231
-
232
- def values
233
- self.collect { |h| h[1] }
234
- end
235
-
236
- def size
237
- self.collect{}.length
238
- end
239
-
240
- alias :length :size
241
-
242
- def get_keys
243
- keys
244
- end
245
-
246
- def keys
247
- tkeys = current_automatic ? current_automatic.keys : []
248
- [ current_override, current_normal, current_default ].each do |attr_hash|
249
- if attr_hash
250
- attr_hash.keys.each do |key|
251
- tkeys << key unless tkeys.include?(key)
39
+ # List of the component attribute hashes, in order of precedence, low to
40
+ # high.
41
+ COMPONENTS = [
42
+ :@default,
43
+ :@env_default,
44
+ :@role_default,
45
+ :@force_default,
46
+ :@normal,
47
+ :@override,
48
+ :@role_override,
49
+ :@env_override,
50
+ :@force_override,
51
+ :@automatic
52
+ ].freeze
53
+
54
+ DEFAULT_COMPONENTS = [
55
+ :@default,
56
+ :@env_default,
57
+ :@role_default,
58
+ :@force_default
59
+ ]
60
+
61
+
62
+ OVERRIDE_COMPONENTS = [
63
+ :@override,
64
+ :@role_override,
65
+ :@env_override,
66
+ :@force_override
67
+ ]
68
+
69
+ [:all?,
70
+ :any?,
71
+ :assoc,
72
+ :chunk,
73
+ :collect,
74
+ :collect_concat,
75
+ :compare_by_identity,
76
+ :compare_by_identity?,
77
+ :count,
78
+ :cycle,
79
+ :detect,
80
+ :drop,
81
+ :drop_while,
82
+ :each,
83
+ :each_cons,
84
+ :each_entry,
85
+ :each_key,
86
+ :each_pair,
87
+ :each_slice,
88
+ :each_value,
89
+ :each_with_index,
90
+ :each_with_object,
91
+ :empty?,
92
+ :entries,
93
+ :except,
94
+ :fetch,
95
+ :find,
96
+ :find_all,
97
+ :find_index,
98
+ :first,
99
+ :flat_map,
100
+ :flatten,
101
+ :grep,
102
+ :group_by,
103
+ :has_value?,
104
+ :include?,
105
+ :index,
106
+ :inject,
107
+ :invert,
108
+ :key,
109
+ :keys,
110
+ :length,
111
+ :map,
112
+ :max,
113
+ :max_by,
114
+ :merge,
115
+ :min,
116
+ :min_by,
117
+ :minmax,
118
+ :minmax_by,
119
+ :none?,
120
+ :one?,
121
+ :partition,
122
+ :rassoc,
123
+ :reduce,
124
+ :reject,
125
+ :reverse_each,
126
+ :select,
127
+ :size,
128
+ :slice_before,
129
+ :sort,
130
+ :sort_by,
131
+ :store,
132
+ :symbolize_keys,
133
+ :take,
134
+ :take_while,
135
+ :to_a,
136
+ :to_hash,
137
+ :to_set,
138
+ :value?,
139
+ :values,
140
+ :values_at,
141
+ :zip].each do |delegated_method|
142
+ class_eval(<<-METHOD_DEFN)
143
+ def #{delegated_method}(*args, &block)
144
+ merged_attributes.send(:#{delegated_method}, *args, &block)
252
145
  end
253
- end
254
- end
255
- tkeys
256
- end
257
-
258
- def get_value(data_hash, key)
259
- last = nil
260
-
261
- if @current_nesting_level.length == 0
262
- if data_hash.has_key?(key) && ! data_hash[key].nil?
263
- return data_hash[key]
264
- else
265
- return nil
266
- end
267
- end
268
-
269
- 0.upto(@current_nesting_level.length) do |i|
270
- if i == 0
271
- last = auto_vivifiy(data_hash, @current_nesting_level[i])
272
- elsif i == @current_nesting_level.length
273
- fk = last[@current_nesting_level[i - 1]]
274
- if fk.has_key?(key) && ! fk[key].nil?
275
- return fk[key]
276
- else
277
- return nil
278
- end
279
- else
280
- last = auto_vivifiy(last[@current_nesting_level[i - 1]], @current_nesting_level[i])
281
- end
282
- end
283
- end
284
-
285
- def hash_and_not_cna?(to_check)
286
- (! to_check.kind_of?(Chef::Node::Attribute)) && to_check.respond_to?(:has_key?)
287
- end
288
-
289
- def determine_value(a_value, o_value, n_value, d_value)
290
- if hash_and_not_cna?(a_value)
291
- value = {}
292
- value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
293
- value = Chef::Mixin::DeepMerge.merge(value, n_value) if hash_and_not_cna?(n_value)
294
- value = Chef::Mixin::DeepMerge.merge(value, o_value) if hash_and_not_cna?(o_value)
295
- value = Chef::Mixin::DeepMerge.merge(value, a_value)
296
- value
297
- elsif hash_and_not_cna?(o_value)
298
- value = {}
299
- value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
300
- value = Chef::Mixin::DeepMerge.merge(value, n_value) if hash_and_not_cna?(n_value)
301
- value = Chef::Mixin::DeepMerge.merge(value, o_value)
302
- value
303
- elsif hash_and_not_cna?(n_value)
304
- value = {}
305
- value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
306
- value = Chef::Mixin::DeepMerge.merge(value, n_value)
307
- value
308
- elsif hash_and_not_cna?(d_value)
309
- d_value
310
- else
311
- return a_value if ! a_value.nil?
312
- return o_value if ! o_value.nil?
313
- return n_value if ! n_value.nil?
314
- return d_value if ! d_value.nil?
315
- return nil
316
- end
317
- end
318
-
319
- def []=(key, value)
320
- # If we don't have one, then we'll pretend we're normal
321
- if @set_type.nil?
322
- @set_type = :normal
323
- warning=<<-W
324
- Setting attributes without specifying a precedence is deprecated and will be
325
- removed in Chef 11.0. To set attributes at normal precedence, change code like:
326
- `node["key"] = "value"` # Not this
327
- to:
328
- `node.set["key"] = "value"` # This
329
-
330
- Called from:
331
- W
332
-
333
- warning_with_line_nrs = caller[0...3].inject(warning) do |msg, source_line|
334
- msg << " #{source_line}\n"
335
- end
336
-
337
- Chef::Log.warn(warning_with_line_nrs) if Chef::Config[:chef11_deprecation_warnings]
338
- end
339
-
340
- if set_unless_value_present
341
- if get_value(set_type_hash, key) != nil
342
- Chef::Log.debug("Not setting #{@current_nesting_level.join("/")}/#{key} to #{value.inspect} because it has a #{@set_type} value already")
343
- return false
344
- end
345
- end
346
-
347
- # If we have been read, and the key we are writing is the same
348
- # as our parent, we have most like been ||='ed. So we need to
349
- # just rewind a bit.
350
- #
351
- # In practice, these objects are single use - this is just
352
- # supporting one more single-use style.
353
- @current_nesting_level.pop if @has_been_read && @current_nesting_level.last == key
354
-
355
- set_value(set_type_hash, key, value)
356
- value
357
- end
358
-
359
- def set_value(data_hash, key, value)
360
- last = nil
361
-
362
- # If there is no current_nesting_level, just set the value
363
- if @current_nesting_level.length == 0
364
- data_hash[key] = value
365
- return data_hash
366
- end
367
-
368
- # Walk all the previous places we have been
369
- 0.upto(@current_nesting_level.length) do |i|
370
- # If we are the first, we are top level, and should vivifiy the data_hash
371
- if i == 0
372
- last = auto_vivifiy(data_hash, @current_nesting_level[i])
373
- # If we are one past the last current_nesting_level, we are adding a key to that hash with a value
374
- elsif i == @current_nesting_level.length
375
- last[@current_nesting_level[i - 1]][key] = value
376
- # Otherwise, we're auto-vivifiy-ing an interim mash
377
- else
378
- last = auto_vivifiy(last[@current_nesting_level[i - 1]], @current_nesting_level[i])
379
- end
380
- end
381
- data_hash
382
- end
383
-
384
- def auto_vivifiy_on_read?
385
- auto_vivifiy_on_read
386
- end
387
-
388
- def auto_vivifiy(data_hash, key)
389
- if data_hash.has_key?(key)
390
- unless data_hash[key].respond_to?(:has_key?)
391
- raise ArgumentError, "You tried to set a nested key, where the parent is not a hash-like object: #{@current_nesting_level.join("/")}/#{key} " unless auto_vivifiy_on_read
392
- end
393
- else
394
- data_hash[key] = Mash.new
395
- end
396
- data_hash
397
- end
398
-
399
- def value_or_descend(data_hash, key, auto_vivifiy=false)
400
- if auto_vivifiy
401
- hash_to_vivifiy = auto_vivifiy(data_hash, key)
402
- data_hash[key] = hash_to_vivifiy[key]
403
- else
404
- return nil if data_hash == nil
405
- return nil unless data_hash.has_key?(key)
406
- end
407
-
408
- if data_hash[key].respond_to?(:has_key?)
409
- cna = Chef::Node::Attribute.new(@normal, @default, @override, @automatic, @current_nesting_level)
410
- cna.current_normal = current_normal.nil? ? Mash.new : current_normal[key]
411
- cna.current_default = current_default.nil? ? Mash.new : current_default[key]
412
- cna.current_override = current_override.nil? ? Mash.new : current_override[key]
413
- cna.current_automatic = current_automatic.nil? ? Mash.new : current_automatic[key]
414
- cna.auto_vivifiy_on_read = auto_vivifiy_on_read
415
- cna.set_unless_value_present = set_unless_value_present
416
- cna.set_type = set_type
417
- cna
418
- else
419
- data_hash[key]
420
- end
421
- end
422
-
423
- # Fetches or sets the value, depending on if any arguments are given.
424
- # ==== Fetching
425
- # If no arguments are given, fetches the value:
426
- # node.network
427
- # => {network data}
428
- # Getters will find either a string or symbol key.
429
- # ==== Setting
430
- # If arguments are given, a value will be set. Both normal setter and DSL
431
- # style setters are allowed:
432
- # node.foo = "bar"
433
- # node.foo("bar")
434
- # Both set node[:foo] = "bar"
435
- def method_missing(symbol, *args)
436
- if args.empty?
437
- if key?(symbol)
438
- self[symbol]
439
- elsif key?(symbol.to_s)
440
- self[symbol.to_s]
441
- elsif auto_vivifiy_on_read?
442
- self[symbol] = Mash.new
443
- self[symbol]
444
- else
445
- raise ArgumentError, "Attribute #{symbol} is not defined!" unless auto_vivifiy_on_read
446
- end
447
- else
448
- key_to_set = symbol.to_s[/^(.+)=$/, 1] || symbol
449
- self[key_to_set] = (args.length == 1 ? args[0] : args)
450
- end
451
- end
452
-
453
- def inspect
454
- determine_value(current_automatic, current_override, current_normal, current_default)
455
-
456
- "#<#{self.class} " << instance_variables.map{|iv|
457
- iv.to_s + '=' + (HIDDEN_ATTRIBUES.include?(iv.to_sym) ? "{...}" : instance_variable_get(iv).inspect)
458
- }.join(', ') << ">"
459
- end
460
-
461
- def to_hash
462
- result = determine_value(current_automatic, current_override, current_normal, current_default)
463
- if result.class == Hash
464
- result
465
- else
466
- result.to_hash
467
- end
468
- end
469
-
470
- def delete(key)
471
- [@automatic, @override, @normal, @default].inject(nil) do |return_value, attrs|
472
- deleted_value = delete_from_component(attrs, key)
473
- return_value || deleted_value
474
- end
475
- end
476
-
477
- def delete_from_component(component_attrs, key)
478
- # get the Hash-like object at the current nesting level:
479
- nested_attrs = value_at_current_nesting(component_attrs, key)
480
-
481
- if nested_attrs.respond_to?(:delete)
482
- nested_attrs.delete(key)
483
- else
484
- nil
485
- end
486
- end
487
-
488
- def component_has_key?(component_attrs,key)
489
- # get the Hash-like object at the current nesting level:
490
- nested_attrs = value_at_current_nesting(component_attrs, key)
491
- nested_attrs.respond_to?(:key?) && nested_attrs.key?(key)
492
- end
493
-
494
- def value_at_current_nesting(component_attrs, key)
495
- @current_nesting_level.inject(component_attrs) do |subtree, intermediate_key|
496
- # if the intermediate value isn't a hash or doesn't have the intermediate key,
497
- # it can't have the bottom-level key we're looking for.
498
- (subtree.respond_to?(:key?) && subtree[intermediate_key]) or (return false)
499
- end
500
- end
146
+ METHOD_DEFN
147
+ end
148
+
149
+
150
+ # return the cookbook level default attribute component
151
+ attr_reader :default
152
+
153
+ # return the role level default attribute component
154
+ attr_reader :role_default
155
+
156
+ # return the environment level default attribute component
157
+ attr_reader :env_default
158
+
159
+ # return the force_default level attribute component
160
+ attr_reader :force_default
161
+
162
+ # default! is the "advertised" method for force_default, but is
163
+ # implemented as an alias because instance variables can't (easily) have
164
+ # +!+ characters.
165
+ alias :default! :force_default
166
+
167
+ # return the "normal" level attribute component
168
+ attr_reader :normal
169
+
170
+ # return the cookbook level override attribute component
171
+ attr_reader :override
172
+
173
+ # return the role level override attribute component
174
+ attr_reader :role_override
175
+
176
+ # return the enviroment level override attribute component
177
+ attr_reader :env_override
178
+
179
+ # return the force override level attribute component
180
+ attr_reader :force_override
181
+
182
+ # +override!+ is the "advertised" method for +force_override+ but is
183
+ # implemented as an alias because instance variables can't easily have
184
+ # +!+ characters.
185
+ alias :override! :force_override
186
+
187
+ # return the automatic level attribute component
188
+ attr_reader :automatic
189
+
190
+ def initialize(normal, default, override, automatic)
191
+ @set_unless_present = false
192
+
193
+ @default = VividMash.new(self, default)
194
+ @env_default = VividMash.new(self, {})
195
+ @role_default = VividMash.new(self, {})
196
+ @force_default = VividMash.new(self, {})
197
+
198
+ @normal = VividMash.new(self, normal)
199
+
200
+ @override = VividMash.new(self, override)
201
+ @role_override = VividMash.new(self, {})
202
+ @env_override = VividMash.new(self, {})
203
+ @force_override = VividMash.new(self, {})
204
+
205
+ @automatic = VividMash.new(self, automatic)
206
+
207
+ @merged_attributes = nil
208
+ @combined_override = nil
209
+ @combined_default = nil
210
+ end
211
+
212
+ # Debug what's going on with an attribute. +args+ is a path spec to the
213
+ # attribute you're interested in. For example, to debug where the value
214
+ # of `node[:network][:default_interface]` is coming from, use:
215
+ # debug_value(:network, :default_interface).
216
+ # The return value is an Array of Arrays. The first element is
217
+ # `["set_unless_enabled?", Boolean]`, which describes whether the
218
+ # attribute collection is in "set_unless" mode. The rest of the Arrays
219
+ # are pairs of `["precedence_level", value]`, where precedence level is
220
+ # the component, such as role default, normal, etc. and value is the
221
+ # attribute value set at that precedence level. If there is no value at
222
+ # that precedence level, +value+ will be the symbol +:not_present+.
223
+ def debug_value(*args)
224
+ components = COMPONENTS.map do |component|
225
+ ivar = instance_variable_get(component)
226
+ value = args.inject(ivar) do |so_far, key|
227
+ if so_far == :not_present
228
+ :not_present
229
+ elsif so_far.has_key?(key)
230
+ so_far[key]
231
+ else
232
+ :not_present
233
+ end
234
+ end
235
+ [component.to_s.sub(/^@/,""), value]
236
+ end
237
+ [["set_unless_enabled?", @set_unless_present]] + components
238
+ end
239
+
240
+ # Enables or disables `||=`-like attribute setting. See, e.g., Node#set_unless
241
+ def set_unless_value_present=(setting)
242
+ @set_unless_present = setting
243
+ end
244
+
245
+ # Clears merged_attributes, which will cause it to be recomputed on the
246
+ # next access.
247
+ def reset_cache
248
+ @merged_attributes = nil
249
+ @combined_default = nil
250
+ @combined_override = nil
251
+ @set_unless_present = false
252
+ end
253
+
254
+ alias :reset :reset_cache
255
+
256
+ # Set the cookbook level default attribute component to +new_data+.
257
+ def default=(new_data)
258
+ reset
259
+ @default = VividMash.new(self, new_data)
260
+ end
261
+
262
+ # Set the role level default attribute component to +new_data+
263
+ def role_default=(new_data)
264
+ reset
265
+ @role_default = VividMash.new(self, new_data)
266
+ end
267
+
268
+ # Set the environment level default attribute component to +new_data+
269
+ def env_default=(new_data)
270
+ reset
271
+ @env_default = VividMash.new(self, new_data)
272
+ end
273
+
274
+ # Set the force_default (+default!+) level attributes to +new_data+
275
+ def force_default=(new_data)
276
+ reset
277
+ @force_default = VividMash.new(self, new_data)
278
+ end
279
+
280
+ # Set the normal level attribute component to +new_data+
281
+ def normal=(new_data)
282
+ reset
283
+ @normal = VividMash.new(self, new_data)
284
+ end
285
+
286
+ # Set the cookbook level override attribute component to +new_data+
287
+ def override=(new_data)
288
+ reset
289
+ @override = VividMash.new(self, new_data)
290
+ end
291
+
292
+ # Set the role level override attribute component to +new_data+
293
+ def role_override=(new_data)
294
+ reset
295
+ @role_override = VividMash.new(self, new_data)
296
+ end
297
+
298
+ # Set the environment level override attribute component to +new_data+
299
+ def env_override=(new_data)
300
+ reset
301
+ @env_override = VividMash.new(self, new_data)
302
+ end
303
+
304
+ def force_override=(new_data)
305
+ reset
306
+ @force_override = VividMash.new(self, new_data)
307
+ end
308
+
309
+ def automatic=(new_data)
310
+ reset
311
+ @automatic = VividMash.new(self, new_data)
312
+ end
313
+
314
+ def merged_attributes
315
+ @merged_attributes ||= begin
316
+ components = [merge_defaults, @normal, merge_overrides, @automatic]
317
+ resolved_attrs = components.inject(Mash.new) do |merged, component|
318
+ Chef::Mixin::DeepMerge.hash_only_merge(merged, component)
319
+ end
320
+ immutablize(resolved_attrs)
321
+ end
322
+ end
323
+
324
+ def combined_override
325
+ @combined_override ||= immutablize(merge_overrides)
326
+ end
327
+
328
+ def combined_default
329
+ @combined_default ||= immutablize(merge_defaults)
330
+ end
331
+
332
+ def [](key)
333
+ merged_attributes[key]
334
+ end
335
+
336
+ def []=(key, value)
337
+ merged_attributes[key] = value
338
+ end
339
+
340
+ def has_key?(key)
341
+ COMPONENTS.any? do |component_ivar|
342
+ instance_variable_get(component_ivar).has_key?(key)
343
+ end
344
+ end
345
+
346
+ alias :attribute? :has_key?
347
+ alias :member? :has_key?
348
+ alias :include? :has_key?
349
+ alias :key? :has_key?
350
+
351
+ alias :each_attribute :each
352
+
353
+ def method_missing(symbol, *args)
354
+ if args.empty?
355
+ if key?(symbol)
356
+ self[symbol]
357
+ else
358
+ raise NoMethodError, "Undefined method or attribute `#{symbol}' on `node'"
359
+ end
360
+ elsif symbol.to_s =~ /=$/
361
+ key_to_set = symbol.to_s[/^(.+)=$/, 1]
362
+ self[key_to_set] = (args.length == 1 ? args[0] : args)
363
+ else
364
+ raise NoMethodError, "Undefined node attribute or method `#{symbol}' on `node'"
365
+ end
366
+ end
367
+
368
+ def inspect
369
+ "#<#{self.class} " << (COMPONENTS + [:@merged_attributes, :@properties]).map{|iv|
370
+ "#{iv}=#{instance_variable_get(iv).inspect}"
371
+ }.join(', ') << ">"
372
+ end
373
+
374
+ def set_unless?
375
+ @set_unless_present
376
+ end
377
+
378
+ private
379
+
380
+ def merge_defaults
381
+ DEFAULT_COMPONENTS.inject(Mash.new) do |merged, component_ivar|
382
+ component_value = instance_variable_get(component_ivar)
383
+ Chef::Mixin::DeepMerge.merge(merged, component_value)
384
+ end
385
+ end
386
+
387
+ def merge_overrides
388
+ OVERRIDE_COMPONENTS.inject(Mash.new) do |merged, component_ivar|
389
+ component_value = instance_variable_get(component_ivar)
390
+ Chef::Mixin::DeepMerge.merge(merged, component_value)
391
+ end
392
+ end
393
+
501
394
 
502
395
  end
396
+
503
397
  end
504
398
  end