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
@@ -25,31 +25,36 @@ require 'chef/cookbook_version'
25
25
  require 'chef/cookbook/chefignore'
26
26
  require 'chef/cookbook/metadata'
27
27
 
28
+ #
29
+ # CookbookLoader class loads the cookbooks lazily as read
30
+ #
28
31
  class Chef
29
32
  class CookbookLoader
30
33
 
31
- attr_accessor :metadata
32
34
  attr_reader :cookbooks_by_name
33
35
  attr_reader :merged_cookbooks
34
36
  attr_reader :cookbook_paths
37
+ attr_reader :metadata
35
38
 
36
39
  include Enumerable
37
40
 
38
41
  def initialize(*repo_paths)
39
- @repo_paths = repo_paths.flatten
40
- raise ArgumentError, "You must specify at least one cookbook repo path" if @repo_paths.empty?
42
+ repo_paths = repo_paths.flatten
43
+ raise ArgumentError, "You must specify at least one cookbook repo path" if repo_paths.empty?
41
44
  @cookbooks_by_name = Mash.new
42
45
  @loaded_cookbooks = {}
43
46
  @metadata = Mash.new
44
47
  @cookbooks_paths = Hash.new {|h,k| h[k] = []} # for deprecation warnings
48
+ @chefignores = {}
49
+ @repo_paths = repo_paths.map do |repo_path|
50
+ repo_path = File.expand_path(repo_path)
51
+ end
45
52
 
46
53
  # Used to track which cookbooks appear in multiple places in the cookbook repos
47
54
  # and are merged in to a single cookbook by file shadowing. This behavior is
48
55
  # deprecated, so users of this class may issue warnings to the user by checking
49
56
  # this variable
50
57
  @merged_cookbooks = []
51
-
52
- load_cookbooks
53
58
  end
54
59
 
55
60
  def merged_cookbook_paths # for deprecation warnings
@@ -59,35 +64,43 @@ class Chef
59
64
  end
60
65
 
61
66
  def load_cookbooks
62
- cookbook_settings = Hash.new
63
67
  @repo_paths.each do |repo_path|
64
- repo_path = File.expand_path(repo_path)
65
- chefignore = Cookbook::Chefignore.new(repo_path)
66
68
  Dir[File.join(repo_path, "*")].each do |cookbook_path|
67
- next unless File.directory?(cookbook_path)
68
- loader = Cookbook::CookbookVersionLoader.new(cookbook_path, chefignore)
69
- loader.load_cookbooks
70
- next if loader.empty?
71
- @cookbooks_paths[loader.cookbook_name] << cookbook_path # for deprecation warnings
72
- if @loaded_cookbooks.key?(loader.cookbook_name)
73
- @merged_cookbooks << loader.cookbook_name # for deprecation warnings
74
- @loaded_cookbooks[loader.cookbook_name].merge!(loader)
75
- else
76
- @loaded_cookbooks[loader.cookbook_name] = loader
77
- end
69
+ load_cookbook(File.basename(cookbook_path), [repo_path])
70
+ end
71
+ end
72
+ @cookbooks_by_name
73
+ end
74
+
75
+ def load_cookbook(cookbook_name, repo_paths=nil)
76
+ repo_paths ||= @repo_paths
77
+ repo_paths.each do |repo_path|
78
+ @chefignores[repo_path] ||= Cookbook::Chefignore.new(repo_path)
79
+ cookbook_path = File.join(repo_path, cookbook_name.to_s)
80
+ next unless File.directory?(cookbook_path) and Dir[File.join(repo_path, "*")].include?(cookbook_path)
81
+ loader = Cookbook::CookbookVersionLoader.new(cookbook_path, @chefignores[repo_path])
82
+ loader.load_cookbooks
83
+ next if loader.empty?
84
+ cookbook_name = loader.cookbook_name
85
+ @cookbooks_paths[cookbook_name] << cookbook_path # for deprecation warnings
86
+ if @loaded_cookbooks.key?(cookbook_name)
87
+ @merged_cookbooks << cookbook_name # for deprecation warnings
88
+ @loaded_cookbooks[cookbook_name].merge!(loader)
89
+ else
90
+ @loaded_cookbooks[cookbook_name] = loader
78
91
  end
