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
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,46 +16,14 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'chef/log'
19
+ require 'chef/dsl/include_attribute'
20
20
 
21
21
  class Chef
22
22
  module Mixin
23
- module LanguageIncludeAttribute
24
-
25
- # Loads the attribute file specified by the short name of the
26
- # file, e.g., loads specified cookbook's
27
- # "attributes/mailservers.rb"
28
- # if passed
29
- # "mailservers"
30
- def include_attribute(*fully_qualified_attribute_short_filenames)
31
- if self.kind_of?(Chef::Node)
32
- node = self
33
- else
34
- node = @node
35
- end
36
-
37
- fully_qualified_attribute_short_filenames.flatten.each do |fully_qualified_attribute_short_filename|
38
- if node.run_state[:seen_attributes].has_key?(fully_qualified_attribute_short_filename)
39
- Chef::Log.debug("I am not loading attribute file #{fully_qualified_attribute_short_filename}, because I have already seen it.")
40
- next
41
- end
42
-
43
- Chef::Log.debug("Loading Attribute #{fully_qualified_attribute_short_filename}")
44
- node.run_state[:seen_attributes][fully_qualified_attribute_short_filename] = true
45
-
46
- if amatch = fully_qualified_attribute_short_filename.match(/(.+?)::(.+)/)
47
- cookbook_name = amatch[1].to_sym
48
- node.load_attribute_by_short_filename(amatch[2], cookbook_name)
49
- else
50
- cookbook_name = fully_qualified_attribute_short_filename.to_sym
51
- node.load_attribute_by_short_filename("default", cookbook_name)
52
- end
53
- end
54
- true
55
- end
56
23
 
57
- end
24
+ # DEPRECATED: This is just here for compatibility, use
25
+ # Chef::DSL::IncludeAttribute instead.
26
+ LanguageIncludeAttribute = Chef::DSL::IncludeAttribute
58
27
  end
59
28
  end
60
-
61
29
 
@@ -16,43 +16,11 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'chef/log'
19
+ require 'chef/dsl/include_recipe'
20
20
 
21
21
  class Chef
22
22
  module Mixin
23
- module LanguageIncludeRecipe
24
-
25
- def include_recipe(*recipe_names)
26
- result_recipes = Array.new
27
- recipe_names.flatten.each do |recipe_name|
28
- if node.run_state[:seen_recipes].has_key?(recipe_name) or node.run_state[:seen_recipes].has_key?(recipe_name + "::default")
29
- Chef::Log.debug("I am not loading #{recipe_name}, because I have already seen it.")
30
- next
31
- end
32
-
33
- result_recipes << load_recipe(recipe_name)
34
- end
35
- result_recipes
36
- end
37
-
38
- def load_recipe(recipe_name)
39
- Chef::Log.debug("Loading Recipe #{recipe_name} via include_recipe")
40
- node.run_state[:seen_recipes][recipe_name] = true
41
-
42
- cookbook_name, recipe_short_name = Chef::Recipe.parse_recipe_name(recipe_name)
43
-
44
- run_context = self.is_a?(Chef::RunContext) ? self : self.run_context
45
- cookbook = run_context.cookbook_collection[cookbook_name]
46
- cookbook.load_recipe(recipe_short_name, run_context)
47
- end
48
-
49
-
50
- def require_recipe(*args)
51
- Chef::Log.warn("require_recipe is deprecated and will be removed in a future release, please use include_recipe")
52
- include_recipe(*args)
53
- end
54
-
55
- end
23
+ LanguageIncludeRecipe = Chef::DSL::IncludeRecipe
56
24
  end
57
25
  end
58
-
26
+
@@ -16,8 +16,7 @@
16
16
  # limitations under the License.
17
17
 
18
18
  class Chef
19
- class DelayedEvaluator < Proc
20
- end
19
+
21
20
  module Mixin
22
21
  module ParamsValidate
23
22
 
@@ -76,30 +75,18 @@ class Chef
76
75
  end
77
76
  opts
78
77
  end
79
-
80
- def lazy(&block)
81
- DelayedEvaluator.new(&block)
82
- end
83
-
78
+
84
79
  def set_or_return(symbol, arg, validation)
85
80
  iv_symbol = "@#{symbol.to_s}".to_sym
86
81
  map = {
87
82
  symbol => validation
88
83
  }
84
+
89
85
  if arg == nil && self.instance_variable_defined?(iv_symbol) == true
90
- ivar = self.instance_variable_get(iv_symbol)
91
- if(ivar.is_a?(DelayedEvaluator))
92
- validate({ symbol => ivar.call }, { symbol => validation })[symbol]
93
- else
94
- ivar
95
- end
86
+ self.instance_variable_get(iv_symbol)
96
87
  else
97
- if(arg.is_a?(DelayedEvaluator))
98
- val = arg
99
- else
100
- val = validate({ symbol => arg }, { symbol => validation })[symbol]
101
- end
102
- self.instance_variable_set(iv_symbol, val)
88
+ opts = validate({ symbol => arg }, { symbol => validation })
89
+ self.instance_variable_set(iv_symbol, opts[symbol])
103
90
  end
104
91
  end
105
92
 
