chef 10.34.6 → 11.0.0.beta.0

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 (506) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +4 -12
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/shef +6 -5
  7. data/distro/common/html/chef-client.8.html +4 -4
  8. data/distro/common/html/chef-expander.8.html +4 -4
  9. data/distro/common/html/chef-expanderctl.8.html +4 -4
  10. data/distro/common/html/chef-server-webui.8.html +4 -4
  11. data/distro/common/html/chef-server.8.html +4 -4
  12. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  13. data/distro/common/html/chef-solo.8.html +18 -12
  14. data/distro/common/html/chef-solr.8.html +4 -4
  15. data/distro/common/html/knife-bootstrap.1.html +4 -4
  16. data/distro/common/html/knife-client.1.html +4 -4
  17. data/distro/common/html/knife-configure.1.html +4 -4
  18. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  19. data/distro/common/html/knife-cookbook.1.html +10 -7
  20. data/distro/common/html/knife-data-bag.1.html +10 -7
  21. data/distro/common/html/knife-environment.1.html +8 -6
  22. data/distro/common/html/knife-exec.1.html +9 -9
  23. data/distro/common/html/knife-index.1.html +4 -4
  24. data/distro/common/html/knife-node.1.html +4 -4
  25. data/distro/common/html/knife-role.1.html +4 -4
  26. data/distro/common/html/knife-search.1.html +4 -4
  27. data/distro/common/html/knife-ssh.1.html +4 -4
  28. data/distro/common/html/knife-status.1.html +4 -4
  29. data/distro/common/html/knife-tag.1.html +4 -4
  30. data/distro/common/html/knife.1.html +8 -13
  31. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  32. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  33. data/distro/common/man/man1/knife-client.1 +1 -1
  34. data/distro/common/man/man1/knife-configure.1 +1 -1
  35. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  36. data/distro/common/man/man1/knife-cookbook.1 +15 -2
  37. data/distro/common/man/man1/knife-data-bag.1 +15 -2
  38. data/distro/common/man/man1/knife-environment.1 +12 -2
  39. data/distro/common/man/man1/knife-exec.1 +4 -7
  40. data/distro/common/man/man1/knife-index.1 +1 -1
  41. data/distro/common/man/man1/knife-node.1 +1 -1
  42. data/distro/common/man/man1/knife-role.1 +1 -1
  43. data/distro/common/man/man1/knife-search.1 +1 -1
  44. data/distro/common/man/man1/knife-ssh.1 +1 -1
  45. data/distro/common/man/man1/knife-status.1 +1 -1
  46. data/distro/common/man/man1/knife-tag.1 +1 -1
  47. data/distro/common/man/man1/knife.1 +3 -6
  48. data/distro/common/man/man8/chef-client.8 +1 -1
  49. data/distro/common/man/man8/chef-expander.8 +1 -1
  50. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  51. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  52. data/distro/common/man/man8/chef-server.8 +1 -1
  53. data/distro/common/man/man8/chef-solo.8 +36 -4
  54. data/distro/common/man/man8/chef-solr.8 +1 -1
  55. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  56. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  57. data/distro/common/markdown/man1/knife.mkd +4 -9
  58. data/distro/debian/etc/default/chef-client +0 -1
  59. data/distro/debian/etc/init.d/chef-client +2 -2
  60. data/lib/chef.rb +2 -5
  61. data/lib/chef/api_client.rb +20 -130
  62. data/lib/chef/api_client/registration.rb +126 -0
  63. data/lib/chef/application.rb +71 -14
  64. data/lib/chef/application/apply.rb +160 -0
  65. data/lib/chef/application/client.rb +25 -18
  66. data/lib/chef/application/knife.rb +0 -2
  67. data/lib/chef/application/solo.rb +23 -8
  68. data/lib/chef/application/windows_service.rb +5 -2
  69. data/lib/chef/applications.rb +1 -0
  70. data/lib/chef/chef_fs.rb +11 -0
  71. data/lib/chef/chef_fs/command_line.rb +232 -0
  72. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  73. data/lib/chef/chef_fs/file_system.rb +358 -0
  74. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  75. data/lib/chef/chef_fs/file_system/base_fs_object.rb +121 -0
  76. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +109 -0
  77. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb} +12 -15
  78. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +84 -0
  79. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +188 -0
  80. data/lib/chef/chef_fs/file_system/cookbook_file.rb +78 -0
  81. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  82. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +68 -0
  83. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +78 -0
  84. data/lib/chef/chef_fs/file_system/data_bag_item.rb +59 -0
  85. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +66 -0
  86. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  87. data/lib/chef/{index_queue.rb → chef_fs/file_system/file_system_error.rb} +14 -12
  88. data/lib/chef/{resource/whyrun_safe_ruby_block.rb → chef_fs/file_system/file_system_root_dir.rb} +10 -10
  89. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  90. data/lib/chef/chef_fs/file_system/nodes_dir.rb +47 -0
  91. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → chef_fs/file_system/nonexistent_fs_object.rb} +19 -9
  92. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +84 -0
  94. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +123 -0
  95. data/lib/chef/chef_fs/knife.rb +77 -0
  96. data/lib/chef/chef_fs/path_utils.rb +64 -0
  97. data/lib/chef/client.rb +44 -21
  98. data/lib/chef/config.rb +52 -43
  99. data/lib/chef/cookbook/synchronizer.rb +6 -8
  100. data/lib/chef/cookbook/syntax_check.rb +61 -14
  101. data/lib/chef/cookbook_loader.rb +39 -26
  102. data/lib/chef/cookbook_uploader.rb +17 -19
  103. data/lib/chef/cookbook_version.rb +3 -302
  104. data/lib/chef/daemon.rb +3 -18
  105. data/lib/chef/data_bag.rb +4 -97
  106. data/lib/chef/data_bag_item.rb +2 -65
  107. data/lib/chef/digester.rb +73 -0
  108. data/lib/chef/dsl.rb +6 -0
  109. data/lib/chef/dsl/data_query.rb +66 -0
  110. data/lib/chef/dsl/include_attribute.rb +60 -0
  111. data/lib/chef/dsl/include_recipe.rb +42 -0
  112. data/lib/chef/dsl/platform_introspection.rb +213 -0
  113. data/lib/chef/dsl/recipe.rb +84 -0
  114. data/lib/chef/dsl/registry_helper.rb +59 -0
  115. data/lib/chef/encrypted_data_bag_item.rb +74 -19
  116. data/lib/chef/environment.rb +9 -180
  117. data/lib/chef/exceptions.rb +87 -14
  118. data/lib/chef/formatters/base.rb +4 -1
  119. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +0 -4
  120. data/lib/chef/json_compat.rb +1 -97
  121. data/lib/chef/knife.rb +90 -41
  122. data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
  123. data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
  124. data/lib/chef/knife/bootstrap/chef-full.erb +3 -3
  125. data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
  126. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  127. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
  128. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
  129. data/lib/chef/knife/configure.rb +1 -2
  130. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  131. data/lib/chef/knife/cookbook_test.rb +3 -2
  132. data/lib/chef/knife/cookbook_upload.rb +12 -7
  133. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  134. data/lib/chef/knife/core/generic_presenter.rb +26 -13
  135. data/lib/chef/knife/core/node_editor.rb +36 -16
  136. data/lib/chef/knife/core/node_presenter.rb +1 -1
  137. data/lib/chef/knife/core/text_formatter.rb +23 -37
  138. data/lib/chef/knife/core/ui.rb +15 -9
  139. data/lib/chef/knife/delete.rb +39 -0
  140. data/lib/chef/knife/diff.rb +46 -0
  141. data/lib/chef/knife/download.rb +50 -0
  142. data/lib/chef/knife/environment_show.rb +7 -0
  143. data/lib/chef/knife/exec.rb +5 -5
  144. data/lib/chef/knife/help_topics.rb +1 -1
  145. data/lib/chef/knife/index_rebuild.rb +91 -7
  146. data/lib/chef/knife/list.rb +109 -0
  147. data/lib/chef/knife/raw.rb +108 -0
  148. data/lib/chef/knife/search.rb +40 -22
  149. data/lib/chef/knife/show.rb +32 -0
  150. data/lib/chef/knife/ssh.rb +6 -2
  151. data/lib/chef/knife/upload.rb +50 -0
  152. data/lib/chef/mixin/checksum.rb +3 -3
  153. data/lib/chef/mixin/deep_merge.rb +55 -197
  154. data/lib/chef/mixin/language.rb +9 -222
  155. data/lib/chef/mixin/language_include_attribute.rb +6 -38
  156. data/lib/chef/mixin/language_include_recipe.rb +3 -35
  157. data/lib/chef/mixin/params_validate.rb +6 -19
  158. data/lib/chef/mixin/recipe_definition_dsl_core.rb +8 -61
  159. data/lib/chef/mixin/securable.rb +32 -7
  160. data/lib/chef/mixin/template.rb +40 -0
  161. data/lib/chef/mixins.rb +0 -4
  162. data/lib/chef/monkey_patches/net_http.rb +0 -34
  163. data/lib/chef/node.rb +133 -309
  164. data/lib/chef/node/attribute.rb +333 -473
  165. data/lib/chef/node/attribute_collections.rb +199 -0
  166. data/lib/chef/node/immutable_collections.rb +186 -0
  167. data/lib/chef/platform.rb +7 -22
  168. data/lib/chef/provider.rb +2 -49
  169. data/lib/chef/provider/breakpoint.rb +6 -6
  170. data/lib/chef/provider/cookbook_file.rb +5 -33
  171. data/lib/chef/provider/deploy.rb +2 -1
  172. data/lib/chef/provider/directory.rb +14 -17
  173. data/lib/chef/provider/file.rb +19 -52
  174. data/lib/chef/provider/group.rb +31 -51
  175. data/lib/chef/provider/group/dscl.rb +13 -53
  176. data/lib/chef/provider/group/gpasswd.rb +19 -14
  177. data/lib/chef/provider/group/groupadd.rb +1 -41
  178. data/lib/chef/provider/group/groupmod.rb +36 -46
  179. data/lib/chef/provider/group/pw.rb +16 -59
  180. data/lib/chef/provider/group/suse.rb +13 -16
  181. data/lib/chef/provider/group/usermod.rb +18 -40
  182. data/lib/chef/provider/group/windows.rb +6 -13
  183. data/lib/chef/provider/http_request.rb +25 -42
  184. data/lib/chef/provider/link.rb +2 -0
  185. data/lib/chef/provider/lwrp_base.rb +150 -0
  186. data/lib/chef/provider/package/portage.rb +4 -9
  187. data/lib/chef/provider/package/rpm.rb +2 -2
  188. data/lib/chef/provider/package/rubygems.rb +9 -41
  189. data/lib/chef/provider/package/yum.rb +12 -19
  190. data/lib/chef/provider/registry_key.rb +156 -0
  191. data/lib/chef/provider/remote_directory.rb +2 -0
  192. data/lib/chef/provider/remote_file.rb +21 -12
  193. data/lib/chef/provider/ruby_block.rb +5 -2
  194. data/lib/chef/provider/service.rb +15 -0
  195. data/lib/chef/provider/service/init.rb +9 -7
  196. data/lib/chef/provider/service/macosx.rb +15 -73
  197. data/lib/chef/provider/service/simple.rb +1 -1
  198. data/lib/chef/provider/service/solaris.rb +3 -3
  199. data/lib/chef/provider/template.rb +22 -25
  200. data/lib/chef/provider/template_finder.rb +61 -0
  201. data/lib/chef/provider/user.rb +0 -1
  202. data/lib/chef/provider/user/dscl.rb +175 -568
  203. data/lib/chef/provider/user/useradd.rb +30 -47
  204. data/lib/chef/providers.rb +3 -2
  205. data/lib/chef/recipe.rb +14 -8
  206. data/lib/chef/resource.rb +13 -154
  207. data/lib/chef/resource/group.rb +1 -11
  208. data/lib/chef/resource/http_request.rb +2 -1
  209. data/lib/chef/resource/lwrp_base.rb +127 -0
  210. data/lib/chef/resource/mount.rb +10 -11
  211. data/lib/chef/resource/registry_key.rb +86 -0
  212. data/lib/chef/resource/remote_directory.rb +6 -5
  213. data/lib/chef/resource/remote_file.rb +22 -31
  214. data/lib/chef/resource/ruby_block.rb +2 -2
  215. data/lib/chef/resource/service.rb +14 -0
  216. data/lib/chef/resource/user.rb +0 -18
  217. data/lib/chef/resource_collection.rb +25 -21
  218. data/lib/chef/resources.rb +2 -1
  219. data/lib/chef/rest.rb +50 -131
  220. data/lib/chef/rest/auth_credentials.rb +4 -20
  221. data/lib/chef/rest/rest_request.rb +2 -7
  222. data/lib/chef/role.rb +1 -97
  223. data/lib/chef/run_context.rb +108 -130
  224. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  225. data/lib/chef/run_list.rb +0 -2
  226. data/lib/chef/run_list/run_list_expansion.rb +0 -15
  227. data/lib/chef/run_lock.rb +90 -0
  228. data/lib/chef/runner.rb +28 -5
  229. data/lib/chef/sandbox.rb +15 -148
  230. data/lib/chef/scan_access_control.rb +2 -4
  231. data/lib/chef/shef/ext.rb +3 -575
  232. data/lib/chef/{shef.rb → shell.rb} +35 -40
  233. data/lib/chef/shell/ext.rb +593 -0
  234. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  235. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  236. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +17 -15
  237. data/lib/chef/shell_out.rb +7 -0
  238. data/lib/chef/util/windows/net_group.rb +1 -5
  239. data/lib/chef/version.rb +3 -3
  240. data/lib/chef/win32/api/process.rb +0 -1
  241. data/lib/chef/win32/handle.rb +1 -8
  242. data/lib/chef/win32/registry.rb +371 -0
  243. data/spec/data/big_json.json +1 -2
  244. data/spec/data/big_json_plus_one.json +1 -2
  245. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  246. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  247. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  248. data/spec/data/nodes/default.rb +3 -3
  249. data/spec/data/nodes/test.example.com.rb +3 -3
  250. data/spec/data/nodes/test.rb +3 -3
  251. data/spec/data/partial_one.erb +1 -0
  252. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  253. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  254. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  255. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  256. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  257. data/spec/data/{knife-home/.chef/plugins/knife/example_home_subcommand.rb → run_context/cookbooks/circular-dep1/recipes/default.rb} +0 -0
  258. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  259. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  260. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  261. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  262. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  263. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  264. data/spec/data/{lwrp_const_scoping/resources/conflict.rb → run_context/cookbooks/circular-dep2/recipes/default.rb} +0 -0
  265. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  266. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  267. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  268. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  269. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  270. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  271. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  272. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  273. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  274. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  275. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  276. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  277. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  278. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  279. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  280. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  281. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  282. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  283. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  284. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  285. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  286. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  287. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  288. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  289. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  290. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  291. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  292. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  293. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  294. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  295. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  296. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  297. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  298. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  299. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  300. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  301. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  302. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  303. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  304. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  305. data/spec/data/shef-config.rb +7 -0
  306. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  307. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  308. data/spec/functional/knife/exec_spec.rb +2 -2
  309. data/spec/functional/knife/ssh_spec.rb +5 -1
  310. data/spec/functional/resource/cookbook_file_spec.rb +7 -19
  311. data/spec/functional/resource/directory_spec.rb +4 -0
  312. data/spec/functional/resource/file_spec.rb +56 -22
  313. data/spec/functional/resource/link_spec.rb +2 -0
  314. data/spec/functional/resource/registry_spec.rb +576 -0
  315. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  316. data/spec/functional/resource/remote_file_spec.rb +18 -0
  317. data/spec/functional/resource/template_spec.rb +23 -2
  318. data/spec/functional/run_lock_spec.rb +106 -0
  319. data/spec/functional/shell_spec.rb +100 -0
  320. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  321. data/spec/spec_helper.rb +5 -29
  322. data/spec/stress/win32/security_spec.rb +1 -1
  323. data/spec/support/chef_helpers.rb +0 -2
  324. data/spec/support/platform_helpers.rb +8 -15
  325. data/spec/support/shared/functional/directory_resource.rb +84 -22
  326. data/spec/support/shared/functional/file_resource.rb +169 -71
  327. data/spec/support/shared/functional/securable_resource.rb +143 -119
  328. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  329. data/spec/support/shared/unit/file_system_support.rb +110 -0
  330. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  331. data/spec/unit/api_client/registration_spec.rb +175 -0
  332. data/spec/unit/api_client_spec.rb +78 -156
  333. data/spec/unit/application/apply.rb +84 -0
  334. data/spec/unit/application/client_spec.rb +1 -37
  335. data/spec/unit/application/knife_spec.rb +5 -0
  336. data/spec/unit/application_spec.rb +57 -2
  337. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  338. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  339. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  340. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  341. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  342. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  343. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  344. data/spec/unit/client_spec.rb +124 -33
  345. data/spec/unit/config_spec.rb +46 -13
  346. data/spec/unit/cookbook/synchronizer_spec.rb +1 -49
  347. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  348. data/spec/unit/cookbook_loader_spec.rb +153 -91
  349. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  350. data/spec/unit/cookbook_spec.rb +3 -20
  351. data/spec/unit/cookbook_version_spec.rb +23 -122
  352. data/spec/unit/daemon_spec.rb +3 -24
  353. data/spec/unit/data_bag_spec.rb +6 -4
  354. data/spec/unit/digester_spec.rb +50 -0
  355. data/spec/unit/dsl/data_query_spec.rb +66 -0
  356. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  357. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  358. data/spec/unit/encrypted_data_bag_item_spec.rb +50 -105
  359. data/spec/unit/environment_spec.rb +0 -130
  360. data/spec/unit/exceptions_spec.rb +2 -3
  361. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -3
  362. data/spec/unit/json_compat_spec.rb +15 -7
  363. data/spec/unit/knife/bootstrap_spec.rb +2 -0
  364. data/spec/unit/knife/configure_spec.rb +20 -14
  365. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  366. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  367. data/spec/unit/knife/cookbook_upload_spec.rb +43 -8
  368. data/spec/unit/knife/core/bootstrap_context_spec.rb +1 -1
  369. data/spec/unit/knife/core/ui_spec.rb +156 -125
  370. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  371. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  372. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  373. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  374. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  375. data/spec/unit/knife/knife_help.rb +7 -7
  376. data/spec/unit/knife/node_edit_spec.rb +6 -33
  377. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  378. data/spec/unit/knife/ssh_spec.rb +12 -15
  379. data/spec/unit/knife/status_spec.rb +2 -2
  380. data/spec/unit/knife_spec.rb +53 -0
  381. data/spec/unit/lwrp_spec.rb +59 -42
  382. data/spec/unit/mixin/checksum_spec.rb +2 -2
  383. data/spec/unit/mixin/deep_merge_spec.rb +101 -799
  384. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  385. data/spec/unit/mixin/params_validate_spec.rb +4 -37
  386. data/spec/unit/mixin/securable_spec.rb +5 -3
  387. data/spec/unit/mixin/template_spec.rb +119 -0
  388. data/spec/unit/node/attribute_spec.rb +195 -173
  389. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  390. data/spec/unit/node_spec.rb +366 -370
  391. data/spec/unit/platform_spec.rb +9 -10
  392. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  393. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  394. data/spec/unit/provider/directory_spec.rb +96 -64
  395. data/spec/unit/provider/env_spec.rb +2 -2
  396. data/spec/unit/provider/file_spec.rb +48 -39
  397. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  398. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  399. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  400. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  401. data/spec/unit/provider/group/pw_spec.rb +15 -12
  402. data/spec/unit/provider/group/usermod_spec.rb +6 -21
  403. data/spec/unit/provider/group/windows_spec.rb +8 -0
  404. data/spec/unit/provider/group_spec.rb +6 -28
  405. data/spec/unit/provider/http_request_spec.rb +28 -69
  406. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  407. data/spec/unit/provider/ohai_spec.rb +4 -4
  408. data/spec/unit/provider/package/apt_spec.rb +0 -1
  409. data/spec/unit/provider/package/ips_spec.rb +0 -1
  410. data/spec/unit/provider/package/portage_spec.rb +0 -44
  411. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  412. data/spec/unit/provider/package/rubygems_spec.rb +1 -44
  413. data/spec/unit/provider/package/yum_spec.rb +39 -36
  414. data/spec/unit/provider/package_spec.rb +7 -5
  415. data/spec/unit/provider/registry_key_spec.rb +269 -0
  416. data/spec/unit/provider/remote_directory_spec.rb +7 -3
  417. data/spec/unit/provider/remote_file_spec.rb +36 -0
  418. data/spec/unit/provider/route_spec.rb +4 -3
  419. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  420. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  421. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  422. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  423. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  424. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  425. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  426. data/spec/unit/provider/service/macosx_spec.rb +11 -66
  427. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  428. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  429. data/spec/unit/provider/service/upstart_service_spec.rb +9 -9
  430. data/spec/unit/provider/subversion_spec.rb +1 -1
  431. data/spec/unit/provider/template_spec.rb +35 -11
  432. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  433. data/spec/unit/provider/user/useradd_spec.rb +1 -22
  434. data/spec/unit/provider/user_spec.rb +1 -1
  435. data/spec/unit/recipe_spec.rb +10 -8
  436. data/spec/unit/registry_helper_spec.rb +374 -0
  437. data/spec/unit/resource/mount_spec.rb +0 -11
  438. data/spec/unit/resource/registry_key_spec.rb +171 -0
  439. data/spec/unit/resource/remote_file_spec.rb +21 -23
  440. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  441. data/spec/unit/resource/service_spec.rb +11 -0
  442. data/spec/unit/resource_spec.rb +4 -19
  443. data/spec/unit/rest/auth_credentials_spec.rb +2 -19
  444. data/spec/unit/rest_spec.rb +130 -284
  445. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  446. data/spec/unit/run_context_spec.rb +18 -4
  447. data/spec/unit/run_list_spec.rb +0 -209
  448. data/spec/unit/run_lock_spec.rb +37 -0
  449. data/spec/unit/runner_spec.rb +101 -2
  450. data/spec/unit/scan_access_control_spec.rb +4 -4
  451. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  452. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  453. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +14 -69
  454. data/spec/unit/shell_out_spec.rb +18 -0
  455. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  456. metadata +275 -234
  457. checksums.yaml +0 -15
  458. data/README.rdoc +0 -177
  459. data/distro/common/html/knife-recipe.1.html +0 -92
  460. data/lib/chef/certificate.rb +0 -161
  461. data/lib/chef/checksum.rb +0 -167
  462. data/lib/chef/checksum_cache.rb +0 -190
  463. data/lib/chef/cookbook_version_selector.rb +0 -168
  464. data/lib/chef/couchdb.rb +0 -246
  465. data/lib/chef/index_queue/amqp_client.rb +0 -116
  466. data/lib/chef/index_queue/consumer.rb +0 -76
  467. data/lib/chef/index_queue/indexable.rb +0 -109
  468. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  469. data/lib/chef/monkey_patches/moneta.rb +0 -50
  470. data/lib/chef/monkey_patches/uri.rb +0 -70
  471. data/lib/chef/openid_registration.rb +0 -187
  472. data/lib/chef/provider/user/solaris.rb +0 -90
  473. data/lib/chef/solr_query.rb +0 -187
  474. data/lib/chef/solr_query/lucene.treetop +0 -150
  475. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  476. data/lib/chef/solr_query/query_transform.rb +0 -65
  477. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  478. data/lib/chef/webui_user.rb +0 -231
  479. data/spec/data/cookbooks/openldap/files/default/.dotfile +0 -1
  480. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +0 -1
  481. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +0 -1
  482. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +0 -1
  483. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  484. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  485. data/spec/data/mac_users/10.7.plist.xml +0 -559
  486. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  487. data/spec/data/mac_users/10.8.plist.xml +0 -559
  488. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  489. data/spec/data/mac_users/10.9.plist.xml +0 -560
  490. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  491. data/spec/functional/resource/base.rb +0 -40
  492. data/spec/functional/resource/group_spec.rb +0 -343
  493. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  494. data/spec/unit/certificate_spec.rb +0 -76
  495. data/spec/unit/checksum_cache_spec.rb +0 -209
  496. data/spec/unit/checksum_spec.rb +0 -94
  497. data/spec/unit/couchdb_spec.rb +0 -274
  498. data/spec/unit/index_queue_spec.rb +0 -391
  499. data/spec/unit/mixin/language_spec.rb +0 -305
  500. data/spec/unit/openid_registration_spec.rb +0 -153
  501. data/spec/unit/provider/user/solaris_spec.rb +0 -414
  502. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  503. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  504. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  505. data/spec/unit/solr_query_spec.rb +0 -203
  506. 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,348 @@
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
+ # Enables or disables `||=`-like attribute setting. See, e.g., Node#set_unless
213
+ def set_unless_value_present=(setting)
214
+ @set_unless_present = setting
215
+ end
216
+
217
+ # Clears merged_attributes, which will cause it to be recomputed on the
218
+ # next access.
219
+ def reset_cache
220
+ @merged_attributes = nil
221
+ @combined_default = nil
222
+ @combined_override = nil
223
+ end
224
+
225
+ alias :reset :reset_cache
226
+
227
+ # Set the cookbook level default attribute component to +new_data+.
228
+ def default=(new_data)
229
+ reset
230
+ @default = VividMash.new(self, new_data)
231
+ end
232
+
233
+ # Set the role level default attribute component to +new_data+
234
+ def role_default=(new_data)
235
+ reset
236
+ @role_default = VividMash.new(self, new_data)
237
+ end
238
+
239
+ # Set the environment level default attribute component to +new_data+
240
+ def env_default=(new_data)
241
+ reset
242
+ @env_default = VividMash.new(self, new_data)
243
+ end
244
+
245
+ # Set the force_default (+default!+) level attributes to +new_data+
246
+ def force_default=(new_data)
247
+ reset
248
+ @force_default = VividMash.new(self, new_data)
249
+ end
250
+
251
+ # Set the normal level attribute component to +new_data+
252
+ def normal=(new_data)
253
+ reset
254
+ @normal = VividMash.new(self, new_data)
255
+ end
256
+
257
+ # Set the cookbook level override attribute component to +new_data+
258
+ def override=(new_data)
259
+ reset
260
+ @override = VividMash.new(self, new_data)
261
+ end
262
+
263
+ # Set the role level override attribute component to +new_data+
264
+ def role_override=(new_data)
265
+ reset
266
+ @role_override = VividMash.new(self, new_data)
267
+ end
268
+
269
+ # Set the environment level override attribute component to +new_data+
270
+ def env_override=(new_data)
271
+ reset
272
+ @env_override = VividMash.new(self, new_data)
273
+ end
274
+
275
+ def force_override=(new_data)
276
+ reset
277
+ @force_override = VividMash.new(self, new_data)
278
+ end
279
+
280
+ def automatic=(new_data)
281
+ reset
282
+ @automatic = VividMash.new(self, new_data)
283
+ end
284
+
285
+ def merged_attributes
286
+ @merged_attributes ||= begin
287
+ resolved_attrs = COMPONENTS.inject(Mash.new) do |merged, component_ivar|
288
+ component_value = instance_variable_get(component_ivar)
289
+ Chef::Mixin::DeepMerge.merge(merged, component_value)
290
+ end
291
+ immutablize(resolved_attrs)
292
+ end
293
+ end
294
+
295
+ def combined_override
296
+ @combined_override ||= begin
297
+ resolved_attrs = OVERRIDE_COMPONENTS.inject(Mash.new) do |merged, component_ivar|
298
+ component_value = instance_variable_get(component_ivar)
299
+ Chef::Mixin::DeepMerge.merge(merged, component_value)
300
+ end
301
+ immutablize(resolved_attrs)
302
+ end
303
+ end
304
+
305
+ def combined_default
306
+ @combined_default ||= begin
307
+ resolved_attrs = DEFAULT_COMPONENTS.inject(Mash.new) do |merged, component_ivar|
308
+ component_value = instance_variable_get(component_ivar)
309
+ Chef::Mixin::DeepMerge.merge(merged, component_value)
310
+ end
311
+ immutablize(resolved_attrs)
312
+ end
313
+ end
314
+
315
+ def [](key)
316
+ merged_attributes[key]
317
+ end
318
+
319
+ def []=(key, value)
320
+ merged_attributes[key] = value
321
+ end
322
+
323
+ def has_key?(key)
324
+ COMPONENTS.any? do |component_ivar|
325
+ instance_variable_get(component_ivar).has_key?(key)
326
+ end
327
+ end
328
+
329
+ alias :attribute? :has_key?
330
+ alias :member? :has_key?
331
+ alias :include? :has_key?
332
+ alias :key? :has_key?
333
+
334
+ alias :each_attribute :each
335
+
336
+ def method_missing(symbol, *args)
337
+ if args.empty?
338
+ if key?(symbol)
339
+ self[symbol]
340
+ else
341
+ raise NoMethodError, "Undefined method or attribute `#{symbol}' on `node'"
342
+ end
343
+ elsif symbol.to_s =~ /=$/
344
+ key_to_set = symbol.to_s[/^(.+)=$/, 1]
345
+ self[key_to_set] = (args.length == 1 ? args[0] : args)
346
+ else
347
+ raise NoMethodError, "Undefined node attribute or method `#{symbol}' on `node'"
348
+ end
349
+ end
350
+
351
+ def inspect
352
+ "#<#{self.class} " << (COMPONENTS + [:@merged_attributes, :@properties]).map{|iv|
353
+ "#{iv}=#{instance_variable_get(iv).inspect}"
354
+ }.join(', ') << ">"
355
+ end
356
+
357
+ def set_unless?
358
+ @set_unless_present
359
+ end
501
360
 
502
361
  end
362
+
503
363
  end
504
364
  end