chef 10.34.6 → 11.0.0.beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +4 -12
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/shef +6 -5
  7. data/distro/common/html/chef-client.8.html +4 -4
  8. data/distro/common/html/chef-expander.8.html +4 -4
  9. data/distro/common/html/chef-expanderctl.8.html +4 -4
  10. data/distro/common/html/chef-server-webui.8.html +4 -4
  11. data/distro/common/html/chef-server.8.html +4 -4
  12. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  13. data/distro/common/html/chef-solo.8.html +18 -12
  14. data/distro/common/html/chef-solr.8.html +4 -4
  15. data/distro/common/html/knife-bootstrap.1.html +4 -4
  16. data/distro/common/html/knife-client.1.html +4 -4
  17. data/distro/common/html/knife-configure.1.html +4 -4
  18. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  19. data/distro/common/html/knife-cookbook.1.html +10 -7
  20. data/distro/common/html/knife-data-bag.1.html +10 -7
  21. data/distro/common/html/knife-environment.1.html +8 -6
  22. data/distro/common/html/knife-exec.1.html +9 -9
  23. data/distro/common/html/knife-index.1.html +4 -4
  24. data/distro/common/html/knife-node.1.html +4 -4
  25. data/distro/common/html/knife-role.1.html +4 -4
  26. data/distro/common/html/knife-search.1.html +4 -4
  27. data/distro/common/html/knife-ssh.1.html +4 -4
  28. data/distro/common/html/knife-status.1.html +4 -4
  29. data/distro/common/html/knife-tag.1.html +4 -4
  30. data/distro/common/html/knife.1.html +8 -13
  31. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  32. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  33. data/distro/common/man/man1/knife-client.1 +1 -1
  34. data/distro/common/man/man1/knife-configure.1 +1 -1
  35. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  36. data/distro/common/man/man1/knife-cookbook.1 +15 -2
  37. data/distro/common/man/man1/knife-data-bag.1 +15 -2
  38. data/distro/common/man/man1/knife-environment.1 +12 -2
  39. data/distro/common/man/man1/knife-exec.1 +4 -7
  40. data/distro/common/man/man1/knife-index.1 +1 -1
  41. data/distro/common/man/man1/knife-node.1 +1 -1
  42. data/distro/common/man/man1/knife-role.1 +1 -1
  43. data/distro/common/man/man1/knife-search.1 +1 -1
  44. data/distro/common/man/man1/knife-ssh.1 +1 -1
  45. data/distro/common/man/man1/knife-status.1 +1 -1
  46. data/distro/common/man/man1/knife-tag.1 +1 -1
  47. data/distro/common/man/man1/knife.1 +3 -6
  48. data/distro/common/man/man8/chef-client.8 +1 -1
  49. data/distro/common/man/man8/chef-expander.8 +1 -1
  50. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  51. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  52. data/distro/common/man/man8/chef-server.8 +1 -1
  53. data/distro/common/man/man8/chef-solo.8 +36 -4
  54. data/distro/common/man/man8/chef-solr.8 +1 -1
  55. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  56. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  57. data/distro/common/markdown/man1/knife.mkd +4 -9
  58. data/distro/debian/etc/default/chef-client +0 -1
  59. data/distro/debian/etc/init.d/chef-client +2 -2
  60. data/lib/chef.rb +2 -5
  61. data/lib/chef/api_client.rb +20 -130
  62. data/lib/chef/api_client/registration.rb +126 -0
  63. data/lib/chef/application.rb +71 -14
  64. data/lib/chef/application/apply.rb +160 -0
  65. data/lib/chef/application/client.rb +25 -18
  66. data/lib/chef/application/knife.rb +0 -2
  67. data/lib/chef/application/solo.rb +23 -8
  68. data/lib/chef/application/windows_service.rb +5 -2
  69. data/lib/chef/applications.rb +1 -0
  70. data/lib/chef/chef_fs.rb +11 -0
  71. data/lib/chef/chef_fs/command_line.rb +232 -0
  72. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  73. data/lib/chef/chef_fs/file_system.rb +358 -0
  74. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  75. data/lib/chef/chef_fs/file_system/base_fs_object.rb +121 -0
  76. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +109 -0
  77. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb} +12 -15
  78. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +84 -0
  79. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +188 -0
  80. data/lib/chef/chef_fs/file_system/cookbook_file.rb +78 -0
  81. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  82. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +68 -0
  83. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +78 -0
  84. data/lib/chef/chef_fs/file_system/data_bag_item.rb +59 -0
  85. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +66 -0
  86. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  87. data/lib/chef/{index_queue.rb → chef_fs/file_system/file_system_error.rb} +14 -12
  88. data/lib/chef/{resource/whyrun_safe_ruby_block.rb → chef_fs/file_system/file_system_root_dir.rb} +10 -10
  89. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  90. data/lib/chef/chef_fs/file_system/nodes_dir.rb +47 -0
  91. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → chef_fs/file_system/nonexistent_fs_object.rb} +19 -9
  92. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +84 -0
  94. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +123 -0
  95. data/lib/chef/chef_fs/knife.rb +77 -0
  96. data/lib/chef/chef_fs/path_utils.rb +64 -0
  97. data/lib/chef/client.rb +44 -21
  98. data/lib/chef/config.rb +52 -43
  99. data/lib/chef/cookbook/synchronizer.rb +6 -8
  100. data/lib/chef/cookbook/syntax_check.rb +61 -14
  101. data/lib/chef/cookbook_loader.rb +39 -26
  102. data/lib/chef/cookbook_uploader.rb +17 -19
  103. data/lib/chef/cookbook_version.rb +3 -302
  104. data/lib/chef/daemon.rb +3 -18
  105. data/lib/chef/data_bag.rb +4 -97
  106. data/lib/chef/data_bag_item.rb +2 -65
  107. data/lib/chef/digester.rb +73 -0
  108. data/lib/chef/dsl.rb +6 -0
  109. data/lib/chef/dsl/data_query.rb +66 -0
  110. data/lib/chef/dsl/include_attribute.rb +60 -0
  111. data/lib/chef/dsl/include_recipe.rb +42 -0
  112. data/lib/chef/dsl/platform_introspection.rb +213 -0
  113. data/lib/chef/dsl/recipe.rb +84 -0
  114. data/lib/chef/dsl/registry_helper.rb +59 -0
  115. data/lib/chef/encrypted_data_bag_item.rb +74 -19
  116. data/lib/chef/environment.rb +9 -180
  117. data/lib/chef/exceptions.rb +87 -14
  118. data/lib/chef/formatters/base.rb +4 -1
  119. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +0 -4
  120. data/lib/chef/json_compat.rb +1 -97
  121. data/lib/chef/knife.rb +90 -41
  122. data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
  123. data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
  124. data/lib/chef/knife/bootstrap/chef-full.erb +3 -3
  125. data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
  126. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  127. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
  128. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
  129. data/lib/chef/knife/configure.rb +1 -2
  130. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  131. data/lib/chef/knife/cookbook_test.rb +3 -2
  132. data/lib/chef/knife/cookbook_upload.rb +12 -7
  133. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  134. data/lib/chef/knife/core/generic_presenter.rb +26 -13
  135. data/lib/chef/knife/core/node_editor.rb +36 -16
  136. data/lib/chef/knife/core/node_presenter.rb +1 -1
  137. data/lib/chef/knife/core/text_formatter.rb +23 -37
  138. data/lib/chef/knife/core/ui.rb +15 -9
  139. data/lib/chef/knife/delete.rb +39 -0
  140. data/lib/chef/knife/diff.rb +46 -0
  141. data/lib/chef/knife/download.rb +50 -0
  142. data/lib/chef/knife/environment_show.rb +7 -0
  143. data/lib/chef/knife/exec.rb +5 -5
  144. data/lib/chef/knife/help_topics.rb +1 -1
  145. data/lib/chef/knife/index_rebuild.rb +91 -7
  146. data/lib/chef/knife/list.rb +109 -0
  147. data/lib/chef/knife/raw.rb +108 -0
  148. data/lib/chef/knife/search.rb +40 -22
  149. data/lib/chef/knife/show.rb +32 -0
  150. data/lib/chef/knife/ssh.rb +6 -2
  151. data/lib/chef/knife/upload.rb +50 -0
  152. data/lib/chef/mixin/checksum.rb +3 -3
  153. data/lib/chef/mixin/deep_merge.rb +55 -197
  154. data/lib/chef/mixin/language.rb +9 -222
  155. data/lib/chef/mixin/language_include_attribute.rb +6 -38
  156. data/lib/chef/mixin/language_include_recipe.rb +3 -35
  157. data/lib/chef/mixin/params_validate.rb +6 -19
  158. data/lib/chef/mixin/recipe_definition_dsl_core.rb +8 -61
  159. data/lib/chef/mixin/securable.rb +32 -7
  160. data/lib/chef/mixin/template.rb +40 -0
  161. data/lib/chef/mixins.rb +0 -4
  162. data/lib/chef/monkey_patches/net_http.rb +0 -34
  163. data/lib/chef/node.rb +133 -309
  164. data/lib/chef/node/attribute.rb +333 -473
  165. data/lib/chef/node/attribute_collections.rb +199 -0
  166. data/lib/chef/node/immutable_collections.rb +186 -0
  167. data/lib/chef/platform.rb +7 -22
  168. data/lib/chef/provider.rb +2 -49
  169. data/lib/chef/provider/breakpoint.rb +6 -6
  170. data/lib/chef/provider/cookbook_file.rb +5 -33
  171. data/lib/chef/provider/deploy.rb +2 -1
  172. data/lib/chef/provider/directory.rb +14 -17
  173. data/lib/chef/provider/file.rb +19 -52
  174. data/lib/chef/provider/group.rb +31 -51
  175. data/lib/chef/provider/group/dscl.rb +13 -53
  176. data/lib/chef/provider/group/gpasswd.rb +19 -14
  177. data/lib/chef/provider/group/groupadd.rb +1 -41
  178. data/lib/chef/provider/group/groupmod.rb +36 -46
  179. data/lib/chef/provider/group/pw.rb +16 -59
  180. data/lib/chef/provider/group/suse.rb +13 -16
  181. data/lib/chef/provider/group/usermod.rb +18 -40
  182. data/lib/chef/provider/group/windows.rb +6 -13
  183. data/lib/chef/provider/http_request.rb +25 -42
  184. data/lib/chef/provider/link.rb +2 -0
  185. data/lib/chef/provider/lwrp_base.rb +150 -0
  186. data/lib/chef/provider/package/portage.rb +4 -9
  187. data/lib/chef/provider/package/rpm.rb +2 -2
  188. data/lib/chef/provider/package/rubygems.rb +9 -41
  189. data/lib/chef/provider/package/yum.rb +12 -19
  190. data/lib/chef/provider/registry_key.rb +156 -0
  191. data/lib/chef/provider/remote_directory.rb +2 -0
  192. data/lib/chef/provider/remote_file.rb +21 -12
  193. data/lib/chef/provider/ruby_block.rb +5 -2
  194. data/lib/chef/provider/service.rb +15 -0
  195. data/lib/chef/provider/service/init.rb +9 -7
  196. data/lib/chef/provider/service/macosx.rb +15 -73
  197. data/lib/chef/provider/service/simple.rb +1 -1
  198. data/lib/chef/provider/service/solaris.rb +3 -3
  199. data/lib/chef/provider/template.rb +22 -25
  200. data/lib/chef/provider/template_finder.rb +61 -0
  201. data/lib/chef/provider/user.rb +0 -1
  202. data/lib/chef/provider/user/dscl.rb +175 -568
  203. data/lib/chef/provider/user/useradd.rb +30 -47
  204. data/lib/chef/providers.rb +3 -2
  205. data/lib/chef/recipe.rb +14 -8
  206. data/lib/chef/resource.rb +13 -154
  207. data/lib/chef/resource/group.rb +1 -11
  208. data/lib/chef/resource/http_request.rb +2 -1
  209. data/lib/chef/resource/lwrp_base.rb +127 -0
  210. data/lib/chef/resource/mount.rb +10 -11
  211. data/lib/chef/resource/registry_key.rb +86 -0
  212. data/lib/chef/resource/remote_directory.rb +6 -5
  213. data/lib/chef/resource/remote_file.rb +22 -31
  214. data/lib/chef/resource/ruby_block.rb +2 -2
  215. data/lib/chef/resource/service.rb +14 -0
  216. data/lib/chef/resource/user.rb +0 -18
  217. data/lib/chef/resource_collection.rb +25 -21
  218. data/lib/chef/resources.rb +2 -1
  219. data/lib/chef/rest.rb +50 -131
  220. data/lib/chef/rest/auth_credentials.rb +4 -20
  221. data/lib/chef/rest/rest_request.rb +2 -7
  222. data/lib/chef/role.rb +1 -97
  223. data/lib/chef/run_context.rb +108 -130
  224. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  225. data/lib/chef/run_list.rb +0 -2
  226. data/lib/chef/run_list/run_list_expansion.rb +0 -15
  227. data/lib/chef/run_lock.rb +90 -0
  228. data/lib/chef/runner.rb +28 -5
  229. data/lib/chef/sandbox.rb +15 -148
  230. data/lib/chef/scan_access_control.rb +2 -4
  231. data/lib/chef/shef/ext.rb +3 -575
  232. data/lib/chef/{shef.rb → shell.rb} +35 -40
  233. data/lib/chef/shell/ext.rb +593 -0
  234. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  235. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  236. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +17 -15
  237. data/lib/chef/shell_out.rb +7 -0
  238. data/lib/chef/util/windows/net_group.rb +1 -5
  239. data/lib/chef/version.rb +3 -3
  240. data/lib/chef/win32/api/process.rb +0 -1
  241. data/lib/chef/win32/handle.rb +1 -8
  242. data/lib/chef/win32/registry.rb +371 -0
  243. data/spec/data/big_json.json +1 -2
  244. data/spec/data/big_json_plus_one.json +1 -2
  245. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  246. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  247. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  248. data/spec/data/nodes/default.rb +3 -3
  249. data/spec/data/nodes/test.example.com.rb +3 -3
  250. data/spec/data/nodes/test.rb +3 -3
  251. data/spec/data/partial_one.erb +1 -0
  252. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  253. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  254. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  255. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  256. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  257. data/spec/data/{knife-home/.chef/plugins/knife/example_home_subcommand.rb → run_context/cookbooks/circular-dep1/recipes/default.rb} +0 -0
  258. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  259. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  260. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  261. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  262. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  263. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  264. data/spec/data/{lwrp_const_scoping/resources/conflict.rb → run_context/cookbooks/circular-dep2/recipes/default.rb} +0 -0
  265. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  266. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  267. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  268. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  269. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  270. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  271. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  272. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  273. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  274. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  275. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  276. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  277. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  278. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  279. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  280. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  281. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  282. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  283. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  284. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  285. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  286. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  287. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  288. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  289. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  290. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  291. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  292. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  293. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  294. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  295. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  296. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  297. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  298. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  299. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  300. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  301. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  302. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  303. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  304. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  305. data/spec/data/shef-config.rb +7 -0
  306. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  307. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  308. data/spec/functional/knife/exec_spec.rb +2 -2
  309. data/spec/functional/knife/ssh_spec.rb +5 -1
  310. data/spec/functional/resource/cookbook_file_spec.rb +7 -19
  311. data/spec/functional/resource/directory_spec.rb +4 -0
  312. data/spec/functional/resource/file_spec.rb +56 -22
  313. data/spec/functional/resource/link_spec.rb +2 -0
  314. data/spec/functional/resource/registry_spec.rb +576 -0
  315. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  316. data/spec/functional/resource/remote_file_spec.rb +18 -0
  317. data/spec/functional/resource/template_spec.rb +23 -2
  318. data/spec/functional/run_lock_spec.rb +106 -0
  319. data/spec/functional/shell_spec.rb +100 -0
  320. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  321. data/spec/spec_helper.rb +5 -29
  322. data/spec/stress/win32/security_spec.rb +1 -1
  323. data/spec/support/chef_helpers.rb +0 -2
  324. data/spec/support/platform_helpers.rb +8 -15
  325. data/spec/support/shared/functional/directory_resource.rb +84 -22
  326. data/spec/support/shared/functional/file_resource.rb +169 -71
  327. data/spec/support/shared/functional/securable_resource.rb +143 -119
  328. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  329. data/spec/support/shared/unit/file_system_support.rb +110 -0
  330. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  331. data/spec/unit/api_client/registration_spec.rb +175 -0
  332. data/spec/unit/api_client_spec.rb +78 -156
  333. data/spec/unit/application/apply.rb +84 -0
  334. data/spec/unit/application/client_spec.rb +1 -37
  335. data/spec/unit/application/knife_spec.rb +5 -0
  336. data/spec/unit/application_spec.rb +57 -2
  337. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  338. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  339. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  340. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  341. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  342. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  343. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  344. data/spec/unit/client_spec.rb +124 -33
  345. data/spec/unit/config_spec.rb +46 -13
  346. data/spec/unit/cookbook/synchronizer_spec.rb +1 -49
  347. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  348. data/spec/unit/cookbook_loader_spec.rb +153 -91
  349. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  350. data/spec/unit/cookbook_spec.rb +3 -20
  351. data/spec/unit/cookbook_version_spec.rb +23 -122
  352. data/spec/unit/daemon_spec.rb +3 -24
  353. data/spec/unit/data_bag_spec.rb +6 -4
  354. data/spec/unit/digester_spec.rb +50 -0
  355. data/spec/unit/dsl/data_query_spec.rb +66 -0
  356. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  357. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  358. data/spec/unit/encrypted_data_bag_item_spec.rb +50 -105
  359. data/spec/unit/environment_spec.rb +0 -130
  360. data/spec/unit/exceptions_spec.rb +2 -3
  361. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -3
  362. data/spec/unit/json_compat_spec.rb +15 -7
  363. data/spec/unit/knife/bootstrap_spec.rb +2 -0
  364. data/spec/unit/knife/configure_spec.rb +20 -14
  365. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  366. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  367. data/spec/unit/knife/cookbook_upload_spec.rb +43 -8
  368. data/spec/unit/knife/core/bootstrap_context_spec.rb +1 -1
  369. data/spec/unit/knife/core/ui_spec.rb +156 -125
  370. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  371. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  372. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  373. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  374. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  375. data/spec/unit/knife/knife_help.rb +7 -7
  376. data/spec/unit/knife/node_edit_spec.rb +6 -33
  377. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  378. data/spec/unit/knife/ssh_spec.rb +12 -15
  379. data/spec/unit/knife/status_spec.rb +2 -2
  380. data/spec/unit/knife_spec.rb +53 -0
  381. data/spec/unit/lwrp_spec.rb +59 -42
  382. data/spec/unit/mixin/checksum_spec.rb +2 -2
  383. data/spec/unit/mixin/deep_merge_spec.rb +101 -799
  384. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  385. data/spec/unit/mixin/params_validate_spec.rb +4 -37
  386. data/spec/unit/mixin/securable_spec.rb +5 -3
  387. data/spec/unit/mixin/template_spec.rb +119 -0
  388. data/spec/unit/node/attribute_spec.rb +195 -173
  389. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  390. data/spec/unit/node_spec.rb +366 -370
  391. data/spec/unit/platform_spec.rb +9 -10
  392. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  393. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  394. data/spec/unit/provider/directory_spec.rb +96 -64
  395. data/spec/unit/provider/env_spec.rb +2 -2
  396. data/spec/unit/provider/file_spec.rb +48 -39
  397. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  398. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  399. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  400. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  401. data/spec/unit/provider/group/pw_spec.rb +15 -12
  402. data/spec/unit/provider/group/usermod_spec.rb +6 -21
  403. data/spec/unit/provider/group/windows_spec.rb +8 -0
  404. data/spec/unit/provider/group_spec.rb +6 -28
  405. data/spec/unit/provider/http_request_spec.rb +28 -69
  406. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  407. data/spec/unit/provider/ohai_spec.rb +4 -4
  408. data/spec/unit/provider/package/apt_spec.rb +0 -1
  409. data/spec/unit/provider/package/ips_spec.rb +0 -1
  410. data/spec/unit/provider/package/portage_spec.rb +0 -44
  411. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  412. data/spec/unit/provider/package/rubygems_spec.rb +1 -44
  413. data/spec/unit/provider/package/yum_spec.rb +39 -36
  414. data/spec/unit/provider/package_spec.rb +7 -5
  415. data/spec/unit/provider/registry_key_spec.rb +269 -0
  416. data/spec/unit/provider/remote_directory_spec.rb +7 -3
  417. data/spec/unit/provider/remote_file_spec.rb +36 -0
  418. data/spec/unit/provider/route_spec.rb +4 -3
  419. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  420. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  421. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  422. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  423. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  424. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  425. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  426. data/spec/unit/provider/service/macosx_spec.rb +11 -66
  427. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  428. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  429. data/spec/unit/provider/service/upstart_service_spec.rb +9 -9
  430. data/spec/unit/provider/subversion_spec.rb +1 -1
  431. data/spec/unit/provider/template_spec.rb +35 -11
  432. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  433. data/spec/unit/provider/user/useradd_spec.rb +1 -22
  434. data/spec/unit/provider/user_spec.rb +1 -1
  435. data/spec/unit/recipe_spec.rb +10 -8
  436. data/spec/unit/registry_helper_spec.rb +374 -0
  437. data/spec/unit/resource/mount_spec.rb +0 -11
  438. data/spec/unit/resource/registry_key_spec.rb +171 -0
  439. data/spec/unit/resource/remote_file_spec.rb +21 -23
  440. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  441. data/spec/unit/resource/service_spec.rb +11 -0
  442. data/spec/unit/resource_spec.rb +4 -19
  443. data/spec/unit/rest/auth_credentials_spec.rb +2 -19
  444. data/spec/unit/rest_spec.rb +130 -284
  445. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  446. data/spec/unit/run_context_spec.rb +18 -4
  447. data/spec/unit/run_list_spec.rb +0 -209
  448. data/spec/unit/run_lock_spec.rb +37 -0
  449. data/spec/unit/runner_spec.rb +101 -2
  450. data/spec/unit/scan_access_control_spec.rb +4 -4
  451. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  452. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  453. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +14 -69
  454. data/spec/unit/shell_out_spec.rb +18 -0
  455. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  456. metadata +275 -234
  457. checksums.yaml +0 -15
  458. data/README.rdoc +0 -177
  459. data/distro/common/html/knife-recipe.1.html +0 -92
  460. data/lib/chef/certificate.rb +0 -161
  461. data/lib/chef/checksum.rb +0 -167
  462. data/lib/chef/checksum_cache.rb +0 -190
  463. data/lib/chef/cookbook_version_selector.rb +0 -168
  464. data/lib/chef/couchdb.rb +0 -246
  465. data/lib/chef/index_queue/amqp_client.rb +0 -116
  466. data/lib/chef/index_queue/consumer.rb +0 -76
  467. data/lib/chef/index_queue/indexable.rb +0 -109
  468. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  469. data/lib/chef/monkey_patches/moneta.rb +0 -50
  470. data/lib/chef/monkey_patches/uri.rb +0 -70
  471. data/lib/chef/openid_registration.rb +0 -187
  472. data/lib/chef/provider/user/solaris.rb +0 -90
  473. data/lib/chef/solr_query.rb +0 -187
  474. data/lib/chef/solr_query/lucene.treetop +0 -150
  475. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  476. data/lib/chef/solr_query/query_transform.rb +0 -65
  477. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  478. data/lib/chef/webui_user.rb +0 -231
  479. data/spec/data/cookbooks/openldap/files/default/.dotfile +0 -1
  480. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +0 -1
  481. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +0 -1
  482. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +0 -1
  483. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  484. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  485. data/spec/data/mac_users/10.7.plist.xml +0 -559
  486. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  487. data/spec/data/mac_users/10.8.plist.xml +0 -559
  488. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  489. data/spec/data/mac_users/10.9.plist.xml +0 -560
  490. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  491. data/spec/functional/resource/base.rb +0 -40
  492. data/spec/functional/resource/group_spec.rb +0 -343
  493. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  494. data/spec/unit/certificate_spec.rb +0 -76
  495. data/spec/unit/checksum_cache_spec.rb +0 -209
  496. data/spec/unit/checksum_spec.rb +0 -94
  497. data/spec/unit/couchdb_spec.rb +0 -274
  498. data/spec/unit/index_queue_spec.rb +0 -391
  499. data/spec/unit/mixin/language_spec.rb +0 -305
  500. data/spec/unit/openid_registration_spec.rb +0 -153
  501. data/spec/unit/provider/user/solaris_spec.rb +0 -414
  502. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  503. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  504. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  505. data/spec/unit/solr_query_spec.rb +0 -203
  506. data/spec/unit/webui_user_spec.rb +0 -238