@@ -17,70 +17,17 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require 'chef/resource'
21
- require 'chef/resource_platform_map'
22
- require 'chef/mixin/convert_to_class_name'
23
- require 'chef/mixin/language'
20
+ ###
21
+ # NOTE: This file and constant are here only for backwards compatibility.
22
+ # New code should use Chef::DSL::Recipe instead.
23
+ #
24
+ # This constant (module name) will eventually be deprecated and then removed.
25
+ ###
24
26
 
25
- #--
26
- # UGH. this is a circular require that will cause an uninitialized constant
27
- # error, but this file really does depend on Chef::Recipe. oh well.
28
- # require 'chef/recipe'
27
+ require 'chef/dsl/recipe'
29
28
 
30
29
  class Chef
31
30
  module Mixin
32
- module RecipeDefinitionDSLCore
33
-
34
- include Chef::Mixin::ConvertToClassName
35
- include Chef::Mixin::Language
36
-
37
- def method_missing(method_symbol, *args, &block)
38
- # If we have a definition that matches, we want to use that instead. This should
39
- # let you do some really crazy over-riding of "native" types, if you really want
40
- # to.
41
- if run_context.definitions.has_key?(method_symbol)
42
- # This dupes the high level object, but we still need to dup the params
43
- new_def = run_context.definitions[method_symbol].dup
44
- new_def.params = new_def.params.dup
45
- new_def.node = run_context.node
46
- # This sets up the parameter overrides
47
- new_def.instance_eval(&block) if block
48
- new_recipe = Chef::Recipe.new(cookbook_name, @recipe_name, run_context)
49
- new_recipe.params = new_def.params
50
- new_recipe.params[:name] = args[0]
51
- new_recipe.instance_eval(&new_def.recipe)
52
- else
53
- # Otherwise, we're rocking the regular resource call route.
54
-
55
- # Checks the new platform => short_name => resource mapping initially
56
- # then fall back to the older approach (Chef::Resource.const_get) for
57
- # backward compatibility
58
- resource_class = Chef::Resource.resource_for_node(method_symbol, run_context.node)
59
-
60
- super unless resource_class
61
- raise ArgumentError, "You must supply a name when declaring a #{method_symbol} resource" unless args.size > 0
62
-
63
- # If we have a resource like this one, we want to steal its state
64
- args << run_context
65
- resource = resource_class.new(*args)
66
- resource.source_line = caller[0]
67
- resource.load_prior_resource
68
- resource.cookbook_name = cookbook_name
69
- resource.recipe_name = @recipe_name
70
- resource.params = @params
71
- # Determine whether this resource is being created in the context of an enclosing Provider
72
- resource.enclosing_provider = self.is_a?(Chef::Provider) ? self : nil
73
- # Evaluate resource attribute DSL
74
- resource.instance_eval(&block) if block
75
-
76
- # Run optional resource hook
77
- resource.after_created
78
-
79
- run_context.resource_collection.insert(resource)
80
- resource
81
- end
82
- end
83
-
84
- end
31
+ RecipeDefinitionDSLCore = Chef::DSL::Recipe
85
32
  end
86
33
  end
@@ -59,9 +59,17 @@ class Chef
59
59
  )
60
60
  end
61
61
 
62
- # TODO should this be separated into different files?
63
- if RUBY_PLATFORM =~ /mswin|mingw|windows/
64
62
 
63
+ #==WindowsMacros
64
+ # Defines methods for adding attributes to a chef resource to describe
65
+ # Windows file security metadata.
66
+ #
67
+ # This module is meant to be used to extend a class (instead of
68
+ # `include`-ing). A class is automatically extended with this module when
69
+ # it includes WindowsSecurableAttributes.
70
+ # --
71
+ # TODO should this be separated into different files?
72
+ module WindowsMacros
65
73
  # === rights_attribute
66
74
  # "meta-method" for dynamically creating rights attributes on resources.
67
75
  #
@@ -99,7 +107,7 @@ class Chef
99
107
  # * `:applies_to_self` (optional): Boolean
100
108
  # * `:one_level_deep` (optional): Boolean
101
109
  #
102
- def self.rights_attribute(name)
110
+ def rights_attribute(name)
103
111
 
104
112
  # equivalent to something like:
105
113
  # def rights(permissions=nil, principals=nil, args_hash=nil)
@@ -160,10 +168,13 @@ class Chef
160
168
  )
161
169
  end
162
170
  end
171
+ end
172
+
173
+ #==WindowsSecurableAttributes
174
+ # Defines #inherits to describe Windows file security ACLs on the
175
+ # including class
176
+ module WindowsSecurableAttributes
163
177
 
164
- # create a default 'rights' attribute
165
- rights_attribute(:rights)
166
- rights_attribute(:deny_rights)
167
178
 
168
179
  def inherits(arg=nil)
169
180
  set_or_return(
@@ -172,8 +183,22 @@ class Chef
172
183
  :kind_of => [ TrueClass, FalseClass ]
173
184
  )
174
185
  end
186
+ end
175
187
 
176
- end # Windows-specific
188
+ if RUBY_PLATFORM =~ /mswin|mingw|windows/
189
+ include WindowsSecurableAttributes
190
+ end
191
+
192
+ # Callback that fires when included; will extend the including class
193
+ # with WindowsMacros and define #rights and #deny_rights on it.
194
+ def self.included(including_class)
195
+ if RUBY_PLATFORM =~ /mswin|mingw|windows/
196
+ including_class.extend(WindowsMacros)
197
+ # create a default 'rights' attribute
198
+ including_class.rights_attribute(:rights)
199
+ including_class.rights_attribute(:deny_rights)
200
+ end
201
+ end
177
202
 
