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
@@ -27,13 +27,18 @@ describe Chef::Mixin::EnforceOwnershipAndPermissions do
27
27
  @node.name "make_believe"
28
28
  @events = Chef::EventDispatch::Dispatcher.new
29
29
  @run_context = Chef::RunContext.new(@node, {}, @events)
30
- @resource = Chef::Resource::File.new("#{Dir.mktmpdir}/madeup.txt")
30
+ @tmpdir = Dir.mktmpdir
31
+ @resource = Chef::Resource::File.new("#{@tmpdir}/madeup.txt")
31
32
  FileUtils.touch @resource.path
32
33
  @resource.owner "adam"
33
34
  @provider = Chef::Provider::File.new(@resource, @run_context)
34
35
  @provider.current_resource = @resource
35
36
  end
36
37
 
38
+ after(:each) do
39
+ FileUtils.rm_rf(@tmpdir)
40
+ end
41
+
37
42
  it "should call set_all on the file access control object" do
38
43
  Chef::FileAccessControl.any_instance.should_receive(:set_all)
39
44
  @provider.enforce_ownership_and_permissions
@@ -330,10 +330,12 @@ describe Chef::Mixin::ParamsValidate do
330
330
 
331
331
  it "asserts that a value returns false from a predicate method" do
332
332
  lambda do
333
- @vo.validate({:not_blank => "should pass"}, {:not_blank => {:cannot_be => :blank}})
333
+ @vo.validate({:not_blank => "should pass"},
334
+ {:not_blank => {:cannot_be => :nil, :cannot_be => :empty}})
334
335
  end.should_not raise_error
335
336
  lambda do
336
- @vo.validate({:not_blank => ""}, {:not_blank => {:cannot_be => :blank}})
337
+ @vo.validate({:not_blank => ""},
338
+ {:not_blank => {:cannot_be => :nil, :cannot_be => :empty}})
337
339
  end.should raise_error(Chef::Exceptions::ValidationFailed)
338
340
  end
339
341
 
@@ -366,40 +368,5 @@ describe Chef::Mixin::ParamsValidate do
366
368
  @vo.set_or_return(:name, value, { }).object_id.should == value.object_id
367
369
  @vo.set_or_return(:foo, nil, { :name_attribute => true }).object_id.should == value.object_id
368
370
  end
369
-
370
- it "should allow DelayedEvaluator instance to be set for value regardless of restriction" do
371
- value = Chef::DelayedEvaluator.new{ 'test' }
372
- @vo.set_or_return(:test, value, {:kind_of => Numeric})
373
- end
374
-
375
- it "should raise an error when delayed evaluated attribute is not valid" do
376
- value = Chef::DelayedEvaluator.new{ 'test' }
377
- @vo.set_or_return(:test, value, {:kind_of => Numeric})
378
- lambda do
379
- @vo.set_or_return(:test, nil, {:kind_of => Numeric})
380
- end.should raise_error(Chef::Exceptions::ValidationFailed)
381
- end
382
-
383
- it "should create DelayedEvaluator instance when #lazy is used" do
384
- @vo.set_or_return(:delayed, @vo.lazy{ 'test' }, {})
385
- @vo.instance_variable_get(:@delayed).should be_a(Chef::DelayedEvaluator)
386
- end
387
-
388
- it "should execute block on each call when DelayedEvaluator" do
389
- value = 'fubar'
390
- @vo.set_or_return(:test, @vo.lazy{ value }, {})
391
- @vo.set_or_return(:test, nil, {}).should == 'fubar'
392
- value = 'foobar'
393
- @vo.set_or_return(:test, nil, {}).should == 'foobar'
394
- value = 'fauxbar'
395
- @vo.set_or_return(:test, nil, {}).should == 'fauxbar'
396
- end
397
-
398
- it "should not evaluate non DelayedEvaluator instances" do
399
- value = lambda{ 'test' }
400
- @vo.set_or_return(:test, value, {})
401
- @vo.set_or_return(:test, nil, {}).object_id.should == value.object_id
402
- @vo.set_or_return(:test, nil, {}).should be_a(Proc)
403
- end
404
371
 
405
372
  end
@@ -112,9 +112,11 @@ describe Chef::Mixin::Securable do
112
112
  @original_config = Chef::Config.hash_dup