79
92
  end
80
93
 
81
- @loaded_cookbooks.each do |cookbook, loader|
82
- cookbook_version = loader.cookbook_version
83
- @cookbooks_by_name[cookbook] = cookbook_version
84
- @metadata[cookbook] = cookbook_version.metadata
94
+ if @loaded_cookbooks.has_key?(cookbook_name)
95
+ cookbook_version = @loaded_cookbooks[cookbook_name].cookbook_version
96
+ @cookbooks_by_name[cookbook_name] = cookbook_version
97
+ @metadata[cookbook_name] = cookbook_version.metadata
85
98
  end
86
- @cookbooks_by_name
99
+ @cookbooks_by_name[cookbook_name]
87
100
  end
88
101
 
89
102
  def [](cookbook)
90
- if @cookbooks_by_name.has_key?(cookbook.to_sym)
103
+ if @cookbooks_by_name.has_key?(cookbook.to_sym) or load_cookbook(cookbook.to_sym)
91
104
  @cookbooks_by_name[cookbook.to_sym]
92
105
  else
93
106
  raise Exceptions::CookbookNotFoundInRepo, "Cannot find a cookbook named #{cookbook.to_s}; did you forget to add metadata to a cookbook? (http://wiki.opscode.com/display/chef/Metadata)"
@@ -97,7 +110,7 @@ class Chef
97
110
  alias :fetch :[]
98
111
 
99
112
  def has_key?(cookbook_name)
100
- @cookbooks_by_name.has_key?(cookbook_name)
113
+ not self[cookbook_name.to_sym].nil?
101
114
  end
102
115
  alias :cookbook_exists? :has_key?
103
116
  alias :key? :has_key?
@@ -3,11 +3,11 @@ require 'set'
3
3
  require 'rest_client'
4
4
  require 'chef/exceptions'
5
5
  require 'chef/knife/cookbook_metadata'
6
- require 'chef/checksum_cache'
7
- require 'chef/sandbox'
6
+ require 'chef/digester'
8
7
  require 'chef/cookbook_version'
9
8
  require 'chef/cookbook/syntax_check'
10
9
  require 'chef/cookbook/file_system_file_vendor'
10
+ require 'chef/sandbox'
11
11
 
12
12
  class Chef
13
13
  class CookbookUploader
@@ -110,16 +110,7 @@ class Chef
110
110
  # files are uploaded, so save the manifest
111
111
  cookbooks.each do |cb|
112
112
  save_url = opts[:force] ? cb.force_save_url : cb.save_url
113
- begin
114
- rest.put_rest(save_url, cb)
115
- rescue Net::HTTPServerException => e
116
- case e.response.code
117
- when "409"
118
- raise Chef::Exceptions::CookbookFrozen, "Version #{cb.version} of cookbook #{cb.name} is frozen. Use --force to override."
119
- else
120
- raise
121
- end
122
- end
113
+ rest.put_rest(save_url, cb)
123
114
  end
124
115
 
125
116
  Chef::Log.info("Upload complete!")
@@ -134,17 +125,24 @@ class Chef
134
125
  # but we need the base64 encoding for the content-md5
135
126
  # header
136
127
  checksum64 = Base64.encode64([checksum].pack("H*")).strip
128
+ timestamp = Time.now.utc.iso8601
137
129
  file_contents = File.open(file, "rb") {|f| f.read}
138
- headers = { 'content-type' => 'application/x-binary', 'content-md5' => checksum64, 'accept' => 'application/json' }
130
+ # TODO - 5/28/2010, cw: make signing and sending the request streaming
131
+ sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(
132
+ :http_method => :put,
133
+ :path => URI.parse(url).path,
134
+ :body => file_contents,
135
+ :timestamp => timestamp,
136
+ :user_id => rest.client_name
137
+ )
138
+ headers = { 'content-type' => 'application/x-binary', 'content-md5' => checksum64, :accept => 'application/json' }
139
+ headers.merge!(sign_obj.sign(OpenSSL::PKey::RSA.new(rest.signing_key)))
139
140
 
140
141
  begin