178
203
  end
179
204
  end
@@ -29,6 +29,46 @@ class Chef
29
29
  raise "Could not find a value for node. If you are explicitly setting variables in a template, " +
30
30
  "include a node variable if you plan to use it."
31
31
  end
32
+
33
+ #
34
+ # Takes the name of the partial, plus a hash of options. Returns a
35
+ # string that contains the result of the evaluation of the partial.
36
+ #
37
+ # All variables from the parent template will be propagated down to
38
+ # the partial, unless you pass the +variables+ option (see below).
39
+ #
40
+ # Valid options are:
41
+ #
42
+ # :local:: If true then the partial name will be interpreted as the
43
+ # path to a file on the local filesystem; if false (the
44
+ # default) it will be looked up in the cookbook according to
45
+ # the normal rules for templates.
46
+ # :source:: If specified then the partial will be looked up with this
47
+ # name or path (according to the +local+ option) instead of
48
+ # +partial_name+.
49
+ # :cookbook:: Search for the partial in the provided cookbook instead
50
+ # of the cookbook that contains the top-level template.
51
+ # :variables:: A Hash of variable_name => value that will be made
52
+ # available to the partial. If specified, none of the
53
+ # variables from the master template will be, so if you
54
+ # need them you will need to propagate them explicitly.
55
+ #
56
+ def render(partial_name, options = {})
57
+ raise "You cannot render partials in this context" unless @template_finder
58
+
59
+ if variables = options.delete(:variables)
60
+ context = {}
61
+ context.merge!(variables)
62
+ context[:node] = @node
63
+ context[:template_finder] = @template_finder
64
+ else
65
+ context = self.dup
66
+ end
67
+
68
+ template_location = @template_finder.find(partial_name, options)
69
+ eruby = Erubis::Eruby.new(IO.read(template_location))
70
+ output = eruby.evaluate(context)
71
+ end
32
72
  end
33
73
 
34
74
  ::Erubis::Context.send(:include, ChefContext)
@@ -7,12 +7,8 @@ require 'chef/mixin/create_path'
7
7
  require 'chef/mixin/deep_merge'
8
8
  require 'chef/mixin/enforce_ownership_and_permissions'
9
9
  require 'chef/mixin/from_file'
10
- require 'chef/mixin/language'
11
- require 'chef/mixin/language_include_attribute'
12
- require 'chef/mixin/language_include_recipe'
13
10
  require 'chef/mixin/params_validate'
14
11
  require 'chef/mixin/path_sanity'
15
- require 'chef/mixin/recipe_definition_dsl_core'
16
12
  require 'chef/mixin/template'
17
13
  require 'chef/mixin/securable'
18
14
  require 'chef/mixin/xml_escape'
@@ -20,37 +20,3 @@ module Net
20
20
  include ChefNetHTTPExceptionExtensions
21
21
  end
22
22
  end
23
-
24
- if Net::HTTP.instance_methods.map {|m| m.to_s}.include?("proxy_uri")
25
- begin
26
- # Ruby 2.0 changes the way proxy support is implemented in Net::HTTP.
27
- # The implementation does not work correctly with IPv6 literals because it
28
- # concatenates the address into a URI without adding square brackets for
29
- # IPv6 addresses.
30
- #
31
- # If the bug is present, a call to Net::HTTP#proxy_uri when the host is an
32
- # IPv6 address will fail by creating an invalid URI, like so:
33
- #
34
- # ruby -r'net/http' -e 'Net::HTTP.new("::1", 80).proxy_uri'
35
- # /Users/ddeleo/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/uri/generic.rb:214:in `initialize': the scheme http does not accept registry part: ::1:80 (or bad hostname?) (URI::InvalidURIError)
36
- # from /Users/ddeleo/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/uri/http.rb:84:in `initialize'
37
- # from /Users/ddeleo/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/uri/common.rb:214:in `new'
38
- # from /Users/ddeleo/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/uri/common.rb:214:in `parse'
39
- # from /Users/ddeleo/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/uri/common.rb:747:in `parse'
40
- # from /Users/ddeleo/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/uri/common.rb:994:in `URI'
41
- # from /Users/ddeleo/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/net/http.rb:1027:in `proxy_uri'
42
- # from -e:1:in `<main>'
43
- #
44
- # https://bugs.ruby-lang.org/issues/9129
45
- Net::HTTP.new("::1", 80).proxy_uri
46
- rescue URI::InvalidURIError
47
- class Net::HTTP
48
-
49
- def proxy_uri # :nodoc:
50
- ipv6_safe_addr = address.to_s.include?(":") ? "[#{address}]" : address
51
- @proxy_uri ||= URI("http://#{ipv6_safe_addr}:#{port}").find_proxy
52
- end
53
-
54
- end
55
- end
56
- end
@@ -21,19 +21,17 @@
21
21
 
22
22
  require 'forwardable'
23
23
  require 'chef/config'
24
- require 'chef/cookbook/cookbook_collection'
25
24
  require 'chef/nil_argument'
26
25
  require 'chef/mixin/check_helper'
27
26
  require 'chef/mixin/params_validate'