113
113
  load File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "chef", "config.rb")
114
114
  load File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "chef", "mixin", "securable.rb")
115
- @securable = Object.new
116
- @securable.send(:extend, Chef::Mixin::Securable)
117
- @securable.send(:extend, Chef::Mixin::ParamsValidate)
115
+ SECURABLE_CLASS = Class.new do
116
+ include Chef::Mixin::Securable
117
+ include Chef::Mixin::ParamsValidate
118
+ end
119
+ @securable = SECURABLE_CLASS.new
118
120
  end
119
121
  end
120
122
 
@@ -44,6 +44,125 @@ describe Chef::Mixin::Template, "render_template" do
44
44
  end
45
45
  end
46
46
 
47
+ describe "with a template resource" do
48
+ before :each do
49
+ @cookbook_repo = File.expand_path(File.join(CHEF_SPEC_DATA, "cookbooks"))
50
+ Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, @cookbook_repo) }
51
+
52
+ @node = Chef::Node.new
53
+ cl = Chef::CookbookLoader.new(@cookbook_repo)
54
+ cl.load_cookbooks
55
+ @cookbook_collection = Chef::CookbookCollection.new(cl)
56
+ @events = Chef::EventDispatch::Dispatcher.new
57
+ @run_context = Chef::RunContext.new(@node, @cookbook_collection, @events)
58
+
59
+ @rendered_file_location = Dir.tmpdir + '/openldap_stuff.conf'
60
+
61
+ @resource = Chef::Resource::Template.new(@rendered_file_location)
62
+ @resource.cookbook_name = 'openldap'
63
+
64
+ @provider = Chef::Provider::Template.new(@resource, @run_context)
65
+ @current_resource = @resource.dup
66
+ @provider.current_resource = @current_resource
67
+ @access_controls = mock("access controls")
68
+ @provider.stub!(:access_controls).and_return(@access_controls)
69
+
70
+ @template_context = {}
71
+ @template_context[:node] = @node
72
+ @template_context[:template_finder] = Chef::Provider::TemplateFinder.new(@run_context, @resource.cookbook_name, @node)
73
+ end
74
+
75
+ it "should provide a render method" do
76
+ @provider.render_template("before {<%= render 'test.erb' %>} after", @template_context) do |tmp|
77
+ tmp.open.read.should == "before {We could be diving for pearls!\n} after"
78
+ end
79
+ end
80
+
81
+ it "should render local files" do
82
+ begin
83
+ tf = Tempfile.new("partial")
84
+ tf.puts "test"
85
+ tf.rewind
86
+
87
+ @provider.render_template("before {<%= render '#{tf.path}', :local => true %>} after", @template_context) do |tmp|
88
+ tmp.open.read.should == "before {test\n} after"
89
+ end
90
+ ensure
91
+ tf.close
92
+ end
93
+ end
94
+
95
+ it "should render partials from a different cookbook" do
96
+ @template_context[:template_finder] = Chef::Provider::TemplateFinder.new(@run_context, 'apache2', @node)
97
+
98
+ @provider.render_template("before {<%= render 'test.erb', :cookbook => 'openldap' %>} after", @template_context) do |tmp|
99
+ tmp.open.read.should == "before {We could be diving for pearls!\n} after"
100
+ end
101
+ end
102
+
103
+ it "should render using the source argument if provided" do
104
+ begin
105
+ tf = Tempfile.new("partial")
106
+ tf.puts "test"
107
+ tf.rewind
108
+
109
+ @provider.render_template("before {<%= render 'something', :local => true, :source => '#{tf.path}' %>} after", @template_context) do |tmp|
110
+ tmp.open.read.should == "before {test\n} after"
111
+ end
112
+ ensure
113
+ tf.close
114
+ end
115
+ end
116
+
117
+ it "should pass the node to partials" do
118
+ @node.normal[:slappiness] = "happiness"
119
+
120
+ @provider.render_template("before {<%= render 'openldap_stuff.conf.erb' %>} after", @template_context) do |tmp|
121
+ tmp.open.read.should == "before {slappiness is happiness} after"
122
+ end
123
+ end
124
+
125
+ it "should pass the original variables to partials" do
126
+ @template_context[:secret] = 'candy'
127
+
128
+ @provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb' %>} after", @template_context) do |tmp|
129
+ tmp.open.read.should == "before {super secret is candy} after"
130
+ end
131
+ end
132
+
133
+ it "should pass variables to partials" do
134
+ @provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {:secret => 'whatever' } %>} after", @template_context) do |tmp|
135
+ tmp.open.read.should == "before {super secret is whatever} after"
136
+ end
137
+ end
138
+
139
+ it "should pass variables to partials even if they are named the same" do
140
+ @template_context[:secret] = 'one'
141
+
142
+ @provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {:secret => 'two' } %>} after <%= @secret %>", @template_context) do |tmp|
143
+ tmp.open.read.should == "before {super secret is two} after one"
144
+ end
145
+ end
146
+
147
+ it "should pass nil for missing variables in partials" do
148
+ @provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb', :variables => {} %>} after", @template_context) do |tmp|
149
+ tmp.open.read.should == "before {super secret is } after"
150
+ end
151
+
152
+ @provider.render_template("before {<%= render 'openldap_variable_stuff.conf.erb' %>} after", @template_context) do |tmp|
153
+ tmp.open.read.should == "before {super secret is } after"
154
+ end
155
+ end
156
+
157
+ it "should render nested partials" do
158
+ path = File.expand_path(File.join(CHEF_SPEC_DATA, "partial_one.erb"))
159
+
160
+ @provider.render_template("before {<%= render '#{path}', :local => true %>} after", @template_context) do |tmp|
161
+ tmp.open.read.should == "before {partial one We could be diving for pearls!\n calling home\n} after"
162
+ end
163
+ end
164
+ end
165
+
47
166
  describe "when an exception is raised in the template" do