141
- url = rest.create_url(url)
142
- rest.raw_http_request(:PUT, url, headers, file_contents)
142
+ RestClient::Resource.new(url, :headers=>headers, :timeout=>1800, :open_timeout=>1800).put(file_contents)
143
143
  checksums_to_upload.delete(checksum)
144
- rescue Net::HTTPServerException, Net::HTTPFatalError, Errno::ECONNREFUSED, Timeout::Error, Errno::ETIMEDOUT, SocketError => e
145
- error_message = "Failed to upload #{file} (#{checksum}) to #{url} : #{e.message}"
146
- error_message << "\n#{e.response.body}" if e.respond_to?(:response)
147
- Chef::Knife.ui.error(error_message)
144
+ rescue RestClient::Exception => e
145
+ Chef::Knife.ui.error("Failed to upload #@cookbook : #{e.message}\n#{e.response.body}")
148
146
  raise
149
147
  end
150
148
  end
@@ -24,86 +24,11 @@ require 'chef/node'
24
24
  require 'chef/resource_definition_list'
25
25
  require 'chef/recipe'
26
26
  require 'chef/cookbook/file_vendor'
27
- require 'chef/checksum'
28
27
  require 'chef/cookbook/metadata'
29
28
  require 'chef/version_class'
30
29
 
31
30
  class Chef
32
31
 
33
- #== Chef::MinimalCookbookVersion
34
- # MinimalCookbookVersion is a duck type of CookbookVersion, used
35
- # internally by Chef Server as an optimization when determining the
36
- # optimal cookbook set for a chef-client.
37
- #
38
- # MinimalCookbookVersion objects contain only enough information to
39
- # solve the cookbook collection for a given run list. They *do not*
40
- # contain enough information to generate the response.
41
- #
42
- # See also: Chef::CookbookVersionSelector
43
- class MinimalCookbookVersion
44
-
45
- include Comparable
46
-
47
- ID = "id".freeze
48
- NAME = 'name'.freeze
49
- KEY = 'key'.freeze
50
- VERSION = 'version'.freeze
51
- VALUE = 'value'.freeze
52
- DEPS = 'deps'.freeze
53
-
54
- DEPENDENCIES = 'dependencies'.freeze
55
-
56
- # Loads the full list of cookbooks, using a couchdb view to fetch
57
- # only the id, name, version, and dependency constraints. This is
58
- # enough information to solve for the cookbook collection for a
59
- # given run list. After solving for the cookbook collection, you
60
- # need to call +load_full_versions_of+ to convert
61
- # MinimalCookbookVersion objects to their non-minimal counterparts
62
- def self.load_all(couchdb)
63
- # Example:
64
- # {"id"=>"1a806f1c-b409-4d8e-abab-fa414ff5b96d", "key"=>"activemq", "value"=>{"version"=>"0.3.3", "deps"=>{"java"=>">= 0.0.0", "runit"=>">= 0.0.0"}}}
65
- couchdb ||= Chef::CouchDB.new
66
- couchdb.get_view("cookbooks", "all_with_version_and_deps")["rows"].map {|params| self.new(params) }
67
- end
68
-
69
- # Loads the non-minimal CookbookVersion objects corresponding to
70
- # +minimal_cookbook_versions+ from couchdb using a bulk GET.
71
- def self.load_full_versions_of(minimal_cookbook_versions, couchdb)
72
- database_ids = Array(minimal_cookbook_versions).map {|mcv| mcv.couchdb_id }
73
- couchdb ||= Chef::CouchDB.new
74
- couchdb.bulk_get(*database_ids)
75
- end
76
-
77
- attr_reader :couchdb_id
78
- attr_reader :name
79
- attr_reader :version
80
- attr_reader :deps
81
-
82
- def initialize(params)
83
- @couchdb_id = params[ID]
84
- @name = params[KEY]
85
- @version = params[VALUE][VERSION]
86
- @deps = params[VALUE][DEPS]
87
- end
88
-
89
- # Returns the Cookbook::MinimalMetadata object for this cookbook
90
- # version.
91
- def metadata
92
- @metadata ||= Cookbook::MinimalMetadata.new(@name, DEPENDENCIES => @deps)
93
- end
94
-
95
- def legit_version
96
- @legit_version ||= Chef::Version.new(@version)
97
- end
98
-
99
- def <=>(o)
100
- raise Chef::Exceptions::CookbookVersionNameMismatch if self.name != o.name
101
- raise "Unexpected comparison to #{o}" unless o.respond_to?(:legit_version)
102
- legit_version <=> o.legit_version
103
- end
104
- end
105
-
106
-
107
32
  # == Chef::CookbookVersion