28
27
  require 'chef/mixin/from_file'
29
- require 'chef/mixin/language_include_attribute'
30
28
  require 'chef/mixin/deep_merge'
29
+ require 'chef/dsl/include_attribute'
30
+ require 'chef/dsl/platform_introspection'
31
31
  require 'chef/environment'
32
- require 'chef/couchdb'
33
32
  require 'chef/rest'
34
33
  require 'chef/run_list'
35
34
  require 'chef/node/attribute'
36
- require 'chef/index_queue'
37
35
  require 'chef/mash'
38
36
  require 'chef/json_compat'
39
37
  require 'chef/search/query'
@@ -43,144 +41,35 @@ class Chef
43
41
 
44
42
  extend Forwardable
45
43
 
46
- def_delegators :construct_attributes, :keys, :each_key, :each_value, :key?, :has_key?
44
+ def_delegators :attributes, :keys, :each_key, :each_value, :key?, :has_key?
47
45
 
48
- attr_accessor :recipe_list, :couchdb, :couchdb_rev, :run_state, :run_list
49
- attr_accessor :override_attrs, :default_attrs, :normal_attrs, :automatic_attrs
50
- attr_reader :couchdb_id
46
+ attr_accessor :recipe_list, :run_state, :run_list
51
47
 
52
- # TODO: 5/18/2010 cw/timh. cookbook_collection should be removed
53
- # from here and for any place it's needed, it should be accessed
54
- # through a Chef::RunContext
55
- attr_accessor :cookbook_collection
48
+ # RunContext will set itself as run_context via this setter when
49
+ # initialized. This is needed so DSL::IncludeAttribute (in particular,
50
+ # #include_recipe) can access the run_context to determine if an attributes
51
+ # file has been seen yet.
52
+ #--
53
+ # TODO: This is a pretty ugly way to solve that problem.
54
+ attr_accessor :run_context
56
55
 
57
- include Chef::Mixin::CheckHelper
58
56
  include Chef::Mixin::FromFile
57
+ include Chef::DSL::IncludeAttribute
58
+ include Chef::DSL::PlatformIntrospection
59
+
60
+ include Chef::Mixin::CheckHelper
59
61
  include Chef::Mixin::ParamsValidate
60
- include Chef::Mixin::LanguageIncludeAttribute
61
- include Chef::IndexQueue::Indexable
62
-
63
- DESIGN_DOCUMENT = {
64
- "version" => 11,
65
- "language" => "javascript",
66
- "views" => {
67
- "all" => {
68
- "map" => <<-EOJS
69
- function(doc) {
70
- if (doc.chef_type == "node") {
71
- emit(doc.name, doc);
72
- }
73
- }
74
- EOJS
75
- },
76
- "all_id" => {
77
- "map" => <<-EOJS
78
- function(doc) {
79
- if (doc.chef_type == "node") {
80
- emit(doc.name, doc.name);
81
- }
82
- }
83
- EOJS
84
- },
85
- "status" => {
86
- "map" => <<-EOJS
87
- function(doc) {
88
- if (doc.chef_type == "node") {
89
- var to_emit = { "name": doc.name, "chef_environment": doc.chef_environment };
90
- if (doc["attributes"]["fqdn"]) {
91
- to_emit["fqdn"] = doc["attributes"]["fqdn"];
92
- } else {
93
- to_emit["fqdn"] = "Undefined";
94
- }
95
- if (doc["attributes"]["ipaddress"]) {
96
- to_emit["ipaddress"] = doc["attributes"]["ipaddress"];
97
- } else {
98
- to_emit["ipaddress"] = "Undefined";
99
- }
100
- if (doc["attributes"]["ohai_time"]) {
101
- to_emit["ohai_time"] = doc["attributes"]["ohai_time"];
102
- } else {
103
- to_emit["ohai_time"] = "Undefined";
104
- }
105
- if (doc["attributes"]["uptime"]) {
106
- to_emit["uptime"] = doc["attributes"]["uptime"];
107
- } else {
108
- to_emit["uptime"] = "Undefined";
109
- }
110
- if (doc["attributes"]["platform"]) {
111
- to_emit["platform"] = doc["attributes"]["platform"];
112
- } else {
113
- to_emit["platform"] = "Undefined";
114
- }
115
- if (doc["attributes"]["platform_version"]) {
116
- to_emit["platform_version"] = doc["attributes"]["platform_version"];
117
- } else {
118
- to_emit["platform_version"] = "Undefined";
119
- }
120
- if (doc["run_list"]) {
121
- to_emit["run_list"] = doc["run_list"];
122
- } else {
123
- to_emit["run_list"] = "Undefined";
124
- }
125
- emit(doc.name, to_emit);
126
- }
127
- }
128
- EOJS
129
- },
130
- "by_run_list" => {
131
- "map" => <<-EOJS
132
- function(doc) {
133
- if (doc.chef_type == "node") {
134
- if (doc['run_list']) {
135
- for (var i=0; i < doc.run_list.length; i++) {
136
- emit(doc['run_list'][i], doc.name);
137
- }
138
- }
139
- }
140
- }
141
- EOJS
142
- },
143
- "by_environment" => {
144
- "map" => <<-EOJS
145
- function(doc) {
146
- if (doc.chef_type == "node") {
147
- var env = (doc['chef_environment'] == null ? "_default" : doc['chef_environment']);
148
- emit(env, doc.name);
149
- }
150
- }
151
- EOJS
152
- }
153
- },
154
- }
155
62
 