48
167
  def do_raise
49
168
  @context = {:chef => "cool"}
@@ -7,9 +7,9 @@
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
9
9
  # You may obtain a copy of the License at
10
- #
10
+ #
11
11
  # http://www.apache.org/licenses/LICENSE-2.0
12
- #
12
+ #
13
13
  # Unless required by applicable law or agreed to in writing, software
14
14
  # distributed under the License is distributed on an "AS IS" BASIS,
15
15
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,9 +20,9 @@
20
20
  require 'spec_helper'
21
21
  require 'chef/node/attribute'
22
22
 
23
- describe Chef::Node::Attribute do
23
+ describe Chef::Node::Attribute do
24
24
  before(:each) do
25
- @attribute_hash =
25
+ @attribute_hash =
26
26
  {"dmi"=>{},
27
27
  "command"=>{"ps"=>"ps -ef"},
28
28
  "platform_version"=>"10.5.7",
@@ -193,7 +193,7 @@ describe Chef::Node::Attribute do
193
193
  @default_hash = {
194
194
  "domain" => "opscode.com",
195
195
  "hot" => { "day" => "saturday" },
196
- "music" => {
196
+ "music" => {
197
197
  "jimmy_eat_world" => "is fun!",
198
198
  "mastodon" => "rocks",
199
199
  "mars_volta" => "is loud and nutty",
@@ -225,30 +225,93 @@ describe Chef::Node::Attribute do
225
225
  [ :normal, :default, :override, :automatic ].each do |accessor|
226
226
  it "should set #{accessor}" do
227
227
  na = Chef::Node::Attribute.new({ :normal => true }, { :default => true }, { :override => true }, { :automatic => true })
228
- na.send(accessor).should == { accessor => true }
228
+ na.send(accessor).should == { accessor.to_s => true }
229
229
  end
230
230
  end
231
231
 
232
- it "should allow you to set the initial state" do
233
- attrs = {"first" => {"second" => {"third" => {"jackpot" => "jackpot!"}}}}
234
- na = Chef::Node::Attribute.new(attrs, {}, {}, {}, [ "first", "second", "third" ])
235
- na.should have_key("jackpot")
236
- end
237
-
238
232
  it "should be enumerable" do
239
233
  @attributes.should be_is_a(Enumerable)
240
234
  end
241
235
  end
242
236
 
243
- describe "hash_and_not_cna" do
244
- it "should return false if we pass it a Chef::Node::Attribute" do
245
- @attributes.hash_and_not_cna?(@attributes).should == false
237
+ describe "when fetching values based on precedence" do
238
+ before do
239
+ @attributes.default["default"] = "cookbook default"
240
+ @attributes.override["override"] = "cookbook override"
241
+ end
242
+
243
+ it "prefers 'forced default' over any other default" do
244
+ @attributes.default!["default"] = "force default"
245
+ @attributes.role_default["default"] = "role default"
246
+ @attributes.env_default["default"] = "environment default"
247
+ @attributes["default"].should == "force default"
248
+ end
249
+
250
+ it "prefers role_default over environment or cookbook default" do
251
+ @attributes.role_default["default"] = "role default"
252
+ @attributes.env_default["default"] = "environment default"
253
+ @attributes["default"].should == "role default"
254
+ end
255
+
256
+ it "prefers environment default over cookbook default" do
257
+ @attributes.env_default["default"] = "environment default"
258
+ @attributes["default"].should == "environment default"
259
+ end
260
+
261
+ it "returns the cookbook default when no other default values are present" do
262
+ @attributes["default"].should == "cookbook default"
246
263
  end
247
264
 
248
- it "should return true if we pass it something that responds to has_key?" do
249
- hashy = mock("Hashlike", :has_key? => true)
250
- @attributes.hash_and_not_cna?(hashy).should == true
265
+ it "prefers 'forced overrides' over role or cookbook overrides" do
266
+ @attributes.override!["override"] = "force override"
267
+ @attributes.env_override["override"] = "environment override"
268
+ @attributes.role_override["override"] = "role override"
269
+ @attributes["override"].should == "force override"
251
270
  end
271
+
272
+ it "prefers environment overrides over role or cookbook overrides" do
273
+ @attributes.env_override["override"] = "environment override"
274
+ @attributes.role_override["override"] = "role override"
275
+ @attributes["override"].should == "environment override"
276
+ end
277
+
278
+ it "prefers role overrides over cookbook overrides" do
279
+ @attributes.role_override["override"] = "role override"
280
+ @attributes["override"].should == "role override"
281
+ end
282
+
283
+ it "returns cookbook overrides when no other overrides are present" do
284
+ @attributes["override"].should == "cookbook override"
285
+ end
286
+
287
+ end
288
+
289
+ describe "when reading combined default or override values" do
290
+ before do
291
+ @attributes.default["cd"] = "cookbook default"
292
+ @attributes.role_default["rd"] = "role default"
293
+ @attributes.env_default["ed"] = "env default"
294
+ @attributes.default!["fd"] = "force default"
295
+ @attributes.override["co"] = "cookbook override"
296
+ @attributes.role_override["ro"] = "role override"
297
+ @attributes.env_override["eo"] = "env override"
298
+ @attributes.override!["fo"] = "force override"
299
+ end
300
+
301
+ it "merges all types of overrides into a combined override" do
302
+ @attributes.combined_override["co"].should == "cookbook override"
303
+ @attributes.combined_override["ro"].should == "role override"
304
+ @attributes.combined_override["eo"].should == "env override"
305
+ @attributes.combined_override["fo"].should == "force override"
306
+ end
307
+
308
+ it "merges all types of defaults into a combined default" do
309
+ @attributes.combined_default["cd"].should == "cookbook default"
310
+ @attributes.combined_default["rd"].should == "role default"
311
+ @attributes.combined_default["ed"].should == "env default"
312
+ @attributes.combined_default["fd"].should == "force default"
313
+ end
314
+
252
315
  end
253
316
 
254
317
  describe "[]" do
@@ -282,67 +345,31 @@ describe Chef::Node::Attribute do
282
345
 
283
346
  it "should return the merged hash if all three have values" do
284
347
  result = @attributes["music"]
285
- result["mars_volta"] = "cicatriz"
286
- result["jimmy_eat_world"] = "nice"
287
- result["mastodon"] = "rocks"
348
+ result["mars_volta"].should == "cicatriz"
349
+ result["jimmy_eat_world"].should == "nice"
350
+ result["mastodon"].should == "rocks"
288
351
  end
289
352
  end
290
353
 
291
- describe "auto_vivifiy" do
292
- it "should set the hash key to a mash if it does not exist" do
293
- @attributes.auto_vivifiy({}, "one")["one"].should be_a_kind_of(Mash)
294
- end
295
-
296
- it "should raise an exception if the key does exist and does not respond to has_key?" do
297
- lambda { @attributes.auto_vivifiy({ "one" => "value" }) }.should raise_error(ArgumentError)
298
- end
299
-
300
- it "should not alter the value if the key exists and responds to has_key?" do
301
- @attributes.auto_vivifiy({ "one" => { "will" => true } }, "one")["one"].should have_key("will")
302
- end
303
- end
304
-
305
- describe "set_value" do
306
- it "should set the value for a top level key" do
307
- to_check = {}
308
- @attributes.set_value(to_check, "one", "some value")
309
- to_check["one"].should == "some value"
310
- end
311
-
312
- it "should set the value for a second level key" do
313
- to_check = {}
314
- @attributes[ "one" ]
315
- @attributes.set_value(to_check, "two", "some value")
316
- to_check["one"]["two"].should == "some value"
317
- end
318
-
319
- it "should set the value for a very deep key" do
320
- to_check = {}
321
- attributes = Chef::Node::Attribute.new({}, {}, {}, {}, %w{one two three four five})
322
- attributes.set_value(to_check, "six", "some value")
323
- to_check["one"]["two"]["three"]["four"]["five"]["six"].should == "some value"
354
+ describe "[]=" do
355
+ it "should error out when the type of attribute to set has not been specified" do
356
+ @attributes.normal["the_ghost"] = { }
357
+ lambda { @attributes["the_ghost"]["exterminate"] = false }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
324
358
  end
325
- end
326
359
 
327
- describe "[]=" do
328
360
  it "should let you set an attribute value when another hash has an intermediate value" do
329
361
  @attributes.normal["the_ghost"] = { "exterminate" => "the future" }
330
- @attributes.set_type = :default
331
- @attributes.auto_vivifiy_on_read = true
332
- lambda { @attributes["the_ghost"]["exterminate"]["tomorrow"] = false }.should_not raise_error(NoMethodError)
362
+ lambda { @attributes.normal["the_ghost"]["exterminate"]["tomorrow"] = false }.should_not raise_error(NoMethodError)
333
363
  end
334
364
 
335
365
  it "should set the attribute value" do
336
- @attributes["longboard"] = "surfing"
337
- @attributes["longboard"].should == "surfing"
338
- @attributes.attribute["longboard"].should == "surfing"
366
+ @attributes.normal["longboard"] = "surfing"
367
+ @attributes.normal["longboard"].should == "surfing"
368
+ @attributes.normal["longboard"].should == "surfing"
339
369
  end
340
370
 
341
- it "should set deeply nested attribute value when auto_vivifiy_on_read is true" do
342
- @attributes.set_type = :normal
343
- @attributes.auto_vivifiy_on_read = true
344
- @attributes["deftones"]["hunters"]["nap"] = "surfing"
345
- @attributes.reset
371
+ it "should set deeply nested attribute values when a precedence level is specified" do
372
+ @attributes.normal["deftones"]["hunters"]["nap"] = "surfing"
346
373
  @attributes.normal["deftones"]["hunters"]["nap"].should == "surfing"
347
374
  end
348
375
 
@@ -351,45 +378,23 @@ describe Chef::Node::Attribute do
351
378
  end
352
379
 
353
380
  it "should let you set attributes manually without vivification" do
354
- @attributes["foo"] = Mash.new
355
- @attributes["foo"]["bar"] = :baz
356
- @attributes["foo"]["bar"].should == :baz
381
+ @attributes.normal["foo"] = Mash.new
382
+ @attributes.normal["foo"]["bar"] = :baz
383
+ @attributes.normal["foo"]["bar"].should == :baz
357
384
  end
358
385
 
359
386
  it "should optionally skip setting the value if one already exists" do
360
387
  @attributes.set_unless_value_present = true
361
- @attributes["hostname"] = "bar"
388
+ @attributes.normal["hostname"] = "bar"
362
389
  @attributes["hostname"].should == "latte"
363
390
  end
364
391
 
365
- it "should write to an attribute that has been read before properly" do
366
- @attributes["foo"] = Mash.new
367
- @attributes["foo"]["bar"] ||= "stop the world"
368
- @attributes["foo"]["bar"].should == "stop the world"
369
- end
370
- end
371
-
372
- describe "get_value" do
373
- it "should get a value from a top level key" do
374
- @attributes.get_value(@default_hash, "domain").should == "opscode.com"
375
- end
376
-
377
- it "should return nil for a top level key that does not exist" do
378
- @attributes.get_value(@default_hash, "domainz").should == nil
379
- end
380
-
381
- it "should get a value based on the state of the object" do
382
- @attributes.auto_vivifiy_on_read = true
383
- @attributes.set_type = :normal
384
- @attributes[:foo][:bar][:baz] = "snack"
385
- @attributes.get_value(@attribute_hash, :baz).should == "snack"
386
- end
387
-
388
- it "should return nil based on the state of the object if the key does not exist" do
389
- @attributes.auto_vivifiy_on_read = true
390
- @attributes.set_type = :normal
391
- @attributes[:foo][:bar][:baz] = "snack"
392
- @attributes.get_value(@attribute_hash, :baznatch).should == nil
392
+ it "does not support ||= when setting" do
393
+ # This is a limitation of auto-vivification.
394
+ # Users who need this behavior can use set_unless and friends
395
+ @attributes.normal["foo"] = Mash.new
396
+ @attributes.normal["foo"]["bar"] ||= "stop the world"
397
+ @attributes.normal["foo"]["bar"].should == {}
393
398
  end
394
399
  end
395
400
 
@@ -403,21 +408,6 @@ describe Chef::Node::Attribute do
403
408
  hash.class.should == Hash
404
409
  hash["day"].should == "sunday"
405
410
  end
406
-
407
- # Regression test for CHEF-4631
408
- context "when merging array values" do
409
- before do
410
- @default_attrs = {"foo" => {"bar" => ["default"]}}
411
- @override_attrs = {"foo" => {"bar" => ["override"]}}
412
-
413
- #(normal, default, override, automatic, state=[])
414
- @attributes = Chef::Node::Attribute.new({ }, @default_attrs, @override_attrs, { })
415
- end
416
-
417
- it "should return the override" do
418
- @attributes["foo"].to_hash["bar"].should == [ "override" ]
419
- end
420
- end
421
411
  end
422
412
 
423
413
  describe "has_key?" do
@@ -438,14 +428,8 @@ describe Chef::Node::Attribute do
438
428
  end
439
429
 
440
430
  it "should return true if an attribute exists but is set to false" do
441
- @attributes["music"]
442
- @attributes.has_key?("apophis").should == true
443
- end
444
-
445
- it "should find keys at the current nesting level" do
446
- @attributes["music"]
447
- @attributes.has_key?("mastodon").should == true
448
- @attributes.has_key?("whitesnake").should == false
431
+ @attributes.has_key?("music")
432
+ @attributes["music"].has_key?("apophis").should == true
449
433
  end
450
434
 
451
435
  it "does not find keys above the current nesting level" do
@@ -458,7 +442,7 @@ describe Chef::Node::Attribute do
458
442
 
459
443
  [:include?, :key?, :member?].each do |method|
460
444
  it "should alias the method #{method} to itself" do
461
- @attributes.should respond_to(method)
445
+ @attributes.should respond_to(method)
462
446
  end
463
447
 
464
448
  it "#{method} should behave like has_key?" do
@@ -476,11 +460,6 @@ describe Chef::Node::Attribute do
476
460
  @attributes.attribute?("ninja").should == false
477
461
  end
478
462
 
479
- it "should be looking at the current position of the object" do
480
- @attributes["music"]
481
- @attributes.attribute?("mastodon").should == true
482
- @attributes.attribute?("whitesnake").should == false
483
- end
484
463
  end
485
464
 
486
465
  describe "method_missing" do
@@ -488,16 +467,10 @@ describe Chef::Node::Attribute do
488
467
  @attributes.music.mastodon.should == "rocks"
489
468
  end
490
469
 
491
- it "should behave like a []= lookup if the last method has an argument" do
492
- @attributes.music.mastodon(["dream", "still", "shining"])
493
- @attributes.reset
494
- @attributes.music.mastodon.should == ["dream", "still", "shining"]
495
- end
496
-
497
470
  it "should allow the last method to set a value if it has an = sign on the end" do
498
- @attributes.music.mastodon = [ "dream", "still", "shining" ]
471
+ @attributes.normal.music.mastodon = [ "dream", "still", "shining" ]
499
472
  @attributes.reset
500
- @attributes.music.mastodon.should == [ "dream", "still", "shining" ]
473
+ @attributes.normal.music.mastodon.should == [ "dream", "still", "shining" ]
501
474
  end
502
475
  end
503
476
 
@@ -531,7 +504,7 @@ describe Chef::Node::Attribute do
531
504
  collect.include?("snakes").should == true
532
505
  collect.include?("snack").should == true
533
506
  collect.include?("place").should == true
534
- collect.length.should == 5
507
+ collect.length.should == 5
535
508
  end
536
509
 
537
510
  it "should yield lower if we go deeper" do
@@ -542,7 +515,7 @@ describe Chef::Node::Attribute do
542
515
  collect.include?("two").should == true
543
516
  collect.include?("four").should == true
544
517
  collect.include?("six").should == true
545
- collect.length.should == 3
518
+ collect.length.should == 3
546
519
  end
547
520
 
548
521
  it "should not raise an exception if one of the hashes has a nil value on a deep lookup" do
@@ -616,7 +589,7 @@ describe Chef::Node::Attribute do
616
589
  @attributes.each_key do |k|
617
590
  collect << k
618
591
  end
619
-
592
+
620
593
  collect.should include("one")
621
594
  collect.should include("snack")
622
595
  collect.should include("hut")
@@ -659,7 +632,7 @@ describe Chef::Node::Attribute do
659
632
  collect["snack"].should == "cookies"
660
633
  end
661
634
  end
662
-
635
+
663
636
  describe "each_value" do
664
637
  before do
665
638
  @attributes = Chef::Node::Attribute.new(
@@ -938,8 +911,8 @@ describe Chef::Node::Attribute do
938
911
  end
939
912
  end
940
913
 
941
- it "should return an empty array for a block containing nil" do
942
- @attributes.select { nil }.should == []
914
+ it "should return an empty hash/array (ruby-version-dependent) for a block containing nil" do
915
+ @attributes.select { nil }.should == {}.select { nil }
943
916
  end
944
917
 
945
918
  # sorted for spec clarity
@@ -1013,56 +986,105 @@ describe Chef::Node::Attribute do
1013
986
 
1014
987
  describe "inspect" do
1015
988
  it "should be readable" do
1016
- @attributes.inspect.should =~ /@automatic=\{\.\.\.\}/
1017
- @attributes.inspect.should =~ /@normal=\{\.\.\.\}/
989
+ # NOTE: previous implementation hid the values, showing @automatic={...}
990
+ # That is nice and compact, but hides a lot of info, which seems counter
991
+ # to the point of calling #inspect...
992
+ @attributes.inspect.should =~ /@automatic=\{.*\}/
993
+ @attributes.inspect.should =~ /@normal=\{.*\}/
1018
994
  end
1019
995
  end
1020
996
 
1021
- describe "when a value has been set at all four precedence levels" do
1022
- before do
1023
- @default_attrs = {"foo" => {"bar" => "default_value"}}
1024
- @normal_attrs = {"foo" => {"bar" => "normal_value"}}
1025
- @override_attrs = {"foo" => {"bar" => "override_value"}}
1026
- @automatic_attrs = {"foo" => {"bar" => "automatic_value"}}
997
+ # For expedience, this test is implementation-heavy.
998
+ describe "when a component attribute is mutated" do
999
+ [
1000
+ :clear,
1001
+ :shift
1002
+ ].each do |mutator|
1003
+ it "resets the cache when the mutator #{mutator} is called" do
1004
+ @attributes.should_receive(:reset_cache)
1005
+ @attributes.default.send(mutator)
1006
+ end
1007
+ end
1027
1008
 
1028
- #(normal, default, override, automatic, state=[])
1029
- @attributes = Chef::Node::Attribute.new(@normal_attrs, @default_attrs, @override_attrs, @automatic_attrs)
1009
+ it "resets the cache when the mutator delete is called" do
1010
+ @attributes.should_receive(:reset_cache)
1011
+ @attributes.default.delete(:music)
1030
1012
  end
1031
1013
 
1032
- it "deletes a key from all precedence levels" do
1033
- @attributes["foo"].delete("bar")
1034
- @attributes.reset
1035
- @attributes["foo"].should_not have_key("bar")
1036
- @default_attrs["foo"].should_not have_key("bar")
1037
- @normal_attrs["foo"].should_not have_key("bar")
1038
- @override_attrs["foo"].should_not have_key("bar")
1039
- @automatic_attrs["foo"].should_not have_key("bar")
1014
+ [
1015
+ :merge!,
1016
+ :update,
1017
+ :replace
1018
+ ].each do |mutator|
1019
+ it "resets the cache when the mutator #{mutator} is called" do
1020
+ # Implementation of Mash means that this could get called many times. That's okay.
1021
+ @attributes.should_receive(:reset_cache).at_least(1).times
1022
+ @attributes.default.send(mutator, {:foo => :bar})
1023
+ end
1040
1024
  end
1041
1025
 
1042
- it "returns the automatic (highest precedence) value when deleting a key" do
1043
- @attributes["foo"].delete("bar").should == "automatic_value"
1026
+ [
1027
+ :delete_if,
1028
+ :keep_if,
1029
+ :reject!,
1030
+ :select!,
1031
+ ].each do |mutator|
1032
+ it "resets the cache when the mutator #{mutator} is called" do
1033
+ # Implementation of Mash means that this could get called many times. That's okay.
1034
+ @attributes.should_receive(:reset_cache).at_least(1).times
1035
+ block = lambda {|k,v| true }
1036
+ @attributes.default.send(mutator, &block)
1037
+ end
1044
1038
  end
1045
1039
  end
1046
1040
 
1047
- describe "regression test for CHEF-4631" do
1048
- before(:each) do
1049
- @default_attrs = {"foo" => {"bar" => ["default"]}}
1050
- @override_attrs = {"foo" => {"bar" => ["override"]}}
1041
+ describe "when not mutated" do
1051
1042
 
1052
- #(normal, default, override, automatic, state=[])
1053
- @attributes = Chef::Node::Attribute.new({ }, @default_attrs, @override_attrs, { })
1043
+ it "does not reset the cache when dup'd [CHEF-3680]" do
1044
+ @attributes.default[:foo][:bar] = "set on original"
1045
+ subtree = @attributes[:foo]
1046
+ @attributes.default[:foo].dup[:bar] = "set on dup"
1047
+ subtree[:bar].should == "set on original"
1054
1048
  end
1055
1049
 
1056
- it "array values in the role default attributes should be concatanated to the nodes default attributes" do
1057
- @default_attrs = {"foo" => {"bar" => ["1", "2"]}}
1058
- @attributes = Chef::Node::Attribute.new({ }, @default_attrs, { }, { })
1050
+ end
1059
1051
 
1060
- expansion = mock("Expansion", :default_attrs => { "foo" => {"bar" => ["3", "2"]}}, :override_attributes => { })
1052
+ describe "when setting a component attribute to a new value" do
1053
+ it "converts the input in to a VividMash tree (default)" do
1054
+ @attributes.default = {}
1055
+ @attributes.default.foo = "bar"
1056
+ @attributes.merged_attributes[:foo].should == "bar"
1057
+ end
1058
+
1059
+ it "converts the input in to a VividMash tree (normal)" do
1060
+ @attributes.normal = {}
1061
+ @attributes.normal.foo = "bar"
1062
+ @attributes.merged_attributes[:foo].should == "bar"
1063
+ end
1064
+
1065
+ it "converts the input in to a VividMash tree (override)" do
1066
+ @attributes.override = {}
1067
+ @attributes.override.foo = "bar"
1068
+ @attributes.merged_attributes[:foo].should == "bar"
1069
+ end
1061
1070
 
1071
+ it "converts the input in to a VividMash tree (automatic)" do
1072
+ @attributes.automatic = {}
1073
+ @attributes.automatic.foo = "bar"
1074
+ @attributes.merged_attributes[:foo].should == "bar"
1075
+ end
1076
+ end
1077
+
1078
+ describe "when attemping to write without specifying precedence" do
1079
+ it "raises an error when using []=" do
1080
+ lambda { @attributes[:new_key] = "new value" }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
1062
1081
  end
1063
1082
 
1064
- it "array values in the role override attributes should override the nodes default attributes" do
1083
+ it "raises an error when using `attr=value`" do
1084
+ lambda { @attributes.new_key = "new value" }.should raise_error(Chef::Exceptions::ImmutableAttributeModification)
1065
1085
  end
1086
+
1066
1087
  end
1067
1088
 
1068
1089
  end
1090
+