@@ -1,190 +0,0 @@
1
- #
2
- # Author:: Adam Jacob (<adam@opscode.com>)
3
- # Author:: Daniel DeLeo (<dan@kallistec.com>)
4
- # Copyright:: Copyright (c) 2009 Opscode, Inc.
5
- # Copyright:: Copyright (c) 2009 Daniel DeLeo
6
- # License:: Apache License, Version 2.0
7
- #
8
- # Licensed under the Apache License, Version 2.0 (the "License");
9
- # you may not use this file except in compliance with the License.
10
- # You may obtain a copy of the License at
11
- #
12
- # http://www.apache.org/licenses/LICENSE-2.0
13
- #
14
- # Unless required by applicable law or agreed to in writing, software
15
- # distributed under the License is distributed on an "AS IS" BASIS,
16
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- # See the License for the specific language governing permissions and
18
- # limitations under the License.
19
- #
20
-
21
- require 'set'
22
- require 'fileutils'
23
- require 'chef/log'
24
- require 'chef/config'
25
- require 'chef/client'
26
- require 'chef/mixin/convert_to_class_name'
27
- require 'singleton'
28
- require 'moneta'
29
-
30
- class Chef
31
- class ChecksumCache
32
- include Chef::Mixin::ConvertToClassName
33
- include ::Singleton
34
-
35
- attr_reader :moneta
36
-
37
- def initialize(*args)
38
- self.reset!(*args)
39
- end
40
-
41
- def reset!(backend=nil, options=nil)
42
- backend ||= Chef::Config[:cache_type]
43
- options ||= Chef::Config[:cache_options]
44
-
45
- begin
46
- require "moneta/#{convert_to_snake_case(backend, 'Moneta')}"
47
- require 'chef/monkey_patches/moneta'
48
- rescue LoadError => e
49
- Chef::Log.fatal("Could not load Moneta back end #{backend.inspect}")
50
- raise e
51
- end
52
-
53
- @moneta = Moneta.const_get(backend).new(options)
54
- end
55
-
56
- def self.reset_cache_validity
57
- @valid_cached_checksums = nil
58
- end
59
-
60
- Chef::Client.when_run_starts do |run_status|
61
- reset_cache_validity
62
- end
63
-
64
- def self.valid_cached_checksums
65
- @valid_cached_checksums ||= Set.new
66
- end
67
-
68
- def self.validate_checksum(checksum_key)
69
- valid_cached_checksums << checksum_key
70
- end
71
-
72
- def self.all_cached_checksums
73
- all_checksums_with_filenames = {}
74
-
75
- Dir[File.join(Chef::Config[:cache_options][:path], '*')].each do |cksum_file|
76
- all_checksums_with_filenames[File.basename(cksum_file)] = cksum_file
77
- end
78
- all_checksums_with_filenames
79
- end
80
-
81
- def self.cleanup_checksum_cache
82
- Chef::Log.debug("Cleaning the checksum cache")
83
- if (Chef::Config[:cache_type].to_s == "BasicFile")
84
- all_cached_checksums.each do |cache_key, cksum_cache_file|
85
- unless valid_cached_checksums.include?(cache_key)
86
- remove_unused_checksum(cksum_cache_file)
87
- end
88
- end
89
- end
90
- end
91
-
92
- Chef::Client.when_run_completes_successfully do |run_status|
93
- cleanup_checksum_cache
94
- end
95
-
96
- def self.remove_unused_checksum(checksum_file)
97
- Chef::Log.debug("Removing unused checksum cache file #{checksum_file}")
98
- FileUtils.rm(checksum_file)
99
- end
100
-
101
- def self.checksum_for_file(*args)
102
- instance.checksum_for_file(*args)
103
- end
104
-
105
- def validate_checksum(*args)
106
- self.class.validate_checksum(*args)
107
- end
108
-
109
- def checksum_for_file(file, key=nil)
110
- key ||= generate_key(file)
111
- fstat = File.stat(file)
112
- lookup_checksum(key, fstat) || generate_checksum(key, file, fstat)
113
- end
114
-
115
- def lookup_checksum(key, fstat)
116
- cached = fetch(key)
117
- if cached && file_unchanged?(cached, fstat)
118
- validate_checksum(key)
119
- cached["checksum"]
120
- else
121
- nil
122
- end
123
- end
124
-
125
- def generate_checksum(key, file, fstat)
126
- checksum = checksum_file(file, Digest::SHA256.new)
127
- moneta.store(key, {"mtime" => fstat.mtime.to_f, "checksum" => checksum})
128
- validate_checksum(key)
129
- checksum
130
- end
131
-
132
- def generate_key(file, group="chef")
133
- "#{group}-file-#{file.gsub(/(#{File::SEPARATOR}|\.)/, '-')}"
134
- end
135
-
136
- def self.generate_md5_checksum_for_file(*args)
137
- instance.generate_md5_checksum_for_file(*args)
138
- end
139
-
140
- def generate_md5_checksum_for_file(file)
141
- checksum_file(file, Digest::MD5.new)
142
- end
143
-
144
- def generate_md5_checksum(io)
145
- checksum_io(io, Digest::MD5.new)
146
- end
147
-
148
- private
149
-
150
- def fetch(key)
151
- @moneta.fetch(key)
152
- rescue ArgumentError, TypeError => e
153
- Log.warn "Error loading cached checksum for key #{key.inspect}"
154
- Log.warn(e)
155
- repair_checksum_cache
156
- nil
157
- end
158
-
159
- def repair_checksum_cache
160
- Chef::Log.info("Removing invalid checksum cache files")
161
- Dir["#{Chef::Config[:cache_options][:path]}/*"].each do |file_path|
162
- File.unlink(file_path) unless File.size?(file_path)
163
- end
164
- end
165
-
166
- def file_unchanged?(cached, fstat)
167
- cached["mtime"].to_f == fstat.mtime.to_f
168
- end
169
-
170
- def checksum_file(file, digest)
171
- File.open(file, 'rb') { |f| checksum_io(f, digest) }
172
- end
173
-
174
- def checksum_io(io, digest)
175
- while chunk = io.read(1024 * 8)
176
- digest.update(chunk)
177
- end
178
- digest.hexdigest
179
- end
180
-
181
- end
182
- end
183
-
184
- module Moneta
185
- module Defaults
186
- def default
187
- nil
188
- end
189
- end
190
- end
@@ -1,168 +0,0 @@
1
- #
2
- # Author:: Tim Hinderliter (<tim@opscode.com>)
3
- # Copyright:: Copyright (c) 2011 Opscode, Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- require 'dep_selector'
19
-
20
- class Chef
21
- module CookbookVersionSelector
22
- # This method replaces verbiage from DepSelector messages with
23
- # Chef-domain-specific verbiage, such as replacing package with
24
- # cookbook.
25
- #
26
- # TODO [cw, 2011/2/25]: this is a near-term hack. In the long run,
27
- # we'll do this better.
28
- def self.filter_dep_selector_message(message)
29
- m = message
30
- m.gsub!("Package", "Cookbook")
31
- m.gsub!("package", "cookbook")
32
- m.gsub!("Solution constraint", "Run list item")
33
- m.gsub!("solution constraint", "run list item")
34
- m
35
- end
36
-
37
- # all_cookbooks - a hash mapping cookbook names to an array of
38
- # available CookbookVersions.
39
- #
40
- # Creates a DependencyGraph from CookbookVersion objects
41
- def self.create_dependency_graph_from_cookbooks(all_cookbooks)
42
- dep_graph = DepSelector::DependencyGraph.new
43
-
44
- all_cookbooks.each do |cb_name, cb_versions|
45
- cb_versions.each do |cb_version|
46
- cb_version_deps = cb_version.metadata.dependencies
47
- # TODO [cw. 2011/2/10]: CookbookVersion#version returns a
48
- # String even though we're storing as a DepSelector::Version
49
- # object underneath. This should be changed so that we
50
- # return the object and handle proper serialization and
51
- # de-serialization. For now, I'm just going to create a
52
- # Version object from the String representation.
53
- pv = dep_graph.package(cb_name).add_version(Chef::Version.new(cb_version.version))
54
- cb_version_deps.each_pair do |dep_name, constraint_str|
55
- # if the dependency is specified as cookbook::recipe,
56
- # extract the cookbook component
57
- dep_cb_name = dep_name.split("::").first
58
- constraint = Chef::VersionConstraint.new(constraint_str)
59
- pv.dependencies << DepSelector::Dependency.new(dep_graph.package(dep_cb_name), constraint)
60
- end
61
- end
62
- end
63
-
64
- dep_graph
65
- end
66
-
67
- # Return a hash mapping cookbook names to a CookbookVersion
68
- # object. If there is no solution that satisfies the constraints,
69
- # the first run list item that caused unsatisfiability is
70
- # returned.
71
- #
72
- # This is the final version-resolved list of cookbooks for the
73
- # RunList.
74
- #
75
- # all_cookbooks - a hash mapping cookbook names to an array of
76
- # available CookbookVersions.
77
- #
78
- # recipe_constraints - an array of hashes describing the expanded
79
- # run list. Each element is a hash containing keys :name and
80
- # :version_constraint. The :name component is either the
81
- # fully-qualified recipe name (e.g. "cookbook1::non_default_recipe")
82
- # or just a cookbook name, indicating the default recipe is to be
83
- # run (e.g. "cookbook1").
84
- def self.constrain(all_cookbooks, recipe_constraints)
85
- dep_graph = create_dependency_graph_from_cookbooks(all_cookbooks)
86
-
87
- # extract cookbook names from (possibly) fully-qualified recipe names
88
- cookbook_constraints = recipe_constraints.map do |recipe_spec|
89
- cookbook_name = (recipe_spec[:name][/^(.+)::/, 1] || recipe_spec[:name])
90
- DepSelector::SolutionConstraint.new(dep_graph.package(cookbook_name),
91
- recipe_spec[:version_constraint])
92
- end
93
-
94
- # Pass in the list of all available cookbooks (packages) so that
95
- # DepSelector can distinguish between "no version available for
96
- # cookbook X" and "no such cookbook X" when an environment
97
- # filters out all versions for a given cookbook.
98
- all_packages = all_cookbooks.inject([]) do |acc, (cookbook_name, cookbook_versions)|
99
- acc << dep_graph.package(cookbook_name)
100
- acc
101
- end
102
-
103
- # find a valid assignment of CoookbookVersions. If no valid
104
- # assignment exists, indicate which run_list_item causes the
105
- # unsatisfiability and try to hint at what might be wrong.
106
- soln =
107
- begin
108
- DepSelector::Selector.new(dep_graph).find_solution(cookbook_constraints, all_packages)
109
- rescue DepSelector::Exceptions::InvalidSolutionConstraints => e
110
- non_existent_cookbooks = e.non_existent_packages.map {|constraint| constraint.package.name}
111
- cookbooks_with_no_matching_versions = e.constrained_to_no_versions.map {|constraint| constraint.package.name}
112
-
113
- # Spend a whole lot of effort for pluralizing and
114
- # prettifying the message.
115
- message = ""
116
- if non_existent_cookbooks.length > 0
117
- message += "no such " + (non_existent_cookbooks.length > 1 ? "cookbooks" : "cookbook")
118
- message += " #{non_existent_cookbooks.join(", ")}"
119
- end
120
-
121
- if cookbooks_with_no_matching_versions.length > 0
122
- if message.length > 0
123
- message += "; "
124
- end
125
-
126
- message += "no versions match the constraints on " + (cookbooks_with_no_matching_versions.length > 1 ? "cookbooks" : "cookbook")
127
- message += " #{cookbooks_with_no_matching_versions.join(", ")}"
128
- end
129
-
130
- message = "Run list contains invalid items: #{message}."
131
-
132
- raise Chef::Exceptions::CookbookVersionSelection::InvalidRunListItems.new(message, non_existent_cookbooks, cookbooks_with_no_matching_versions)
133
- rescue DepSelector::Exceptions::NoSolutionExists => e
134
- raise Chef::Exceptions::CookbookVersionSelection::UnsatisfiableRunListItem.new(filter_dep_selector_message(e.message), e.unsatisfiable_solution_constraint, e.disabled_non_existent_packages, e.disabled_most_constrained_packages)
135
- end
136
-
137
-
138
- # map assignment back to CookbookVersion objects
139
- selected_cookbooks = {}
140
- soln.each_pair do |cb_name, cb_version|
141
- # TODO [cw, 2011/2/10]: related to the TODO in
142
- # create_dependency_graph_from_cookbooks, cbv.version
143
- # currently returns a String, so we must compare to
144
- # cb_version.to_s, since it's a for-real Version object.
145
- selected_cookbooks[cb_name] = all_cookbooks[cb_name].find{|cbv| cbv.version == cb_version.to_s}
146
- end
147
- selected_cookbooks
148
- end
149
-
150
- # Expands the run_list, constrained to the environment's CookbookVersion
151
- # constraints.
152
- #
153
- # Returns:
154
- # Hash of: name to CookbookVersion
155
- def self.expand_to_cookbook_versions(run_list, environment, couchdb=nil)
156
- # expand any roles in this run_list.
157
- expanded_run_list = run_list.expand(environment, 'couchdb', :couchdb => couchdb).recipes.with_version_constraints
158
-
159
- cookbooks_for_environment = Chef::Environment.cdb_minimal_filtered_versions(environment, couchdb)
160
- cookbook_collection = constrain(cookbooks_for_environment, expanded_run_list)
161
- full_cookbooks = Chef::MinimalCookbookVersion.load_full_versions_of(cookbook_collection.values, couchdb)
162
- full_cookbooks.inject({}) do |cb_map, cookbook_version|
163
- cb_map[cookbook_version.name] = cookbook_version
164
- cb_map
165
- end
166
- end
167
- end
168
- end
@@ -1,246 +0,0 @@
1
- #
2
- # Author:: Adam Jacob (<adam@opscode.com>)
3
- # Author:: Christopher Brown (<cb@opscode.com>)
4
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
-
19
- require 'chef/mixin/params_validate'
20
- require 'chef/config'
21
- require 'chef/rest'
22
- require 'chef/log'
23
- require 'digest/sha2'
24
- require 'chef/json_compat'
25
-
26
- # We want to fail on create if uuidtools isn't installed
27
- begin
28
- require 'uuidtools'
29
- rescue LoadError
30
- end
31
-
32
- class Chef
33
- class CouchDB
34
- include Chef::Mixin::ParamsValidate
35
-
36
- def initialize(url=nil, db=Chef::Config[:couchdb_database])
37
- url ||= Chef::Config[:couchdb_url]
38
- @db = db
39
- @rest = Chef::REST.new(url, nil, nil)
40
- end
41
-
42
- def couchdb_database(args=nil)
43
- @db = args || @db
44
- end
45
-
46
- def create_id_map
47
- create_design_document(
48
- "id_map",
49
- {
50
- "version" => 1,
51
- "language" => "javascript",
52
- "views" => {
53
- "name_to_id" => {
54
- "map" => <<-EOJS
55
- function(doc) {
56
- emit([ doc.chef_type, doc.name], doc._id);
57
- }
58
- EOJS
59
- },
60
- "id_to_name" => {
61
- "map" => <<-EOJS
62
- function(doc) {
63
- emit(doc._id, [ doc.chef_type, doc.name ]);
64
- }
65
- EOJS
66
- }
67
- }
68
- }
69
- )
70
- end
71
-
72
- def create_db(check_for_existing=true)
73
- @database_list = @rest.get_rest("_all_dbs")
74
- if !check_for_existing || !@database_list.any? { |db| db == couchdb_database }
75
- response = @rest.put_rest(couchdb_database, Hash.new)
76
- end
77
- couchdb_database
78
- end
79
-
80
- def create_design_document(name, data)
81
- to_update = true
82
- begin
83
- old_doc = @rest.get_rest("#{couchdb_database}/_design/#{name}")
84
- if data["version"] != old_doc["version"]
85
- data["_rev"] = old_doc["_rev"]
86
- Chef::Log.debug("Updating #{name} views")
87
- else
88
- to_update = false
89
- end
90
- rescue
91
- Chef::Log.debug("Creating #{name} views for the first time because: #{$!}")
92
- end
93
- if to_update
94
- @rest.put_rest("#{couchdb_database}/_design%2F#{name}", data)
95
- end
96
- true
97
- end
98
-
99
- # Save the object to Couch. Add to index if the object supports it.
100
- def store(obj_type, name, object)
101
- validate(
102
- {
103
- :obj_type => obj_type,
104
- :name => name,
105
- :object => object,
106
- },
107
- {
108
- :object => { :respond_to => :to_json },
109
- }
110
- )
111
- rows = get_view("id_map", "name_to_id", :key => [ obj_type, name ])["rows"]
112
- uuid = rows.empty? ? UUIDTools::UUID.random_create.to_s : rows.first.fetch("id")
113
-
114
- db_put_response = @rest.put_rest("#{couchdb_database}/#{uuid}", object)
115
-
116
- if object.respond_to?(:add_to_index)
117
- Chef::Log.info("Sending #{obj_type}(#{uuid}) to the index queue for addition.")
118
- object.add_to_index(:database => couchdb_database, :id => uuid, :type => obj_type)
119
- end
120
-
121
- db_put_response
122
- end
123
-
124
- def load(obj_type, name)
125
- validate(
126
- {
127
- :obj_type => obj_type,
128
- :name => name,
129
- },
130
- {
131
- :obj_type => { :kind_of => String },
132
- :name => { :kind_of => String },
133
- }
134
- )
135
- doc = find_by_name(obj_type, name)
136
- doc.couchdb = self if doc.respond_to?(:couchdb)
137
- doc
138
- end
139
-
140
- def delete(obj_type, name, rev=nil)
141
- validate(
142
- {
143
- :obj_type => obj_type,
144
- :name => name,
145
- },
146
- {
147
- :obj_type => { :kind_of => String },
148
- :name => { :kind_of => String },
149
- }
150
- )
151
- del_id = nil
152
- object, uuid = find_by_name(obj_type, name, true)
153
- unless rev
154
- if object.respond_to?(:couchdb_rev)
155
- rev = object.couchdb_rev
156
- else
157
- rev = object['_rev']
158
- end
159
- end
160
- response = @rest.delete_rest("#{couchdb_database}/#{uuid}?rev=#{rev}")
161
- response.couchdb = self if response.respond_to?(:couchdb=)
162
-
163
- if object.respond_to?(:delete_from_index)
164
- Chef::Log.info("Sending #{obj_type}(#{uuid}) to the index queue for deletion..")
165
- object.delete_from_index(:database => couchdb_database, :id => uuid, :type => obj_type)
166
- end
167
-
168
- response
169
- end
170
-
171
- def list(view, inflate=false)
172
- validate(
173
- {
174
- :view => view,
175
- },
176
- {
177
- :view => { :kind_of => String }
178
- }
179
- )
180
- if inflate
181
- r = @rest.get_rest(view_uri(view, "all"))
182
- r["rows"].each { |i| i["value"].couchdb = self if i["value"].respond_to?(:couchdb=) }
183
- r
184
- else
185
- r = @rest.get_rest(view_uri(view, "all_id"))
186
- end
187
- r
188
- end
189
-
190
- def has_key?(obj_type, name)
191
- validate(
192
- {
193
- :obj_type => obj_type,
194
- :name => name,
195
- },
196
- {
197
- :obj_type => { :kind_of => String },
198
- :name => { :kind_of => String },
199
- }
200
- )
201
- begin
202
- find_by_name(obj_type, name)
203
- true
204
- rescue
205
- false
206
- end
207
- end
208
-
209
- def find_by_name(obj_type, name, with_id=false)
210
- r = get_view("id_map", "name_to_id", :key => [ obj_type, name ], :include_docs => true)
211
- if r["rows"].length == 0
212
- raise Chef::Exceptions::CouchDBNotFound, "Cannot find #{obj_type} #{name} in CouchDB!"
213
- end
214
- if with_id
215
- [ r["rows"][0]["doc"], r["rows"][0]["id"] ]
216
- else
217
- r["rows"][0]["doc"]
218
- end
219
- end
220
-
221
- def get_view(design, view, options={})
222
- view_string = view_uri(design, view)
223
- view_string << "?" if options.length != 0
224
- view_string << options.map { |k,v| "#{k}=#{URI.escape(v.to_json)}"}.join('&')
225
- @rest.get_rest(view_string)
226
- end
227
-
228
- def bulk_get(*to_fetch)
229
- response = @rest.post_rest("#{couchdb_database}/_all_docs?include_docs=true", { "keys" => to_fetch.flatten })
230
- response["rows"].collect { |r| r["doc"] }
231
- end
232
-
233
- def view_uri(design, view)
234
- "#{couchdb_database}/_design/#{design}/_view/#{view}"
235
- end
236
-
237
- def server_stats
238
- @rest.get_rest('/')
239
- end
240
-
241
- def db_stats
242
- @rest.get_rest("/#{@db}")
243
- end
244
-
245
- end
246
- end