156
63
  # Create a new Chef::Node object.
157
- def initialize(couchdb=nil)
64
+ def initialize
158
65
  @name = nil
159
66
 
160
67
  @chef_environment = '_default'
161
- @normal_attrs = Mash.new
162
- @override_attrs = Mash.new
163
- @default_attrs = Mash.new
164
- @automatic_attrs = Mash.new
165
68
  @run_list = Chef::RunList.new
166
69
 
167
- @couchdb_rev = nil
168
- @couchdb_id = nil
169
- @couchdb = couchdb || Chef::CouchDB.new
170
-
171
- @run_state = {
172
- :template_cache => Hash.new,
173
- :seen_recipes => Hash.new,
174
- :seen_attributes => Hash.new
175
- }
176
- # TODO: 5/20/2010 need this here as long as other objects try to access
177
- # the cookbook collection via Node, otherwise get NoMethodError on nil.
178
- @cookbook_collection = CookbookCollection.new
179
- end
70
+ @attributes = Chef::Node::Attribute.new({}, {}, {}, {})
180
71
 
181
- def couchdb_id=(value)
182
- @couchdb_id = value
183
- @index_id = value
72
+ @run_state = {}
184
73
  end
185
74
 
186
75
  # Used by DSL
@@ -192,24 +81,6 @@ class Chef
192
81
  Chef::REST.new(Chef::Config[:chef_server_url])
193
82
  end
194
83
 
195
- # Find a recipe for this Chef::Node by fqdn. Will search first for
196
- # Chef::Config["node_path"]/fqdn.rb, then hostname.rb, then default.rb.
197
- #
198
- # Returns a new Chef::Node object.
199
- #
200
- # Raises an ArgumentError if it cannot find the node.
201
- def find_file(fqdn)
202
- host_parts = fqdn.split(".")
203
- hostname = host_parts[0]
204
-
205
- [fqdn, hostname, "default"].each { |fname|
206
- node_file = File.join(Chef::Config[:node_path], "#{fname.to_s}.rb")
207
- return self.from_file(node_file) if File.exists?(node_file)
208
- }
209
-
210
- raise ArgumentError, "Cannot find a node matching #{fqdn}, not even with default.rb!"
211
- end
212
-
213
84
  # Set the name of this Node, or return the current name.
214
85
  def name(arg=nil)
215
86
  if arg != nil
@@ -233,91 +104,109 @@ class Chef
233
104
  )
234
105
  end
235
106
 
236
- # Used by the DSL
237
- def attribute
238
- construct_attributes
107
+ def chef_environment=(environment)
108
+ chef_environment(environment)
239
109
  end
240
110
 
241
- def construct_attributes
242
- Chef::Node::Attribute.new(normal_attrs, default_attrs, override_attrs, automatic_attrs)
243
- end
111
+ alias :environment :chef_environment
244
112
 
245
- def attribute=(value)
246
- self.normal_attrs = value
113
+ def attributes
114
+ @attributes
247
115
  end
248
116
 
117
+ alias :attribute :attributes
118
+ alias :construct_attributes :attributes
119
+
249
120
  # Return an attribute of this node. Returns nil if the attribute is not found.
250
121
  def [](attrib)
251
- construct_attributes[attrib]
252
- end
253
-
254
- # Set an attribute of this node
255
- def []=(attrib, value)
256
- construct_attributes[attrib] = value
257
- end
258
-
259
- def store(attrib, value)
260
- self[attrib] = value
122
+ attributes[attrib]
261
123
  end
262
124
 
263
- # Set a normal attribute of this node, but auto-vivifiy any Mashes that
125
+ # Set a normal attribute of this node, but auto-vivify any Mashes that
264
126
  # might be missing
265
127
  def normal
266
- attrs = construct_attributes
267
- attrs.set_type = :normal
268
- attrs.auto_vivifiy_on_read = true
269
- attrs
128
+ attributes.normal
270
129
  end
271
130
 
272
131
  alias_method :set, :normal
273
132
 
274
- # Set a normal attribute of this node, auto-vivifiying any mashes that are
133
+ # Set a normal attribute of this node, auto-vivifying any mashes that are
275
134
  # missing, but if the final value already exists, don't set it
276
135
  def normal_unless
277
- attrs = construct_attributes
278
- attrs.set_type = :normal
279
- attrs.auto_vivifiy_on_read = true
280
- attrs.set_unless_value_present = true
281
- attrs
136
+ attributes.set_unless_value_present = true
137
+ attributes.normal
282
138
  end
283
139
  alias_method :set_unless, :normal_unless
284
140
 
285
- # Set a default of this node, but auto-vivifiy any Mashes that might
141
+ # Set a default of this node, but auto-vivify any Mashes that might
286
142
  # be missing
287
143
  def default
288
- attrs = construct_attributes
289
- attrs.set_type = :default
290
- attrs.auto_vivifiy_on_read = true
291
- attrs
144
+ attributes.default
145
+ end
146
+
147
+ # Set a force default attribute. Intermediate mashes will be created by
148
+ # auto-vivify if necessary.
149
+ def default!
150
+ attributes.default!
292
151
  end
293
152
 