108
33
  # CookbookVersion is a model object encapsulating the data about a Chef
109
34
  # cookbook. Chef supports maintaining multiple versions of a cookbook on a
@@ -113,140 +38,10 @@ class Chef
113
38
  # TODO: timh/cw: 5-24-2010: mutators for files (e.g., recipe_filenames=,
114
39
  # recipe_filenames.insert) should dirty the manifest so it gets regenerated.
115
40
  class CookbookVersion
116
- include Chef::IndexQueue::Indexable
117
41
  include Comparable
118
42
 
119
43
  COOKBOOK_SEGMENTS = [ :resources, :providers, :recipes, :definitions, :libraries, :attributes, :files, :templates, :root_files ]
120
44
 
121
- DESIGN_DOCUMENT = {
122
- "version" => 8,
123
- "language" => "javascript",
124
- "views" => {
125
- "all" => {
126
- "map" => <<-EOJS
127
- function(doc) {
128
- if (doc.chef_type == "cookbook_version") {
129
- emit(doc.name, doc);
130
- }
131
- }
132
- EOJS
133
- },
134
- "all_id" => {
135
- "map" => <<-EOJS
136
- function(doc) {
137
- if (doc.chef_type == "cookbook_version") {
138
- emit(doc.name, doc.name);
139
- }
140
- }
141
- EOJS
142
- },
143
- "all_with_version" => {
144
- "map" => <<-EOJS
145
- function(doc) {
146
- if (doc.chef_type == "cookbook_version") {
147
- emit(doc.cookbook_name, doc.version);
148
- }
149
- }
150
- EOJS
151
- },
152
- "all_with_version_and_deps" => {
153
- "map" => <<-JS
154
- function(doc) {
155
- if (doc.chef_type == "cookbook_version") {
156
- emit(doc.cookbook_name, {version: doc.version, deps: doc.metadata.dependencies});
157
- }
158
- }
159
- JS
160
- },
161
- "all_latest_version" => {
162
- "map" => %q@
163
- function(doc) {
164
- if (doc.chef_type == "cookbook_version") {
165
- emit(doc.cookbook_name, doc.version);
166
- }
167
- }
168
- @,
169
- "reduce" => %q@
170
- function(keys, values, rereduce) {
171
- var result = null;
172
-
173
- for (var idx in values) {
174
- var value = values[idx];
175
-
176
- if (idx == 0) {
177
- result = value;
178
- continue;
179
- }
180
-
181
- var valueParts = value.split('.').map(function(v) { return parseInt(v); });
182
- var resultParts = result.split('.').map(function(v) { return parseInt(v); });
183
-
184
- if (valueParts[0] != resultParts[0]) {
185
- if (valueParts[0] > resultParts[0]) {
186
- result = value;
187
- }
188
- }
189
- else if (valueParts[1] != resultParts[1]) {
190
- if (valueParts[1] > resultParts[1]) {
191
- result = value;
192
- }
193
- }
194
- else if (valueParts[2] != resultParts[2]) {
195
- if (valueParts[2] > resultParts[2]) {
196
- result = value;
197
- }
198
- }
199
- }
200
- return result;
201
- }
202
- @
203
- },
204
- "all_latest_version_by_id" => {
205
- "map" => %q@
206
- function(doc) {
207
- if (doc.chef_type == "cookbook_version") {
208
- emit(doc.cookbook_name, {version: doc.version, id:doc._id});
209
- }
210
- }
211
- @,
212
- "reduce" => %q@
213
- function(keys, values, rereduce) {
214
- var result = null;
215
-
216
- for (var idx in values) {
217
- var value = values[idx];
218
-
219
- if (idx == 0) {
220
- result = value;
221
- continue;
222
- }
223
-
224
- var valueParts = value.version.split('.').map(function(v) { return parseInt(v); });
225
- var resultParts = result.version.split('.').map(function(v) { return parseInt(v); });
226
-
227
- if (valueParts[0] != resultParts[0]) {
228
- if (valueParts[0] > resultParts[0]) {
229
- result = value;
230
- }
231
- }
232
- else if (valueParts[1] != resultParts[1]) {
233
- if (valueParts[1] > resultParts[1]) {
234
- result = value;
235
- }
236
- }
237
- else if (valueParts[2] != resultParts[2]) {
238
- if (valueParts[2] > resultParts[2]) {
239
- result = value;
240
- }
241
- }
242
- }
243
- return result;
244
- }
245
- @
246
- },
247
- }
248
- }
249
-
250
45
  attr_accessor :root_dir