294
- # Set a default attribute of this node, auto-vivifiying any mashes that are
153
+ # Set a default attribute of this node, auto-vivifying any mashes that are
295
154
  # missing, but if the final value already exists, don't set it
296
155
  def default_unless
297
- attrs = construct_attributes
298
- attrs.set_type = :default
299
- attrs.auto_vivifiy_on_read = true
300
- attrs.set_unless_value_present = true
301
- attrs
156
+ attributes.set_unless_value_present = true
157
+ attributes.default
302
158
  end
303
159
 
304
- # Set an override attribute of this node, but auto-vivifiy any Mashes that
160
+ # Set an override attribute of this node, but auto-vivify any Mashes that
305
161
  # might be missing
306
162
  def override
307
- attrs = construct_attributes
308
- attrs.set_type = :override
309
- attrs.auto_vivifiy_on_read = true
310
- attrs
163
+ attributes.override
311
164
  end
312
165
 
313
- # Set an override attribute of this node, auto-vivifiying any mashes that
166
+ # Set a force override attribute. Intermediate mashes will be created by
167
+ # auto-vivify if needed.
168
+ def override!
169
+ attributes.override!
170
+ end
171
+
172
+ # Set an override attribute of this node, auto-vivifying any mashes that
314
173
  # are missing, but if the final value already exists, don't set it
315
174
  def override_unless
316
- attrs = construct_attributes
317
- attrs.set_type = :override
318
- attrs.auto_vivifiy_on_read = true
319
- attrs.set_unless_value_present = true
320
- attrs
175
+ attributes.set_unless_value_present = true
176
+ attributes.override
177
+ end
178
+
179
+
180
+ def override_attrs
181
+ attributes.override
182
+ end
183
+
184
+ def override_attrs=(new_values)
185
+ attributes.override = new_values
186
+ end
187
+
188
+ def default_attrs
189
+ attributes.default
190
+ end
191
+
192
+ def default_attrs=(new_values)
193
+ attributes.default = new_values
194
+ end
195
+
196
+ def normal_attrs
197
+ attributes.normal
198
+ end
199
+
200
+ def normal_attrs=(new_values)
201
+ attributes.normal = new_values
202
+ end
203
+
204
+ def automatic_attrs
205
+ attributes.automatic
206
+ end
207
+
208
+ def automatic_attrs=(new_values)
209
+ attributes.automatic = new_values
321
210
  end
322
211
 
323
212
  # Return true if this Node has a given attribute, false if not. Takes either a symbol or
@@ -326,36 +215,33 @@ class Chef
326
215
  # Only works on the top level. Preferred way is to use the normal [] style
327
216
  # lookup and call attribute?()
328
217
  def attribute?(attrib)
329
- construct_attributes.attribute?(attrib)
218
+ attributes.attribute?(attrib)
330
219
  end
331
220
 
332
221
  # Yield each key of the top level to the block.
333
222
  def each(&block)
334
- construct_attributes.each(&block)
223
+ attributes.each(&block)
335
224
  end
336
225
 
337
226
  # Iterates over each attribute, passing the attribute and value to the block.
338
227
  def each_attribute(&block)
339
- construct_attributes.each_attribute(&block)
228
+ attributes.each_attribute(&block)
340
229
  end
341
230
 
342
- # Encouraged to only get used for lookups - while you can do sets from here, it's not as explicit
343
- # as using the normal/default/override interface.
231
+ # Only works for attribute fetches, setting is no longer supported
344
232
  def method_missing(symbol, *args)
345
- attrs = construct_attributes
346
- attrs.send(symbol, *args)
233
+ attributes.send(symbol, *args)
347
234
  end
348
235
 
349
236
  # Returns true if this Node expects a given recipe, false if not.
350
237
  #
351
238
  # First, the run list is consulted to see whether the recipe is
352
239
  # explicitly included. If it's not there, it looks in
353
- # run_state[:seen_recipes], which is populated by include_recipe
354
- # statements in the DSL (and thus would not be in the run list).
240
+ # `node[:recipes]`, which is populated when the run_list is expanded
355
241
  #
356
242
  # NOTE: It's used by cookbook authors
357
243
  def recipe?(recipe_name)
358
- run_list.include?(recipe_name) || run_state[:seen_recipes].include?(recipe_name)
244
+ run_list.include?(recipe_name) || Array(self[:recipes]).include?(recipe_name)
359
245
  end
360
246
 
361
247
  # Returns true if this Node expects a given role, false if not.
@@ -379,26 +265,26 @@ class Chef
379
265
  Chef::Log.debug("Extracting run list from JSON attributes provided on command line")
380
266
  consume_attributes(json_cli_attrs)
381
267
 
382
- @automatic_attrs = ohai_data
268
+ self.automatic_attrs = ohai_data
383
269
 
384
270
  platform, version = Chef::Platform.find_platform_and_version(self)
385
271
  Chef::Log.debug("Platform is #{platform} version #{version}")
386
- @automatic_attrs[:platform] = platform
387
- @automatic_attrs[:platform_version] = version
272
+ self.automatic[:platform] = platform
273
+ self.automatic[:platform_version] = version
388
274
  end
389
275
 
390
276
  # Consumes the combined run_list and other attributes in +attrs+
391
277
  def consume_attributes(attrs)
392
278
  normal_attrs_to_merge = consume_run_list(attrs)
393
279
  Chef::Log.debug("Applying attributes from json file")
394
- @normal_attrs = Chef::Mixin::DeepMerge.horizontal_merge(@normal_attrs,normal_attrs_to_merge)
280
+ self.normal_attrs = Chef::Mixin::DeepMerge.merge(normal_attrs,normal_attrs_to_merge)
395
281
  self.tags # make sure they're defined
396
282
  end
397
283
 
398
284
  # Lazy initializer for tags attribute
399
285
  def tags
400
- self.set[:tags] = [] unless attribute?(:tags)
401
- self[:tags]
286
+ normal[:tags] = [] unless attribute?(:tags)
287
+ normal[:tags]
402
288
  end
403
289
 
404
290
  # Extracts the run list from +attrs+ and applies it. Returns the remaining attributes
@@ -417,8 +303,8 @@ class Chef
417
303
  # Clear defaults and overrides, so that any deleted attributes
418
304
  # between runs are still gone.
419
305
  def reset_defaults_and_overrides
420
- @default_attrs = Mash.new
421
- @override_attrs = Mash.new
306
+ self.default.clear
307
+ self.override.clear
422
308
  end
423
309
 
424
310
  # Expands the node's run list and sets the default and override
@@ -439,8 +325,10 @@ class Chef
439
325
 
440
326
  self.tags # make sure they're defined
441
327
 
442
- @automatic_attrs[:recipes] = expansion.recipes
443
- @automatic_attrs[:roles] = expansion.roles
328
+ automatic_attrs[:recipes] = expansion.recipes
329
+ automatic_attrs[:roles] = expansion.roles
330
+
331
+ apply_expansion_attributes(expansion)
444
332
 
445
333
  expansion
446
334
  end
@@ -448,13 +336,17 @@ class Chef
448
336
  # Apply the default and overrides attributes from the expansion
449
337
  # passed in, which came from roles.
450
338
  def apply_expansion_attributes(expansion)
451
- load_chef_environment_object = (chef_environment == "_default" ? nil : Chef::Environment.load(chef_environment))
452
- environment_default_attrs = load_chef_environment_object.nil? ? {} : load_chef_environment_object.default_attributes
453
- default_before_roles = Chef::Mixin::DeepMerge.horizontal_merge(default_attrs, environment_default_attrs)
454
- @default_attrs = Chef::Mixin::DeepMerge.horizontal_merge(default_before_roles, expansion.default_attrs)
455
- environment_override_attrs = load_chef_environment_object.nil? ? {} : load_chef_environment_object.override_attributes
456
- overrides_before_environments = Chef::Mixin::DeepMerge.horizontal_merge(override_attrs, expansion.override_attrs)
457
- @override_attrs = Chef::Mixin::DeepMerge.horizontal_merge(overrides_before_environments, environment_override_attrs)
339
+ loaded_environment = if chef_environment == "_default"
340
+ Chef::Environment.new.tap {|e| e.name("_default")}
341
+ else
342
+ Chef::Environment.load(chef_environment)
343
+ end
344
+
345
+ attributes.env_default = loaded_environment.default_attributes
346
+ attributes.env_override = loaded_environment.override_attributes
347
+
348
+ attribute.role_default = expansion.default_attrs
349
+ attributes.role_override = expansion.override_attrs
458
350
  end
459
351
 
460
352
  # Transform the node to a Hash
@@ -478,36 +370,39 @@ class Chef
478
370
  display["chef_environment"] = chef_environment
479
371
  display["automatic"] = automatic_attrs
480
372
  display["normal"] = normal_attrs
481
- display["default"] = default_attrs
482
- display["override"] = override_attrs
373
+ display["default"] = attributes.combined_default
374
+ display["override"] = attributes.combined_override
483
375
  display["run_list"] = run_list.run_list
484
376
  display
485
377
  end
486
378
 
487
379
  # Serialize this object as a hash
488
380
  def to_json(*a)
381
+ for_json.to_json(*a)
382
+ end
383
+
384
+ def for_json
489
385
  result = {
490
386
  "name" => name,
491
387
  "chef_environment" => chef_environment,
492
388
  'json_class' => self.class.name,
493
- "automatic" => automatic_attrs,
494
- "normal" => normal_attrs,
389
+ "automatic" => attributes.automatic,
390
+ "normal" => attributes.normal,
495
391
  "chef_type" => "node",
496
- "default" => default_attrs,
497
- "override" => override_attrs,
392
+ "default" => attributes.combined_default,
393
+ "override" => attributes.combined_override,
498
394
  #Render correctly for run_list items so malformed json does not result
499
395
  "run_list" => run_list.run_list.map { |item| item.to_s }
500
396
  }
501
- result["_rev"] = couchdb_rev if couchdb_rev
502
- result.to_json(*a)
397
+ result
503
398
  end
504
399
 
505
400
  def update_from!(o)
506
401
  run_list.reset!(o.run_list)
507
- @automatic_attrs = o.automatic_attrs
508
- @normal_attrs = o.normal_attrs
509
- @override_attrs = o.override_attrs
510
- @default_attrs = o.default_attrs
402
+ self.automatic_attrs = o.automatic_attrs
403
+ self.normal_attrs = o.normal_attrs
404
+ self.override_attrs = o.override_attrs
405
+ self.default_attrs = o.default_attrs
511
406
  chef_environment(o.chef_environment)