251
46
  attr_accessor :definition_filenames
252
47
  attr_accessor :template_filenames
@@ -259,10 +54,6 @@ class Chef
259
54
  attr_accessor :metadata
260
55
  attr_accessor :metadata_filenames
261
56
  attr_accessor :status
262
- attr_accessor :couchdb_rev
263
- attr_accessor :couchdb
264
-
265
- attr_reader :couchdb_id
266
57
 
267
58
  # attribute_filenames also has a setter that has non-default
268
59
  # functionality.
@@ -278,7 +69,7 @@ class Chef
278
69
  # This is the one and only method that knows how cookbook files'
279
70
  # checksums are generated.
280
71
  def self.checksum_cookbook_file(filepath)
281
- Chef::ChecksumCache.generate_md5_checksum_for_file(filepath)
72
+ Chef::Digester.generate_md5_checksum_for_file(filepath)
282
73
  rescue Errno::ENOENT
283
74
  Chef::Log.debug("File #{filepath} does not exist, so there is no checksum to generate")
284
75
  nil
@@ -401,7 +192,7 @@ class Chef
401
192
  #
402
193
  # === Returns
403
194
  # object<Chef::CookbookVersion>:: Duh. :)
404
- def initialize(name, couchdb=nil)
195
+ def initialize(name)
405
196
  @name = name
406
197
  @frozen = false
407
198
  @attribute_filenames = Array.new
@@ -416,9 +207,6 @@ class Chef
416
207
  @metadata_filenames = Array.new
417
208
  @root_dir = nil
418
209
  @root_filenames = Array.new
419
- @couchdb_id = nil
420
- @couchdb = couchdb || Chef::CouchDB.new
421
- @couchdb_rev = nil
422
210
  @status = :ready
423
211
  @manifest = nil
424
212
  @file_vendor = nil
@@ -761,7 +549,6 @@ class Chef
761
549
  result = manifest.dup
762
550
  result['frozen?'] = frozen_version?
763
551
  result['chef_type'] = 'cookbook_version'
764
- result["_rev"] = couchdb_rev if couchdb_rev
765
552
  result.to_hash
766
553
  end
767
554
 
@@ -773,21 +560,12 @@ class Chef
773
560
 
774
561
  def self.json_create(o)
775
562
  cookbook_version = new(o["cookbook_name"])
776
- if o.has_key?('_rev')
777
- cookbook_version.couchdb_rev = o["_rev"] if o.has_key?("_rev")
778
- o.delete("_rev")
779
- end
780
- if o.has_key?("_id")
781
- cookbook_version.couchdb_id = o["_id"] if o.has_key?("_id")
782
- cookbook_version.index_id = cookbook_version.couchdb_id
783
- o.delete("_id")
784
- end
785
563
  # We want the Chef::Cookbook::Metadata object to always be inflated
786
564
  cookbook_version.metadata = Chef::Cookbook::Metadata.from_hash(o["metadata"])
787
565
  cookbook_version.manifest = o
788
566
 
789
567
  # We don't need the following step when we decide to stop supporting deprecated operators in the metadata (e.g. <<, >>)
790
- cookbook_version.manifest["metadata"] = Chef::JSONCompat.from_json(cookbook_version.metadata.to_json)
568
+ cookbook_version.manifest["metadata"] = JSON.parse(cookbook_version.metadata.to_json)
791
569
 