512
407
  self
513
408
  end
@@ -530,17 +425,9 @@ class Chef
530
425
  else
531
426
  o["recipes"].each { |r| node.recipes << r }
532
427
  end
533
- node.couchdb_rev = o["_rev"] if o.has_key?("_rev")
534
- node.couchdb_id = o["_id"] if o.has_key?("_id")
535
- node.index_id = node.couchdb_id
536
428
  node
537
429
  end
538
430
 
539
- def self.cdb_list_by_environment(environment, inflate=false, couchdb=nil)
540
- rs = (couchdb || Chef::CouchDB.new).get_view("nodes", "by_environment", :include_docs => inflate, :startkey => environment, :endkey => environment)
541
- inflate ? rs["rows"].collect {|r| r["doc"]} : rs["rows"].collect {|r| r["value"]}
542
- end
543
-
544
431
  def self.list_by_environment(environment, inflate=false)
545
432
  if inflate
546
433
  response = Hash.new
@@ -551,14 +438,6 @@ class Chef
551
438
  end
552
439
  end
553
440
 
554
- # List all the Chef::Node objects in the CouchDB. If inflate is set to true, you will get
555
- # the full list of all Nodes, fully inflated.
556
- def self.cdb_list(inflate=false, couchdb=nil)
557
- rs =(couchdb || Chef::CouchDB.new).list("nodes", inflate)
558
- lookup = (inflate ? "value" : "key")
559
- rs["rows"].collect { |r| r[lookup] }
560
- end
561
-
562
441
  def self.list(inflate=false)
563
442
  if inflate
564
443
  response = Hash.new
@@ -571,19 +450,6 @@ class Chef
571
450
  end
572
451
  end
573
452
 
574
- # Load a node by name from CouchDB
575
- def self.cdb_load(name, couchdb=nil)
576
- (couchdb || Chef::CouchDB.new).load("node", name)
577
- end
578
-
579
- def self.exists?(nodename, couchdb)
580
- begin
581
- self.cdb_load(nodename, couchdb)
582
- rescue Chef::Exceptions::CouchDBNotFound
583
- nil
584
- end
585
- end
586
-
587
453
  def self.find_or_create(node_name)
588
454
  load(node_name)
589
455
  rescue Net::HTTPServerException => e
@@ -595,7 +461,7 @@ class Chef
595
461
  def self.build(node_name)
596
462
  node = new
597
463
  node.name(node_name)
598
- node.chef_environment(Chef::Config[:environment]) unless Chef::Config[:environment].nil? || Chef::Config[:environment].chomp.empty?
464
+ node.chef_environment(Chef::Config[:environment]) unless Chef::Config[:environment].nil? || Chef::Config[:environment].chop.empty?
599
465
  node
600
466
  end
601
467
 
@@ -604,21 +470,11 @@ class Chef
604
470
  Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes/#{name}")
605
471
  end
606
472
 
607
- # Remove this node from the CouchDB
608
- def cdb_destroy
609
- couchdb.delete("node", name, couchdb_rev)
610
- end
611
-
612
473
  # Remove this node via the REST API
613
474
  def destroy
614
475
  chef_server_rest.delete_rest("nodes/#{name}")
615
476
  end
616
477
 
617
- # Save this node to the CouchDB
618
- def cdb_save
619
- @couchdb_rev = couchdb.store("node", name, self)["rev"]
620
- end
621
-
622
478
  # Save this node via the REST API
623
479
  def save
624
480
  # Try PUT. If the node doesn't yet exist, PUT will return 404,
@@ -642,41 +498,9 @@ class Chef
642
498
  self
643
499
  end
644
500
 
645
- # Set up our CouchDB design document
646
- def self.create_design_document(couchdb=nil)
647
- (couchdb || Chef::CouchDB.new).create_design_document("nodes", DESIGN_DOCUMENT)
648
- end
649
-
650
501
  def to_s
651
502
  "node[#{name}]"
652
503
  end
653
504
 
654
- # Load all attribute files for all cookbooks associated with this
655
- # node.
656
- def load_attributes
657
- cookbook_collection.values.each do |cookbook|
658
- cookbook.segment_filenames(:attributes).each do |segment_filename|
659
- Chef::Log.debug("Node #{name} loading cookbook #{cookbook.name}'s attribute file #{segment_filename}")
660
- self.from_file(segment_filename)
661
- end
662
- end
663
- end
664
-
665
- # Used by DSL.
666
- # Loads the attribute file specified by the short name of the
667
- # file, e.g., loads specified cookbook's
668
- # "attributes/mailservers.rb"
669
- # if passed
670
- # "mailservers"
671
- def load_attribute_by_short_filename(name, src_cookbook_name)
672
- src_cookbook = cookbook_collection[src_cookbook_name]
673
- raise Chef::Exceptions::CookbookNotFound, "could not find cookbook #{src_cookbook_name} while loading attribute #{name}" unless src_cookbook
674
-
675
- attribute_filename = src_cookbook.attribute_filenames_by_short_filename[name]
676
- raise Chef::Exceptions::AttributeNotFound, "could not find filename for attribute #{name} in cookbook #{src_cookbook_name}" unless attribute_filename
677
-
678
- self.from_file(attribute_filename)
679
- self
680
- end
681
505
  end
682
506
  end