792
570
  cookbook_version.freeze_version if o["frozen?"]
793
571
  cookbook_version
@@ -888,83 +666,6 @@ class Chef
888
666
  chef_server_rest.get_rest('cookbooks/_latest')
889
667
  end
890
668
 
891
- ##
892
- # Couchdb
893
- ##
894
-
895
- def self.cdb_by_name(cookbook_name, couchdb=nil)
896
- cdb = (couchdb || Chef::CouchDB.new)
897
- options = { :startkey => cookbook_name, :endkey => cookbook_name }
898
- rs = cdb.get_view("cookbooks", "all_with_version", options)
899
- rs["rows"].inject({}) { |memo, row| memo.has_key?(row["key"]) ? memo[row["key"]] << row["value"] : memo[row["key"]] = [ row["value"] ]; memo }
900
- end
901
-
902
- def self.create_design_document(couchdb=nil)
903
- (couchdb || Chef::CouchDB.new).create_design_document("cookbooks", DESIGN_DOCUMENT)
904
- end
905
-
906
- def self.cdb_list_latest(inflate=false, couchdb=nil)
907
- couchdb ||= Chef::CouchDB.new
908
- if inflate
909
- doc_ids = cdb_list_latest_ids.map {|i|i["id"]}
910
- couchdb.bulk_get(doc_ids)
911
- else
912
- results = couchdb.get_view("cookbooks", "all_latest_version", :group=>true)["rows"]
913
- results.inject({}) { |mapped, row| mapped[row["key"]] = row["value"]; mapped}
914
- end
915
- end
916
-
917
- def self.cdb_list_latest_ids(inflate=false, couchdb=nil)
918
- couchdb ||= Chef::CouchDB.new
919
- results = couchdb.get_view("cookbooks", "all_latest_version_by_id", :group=>true)["rows"]
920
- results.map { |name_and_id| name_and_id["value"]}
921
- end
922
-
923
- def self.cdb_list(inflate=false, couchdb=nil)
924
- couchdb ||= Chef::CouchDB.new
925
- if inflate
926
- couchdb.list("cookbooks", true)["rows"].collect{|r| r["value"]}
927
- else
928
- # If you modify this, please make sure the desc sorted order on the versions doesn't get broken.
929
- couchdb.get_view("cookbooks", "all_with_version")["rows"].inject({}) { |mapped, row| mapped[row["key"]]||=Array.new; mapped[row["key"]].push(Chef::Version.new(row["value"])); mapped[row["key"]].sort!.reverse!; mapped}
930
- end
931
- end
932
-
933
- def self.cdb_load(name, version='latest', couchdb=nil)
934
- cdb = couchdb || Chef::CouchDB.new
935
- if version == "latest" || version == "_latest"
936
- rs = cdb.get_view("cookbooks", "all_latest_version", :key => name, :descending => true, :group => true, :reduce => true)["rows"].first
937
- cdb.load("cookbook_version", "#{rs["key"]}-#{rs["value"]}")
938
- else
939
- cdb.load("cookbook_version", "#{name}-#{version}")
940
- end
941
- end
942
-
943
- def cdb_destroy
944
- (couchdb || Chef::CouchDB.new).delete("cookbook_version", full_name, couchdb_rev)
945
- end
946
-
947
- # Runs on Chef Server (API); deletes the cookbook from couchdb and also destroys associated
948
- # checksum documents
949
- def purge
950
- checksums.keys.each do |checksum|
951
- begin
952
- Chef::Checksum.cdb_load(checksum, couchdb).purge
953
- rescue Chef::Exceptions::CouchDBNotFound
954
- end
955
- end
956
- cdb_destroy
957
- end
958
-
959
- def cdb_save
960
- @couchdb_rev = couchdb.store("cookbook_version", full_name, self)["rev"]
961
- end
962
-
963
- def couchdb_id=(value)
964
- @couchdb_id = value
965
- @index_id = value
966
- end
967
-
968
669
  def <=>(o)
969
670
  raise Chef::Exceptions::CookbookVersionNameMismatch if self.name != o.name
970
671
  # FIXME: can we change the interface to the Metadata class such