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
@@ -20,6 +20,7 @@ require 'base64'
20
20
  require 'openssl'
21
21
  require 'chef/data_bag_item'
22
22
  require 'yaml'
23
+ require 'yajl'
23
24
  require 'open-uri'
24
25
 
25
26
  # An EncryptedDataBagItem represents a read-only data bag item where
@@ -59,6 +60,78 @@ class Chef::EncryptedDataBagItem
59
60
  class UnsupportedCipher < StandardError
60
61
  end
61
62
 
63
+ # Implementation class for converting plaintext data bag item values to an
64
+ # encrypted value, including any necessary wrappers and metadata.
65
+ class Encryptor
66
+
67
+ attr_reader :key
68
+ attr_reader :plaintext_data
69
+
70
+ # Create a new Encryptor for +data+, which will be encrypted with the given
71
+ # +key+.
72
+ #
73
+ # === Arguments:
74
+ # * data: An object of any type that can be serialized to json
75
+ # * key: A String representing the desired passphrase
76
+ # * iv: The optional +iv+ parameter is intended for testing use only. When
77
+ # *not* supplied, Encryptor will use OpenSSL to generate a secure random
78
+ # IV, which is what you want.
79
+ def initialize(plaintext_data, key, iv=nil)
80
+ @plaintext_data = plaintext_data
81
+ @key = key
82
+ @iv = iv && Base64.decode64(iv)
83
+ end
84
+
85
+ # Returns a wrapped and encrypted version of +plaintext_data+ suitable for
86
+ # using as the value in an encrypted data bag item.
87
+ def for_encrypted_item
88
+ {
89
+ "encrypted_data" => encrypted_data,
90
+ "iv" => Base64.encode64(iv),
91
+ "version" => 1,
92
+ "cipher" => ALGORITHM
93
+ }
94
+ end
95
+
96
+ # Generates or returns the IV.
97
+ def iv
98
+ # Generated IV comes from OpenSSL::Cipher::Cipher#random_iv
99
+ # This gets generated when +openssl_encryptor+ gets created.
100
+ openssl_encryptor if @iv.nil?
101
+ @iv
102
+ end
103
+
104
+ # Generates (and memoizes) an OpenSSL::Cipher::Cipher object and configures
105
+ # it for the specified iv and encryption key.
106
+ def openssl_encryptor
107
+ @openssl_encryptor ||= begin
108
+ encryptor = OpenSSL::Cipher::Cipher.new(ALGORITHM)
109
+ encryptor.encrypt
110
+ @iv ||= encryptor.random_iv
111
+ encryptor.iv = @iv
112
+ encryptor.key = Digest::SHA256.digest(key)
113
+ encryptor
114
+ end
115
+ end
116
+
117
+ # Encrypts and Base64 encodes +serialized_data+
118
+ def encrypted_data
119
+ @encrypted_data ||= begin
120
+ enc_data = openssl_encryptor.update(serialized_data)
121
+ enc_data << openssl_encryptor.final
122
+ Base64.encode64(enc_data)
123
+ end
124
+ end
125
+
126
+ # Wraps the data in a single key Hash (JSON Object) and converts to JSON.
127
+ # The wrapper is required because we accept values (such as Integers or
128
+ # Strings) that do not produce valid JSON when serialized without the
129
+ # wrapper.
130
+ def serialized_data
131
+ Yajl::Encoder.encode(:json_wrapper => plaintext_data)
132
+ end
133
+ end
134
+
62
135
  #=== Decryptor
63
136
  # For backwards compatibility, Chef implements decryption/deserialization for
64
137
  # older encrypted data bag item formats in addition to the current version.
@@ -206,14 +279,10 @@ class Chef::EncryptedDataBagItem
206
279
  @enc_hash.keys.inject({}) { |hash, key| hash[key] = self[key]; hash }
207
280
  end
208
281
 
209
- def self.from_plain_hash(plain_hash, secret)
210
- self.new(self.encrypt_data_bag_item(plain_hash, secret), secret)
211
- end
212
-
213
282
  def self.encrypt_data_bag_item(plain_hash, secret)
214
283
  plain_hash.inject({}) do |h, (key, val)|
215
284
  h[key] = if key != "id"
216
- self.encrypt_value(val, secret)
285
+ Encryptor.new(val, secret).for_encrypted_item
217
286
  else
218
287
  val
219
288
  end
@@ -227,10 +296,6 @@ class Chef::EncryptedDataBagItem
227
296
  self.new(raw_hash, secret)
228
297
  end
229
298
 
230
- def self.encrypt_value(value, key)
231
- Base64.encode64(self.cipher(:encrypt, value.to_yaml, key))
232
- end
233
-
234
299
  def self.load_secret(path=nil)
235
300
  path = path || Chef::Config[:encrypted_data_bag_secret] || DEFAULT_SECRET_FILE
236
301
  secret = case path
@@ -255,14 +320,4 @@ class Chef::EncryptedDataBagItem
255
320
  secret
256
321
  end
257
322
 
258
- protected
259
-
260
- def self.cipher(direction, data, key)
261
- cipher = OpenSSL::Cipher::Cipher.new(ALGORITHM)
262
- cipher.send(direction)
263
- cipher.pkcs5_keyivgen(key)
264
- ans = cipher.update(data)
265
- ans << cipher.final
266
- ans
267
- end
268
323
  end
@@ -22,8 +22,6 @@ require 'chef/config'
22
22
  require 'chef/mash'
23
23
  require 'chef/mixin/params_validate'
24
24
  require 'chef/mixin/from_file'
25
- require 'chef/couchdb'
26
- require 'chef/index_queue'
27
25
  require 'chef/version_constraint'
28
26
 
29
27
  class Chef
@@ -33,52 +31,15 @@ class Chef
33
31
 
34
32
  include Chef::Mixin::ParamsValidate
35
33
  include Chef::Mixin::FromFile
36
- include Chef::IndexQueue::Indexable
37
34
 
38
35
  COMBINED_COOKBOOK_CONSTRAINT = /(.+)(?:[\s]+)((?:#{Chef::VersionConstraint::OPS.join('|')})(?:[\s]+).+)$/.freeze
39
36
 
40
- attr_accessor :couchdb, :couchdb_rev
41
- attr_reader :couchdb_id
42
-
43
- DESIGN_DOCUMENT = {
44
- "version" => 1,
45
- "language" => "javascript",
46
- "views" => {
47
- "all" => {
48
- "map" => <<-EOJS
49
- function(doc) {
50
- if (doc.chef_type == "environment") {
51
- emit(doc.name, doc);
52
- }
53
- }
54
- EOJS
55
- },
56
- "all_id" => {
57
- "map" => <<-EOJS
58
- function(doc) {
59
- if (doc.chef_type == "environment") {
60
- emit(doc.name, doc.name);
61
- }
62
- }
63
- EOJS
64
- }
65
- }
66
- }
67
-
68
- def initialize(couchdb=nil)
37
+ def initialize
69
38
  @name = ''
70
39
  @description = ''
71
40
  @default_attributes = Mash.new
72
41
  @override_attributes = Mash.new
73
42
  @cookbook_versions = Hash.new
74
- @couchdb_rev = nil
75
- @couchdb_id = nil
76
- @couchdb = couchdb || Chef::CouchDB.new
77
- end
78
-
79
- def couchdb_id=(value)
80
- @couchdb_id = value
81
- self.index_id = value
82
43
  end
83
44
 
84
45
  def chef_server_rest
@@ -113,6 +74,10 @@ class Chef
113
74
  )
114
75
  end
115
76
 
77
+ def default_attributes=(attrs)
78
+ default_attributes(attrs)
79
+ end
80
+
116
81
  def override_attributes(arg=nil)
117
82
  set_or_return(
118
83
  :override_attributes,
@@ -121,6 +86,10 @@ class Chef
121
86
  )
122
87
  end
123
88
 
89
+ def override_attributes=(attrs)
90
+ override_attributes(attrs)
91
+ end
92
+
124
93
  def cookbook_versions(arg=nil)
125
94
  set_or_return(
126
95
  :cookbook_versions,
@@ -155,7 +124,6 @@ class Chef
155
124
  "default_attributes" => @default_attributes,
156
125
  "override_attributes" => @override_attributes
157
126
  }
158
- result["_rev"] = couchdb_rev if couchdb_rev
159
127
  result
160
128
  end
161
129
 
@@ -252,17 +220,9 @@ class Chef
252
220
  environment.cookbook_versions(o["cookbook_versions"])
253
221
  environment.default_attributes(o["default_attributes"])
254
222
  environment.override_attributes(o["override_attributes"])
255
- environment.couchdb_rev = o["_rev"] if o.has_key?("_rev")
256
- environment.couchdb_id = o["_id"] if o.has_key?("_id")
257
223
  environment
258
224
  end
259
225
 
260
- def self.cdb_list(inflate=false, couchdb=nil)
261
- es = (couchdb || Chef::CouchDB.new).list("environments", inflate)
262
- lookup = (inflate ? "value" : "key")
263
- es["rows"].collect { |e| e[lookup] }
264
- end
265
-
266
226
  def self.list(inflate=false)
267
227
  if inflate
268
228
  response = Hash.new
@@ -275,34 +235,14 @@ class Chef
275
235
  end
276
236
  end
277
237
 
278
- def self.cdb_load(name, couchdb=nil)
279
- (couchdb || Chef::CouchDB.new).load("environment", name)
280
- end
281
-
282
238
  def self.load(name)
283
239
  chef_server_rest.get_rest("environments/#{name}")
284
240
  end
285
241
 
286
- def self.exists?(name, couchdb)
287
- begin
288
- self.cdb_load(name, couchdb)
289
- rescue Chef::Exceptions::CouchDBNotFound
290
- nil
291
- end
292
- end
293
-
294
- def cdb_destroy
295
- couchdb.delete("environment", @name, couchdb_rev)
296
- end
297
-
298
242
  def destroy
299
243
  chef_server_rest.delete_rest("environments/#{@name}")
300
244
  end
301
245
 
302
- def cdb_save
303
- self.couchdb_rev = couchdb.store("environment", @name, self)["rev"]
304
- end
305
-
306
246
  def save
307
247
  begin
308
248
  chef_server_rest.put_rest("environments/#{@name}", self)
@@ -318,106 +258,6 @@ class Chef
318
258
  self
319
259
  end
320
260
 
321
- # Set up our CouchDB design document
322
- def self.create_design_document(couchdb=nil)
323
- (couchdb || Chef::CouchDB.new).create_design_document("environments", DESIGN_DOCUMENT)
324
- end
325
-
326
- # Loads the set of Chef::CookbookVersion objects available to a given environment
327
- # === Returns
328
- # Hash
329
- # i.e.
330
- # {
331
- # "cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest
332
- # }
333
- #
334
- # There will be a key for every cookbook. If no CookbookVersions
335
- # are available for the specified environment the value will be an
336
- # empty list.
337
- #
338
- def self.cdb_load_filtered_cookbook_versions(name, couchdb=nil)
339
- version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}
340
-
341
- # inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
342
- cookbook_list = Chef::CookbookVersion.cdb_list(true, couchdb)
343
-
344
- filtered_list = cookbook_list.inject({}) do |res, cookbook|
345
- # FIXME: should cookbook.version return a Chef::Version?
346
- version = Chef::Version.new(cookbook.version)
347
- requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
348
- # we want a key for every cookbook, even if no versions are available
349
- res[cookbook.name] ||= []
350
- res[cookbook.name] << cookbook if requirement_satisfied
351
- res
352
- end
353
-
354
- sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
355
- res[cookbook_name] = versions.sort.reverse
356
- res
357
- end
358
-
359
- sorted_list
360
- end
361
-
362
- # Like +cdb_load_filtered_cookbook_versions+, loads the set of
363
- # cookbooks available in a given environment. The difference is that
364
- # this method will load Chef::MinimalCookbookVersion objects that
365
- # contain only the information necessary for solving a cookbook
366
- # collection for a given run list. The user of this method must call
367
- # Chef::MinimalCookbookVersion.load_full_versions_of() after solving
368
- # the cookbook collection to get the full objects.
369
- # === Returns
370
- # Hash
371
- # i.e.
372
- # {
373
- # "cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest
374
- # }
375
- #
376
- # There will be a key for every cookbook. If no CookbookVersions
377
- # are available for the specified environment the value will be an
378
- # empty list.
379
- def self.cdb_minimal_filtered_versions(name, couchdb=nil)
380
- version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}
381
-
382
- # inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
383
- cookbook_list = Chef::MinimalCookbookVersion.load_all(couchdb)
384
-
385
- filtered_list = cookbook_list.inject({}) do |res, cookbook|
386
- # FIXME: should cookbook.version return a Chef::Version?
387
- version = Chef::Version.new(cookbook.version)
388
- requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
389
- # we want a key for every cookbook, even if no versions are available
390
- res[cookbook.name] ||= []
391
- res[cookbook.name] << cookbook if requirement_satisfied
392
- res
393
- end
394
-
395
- sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
396
- res[cookbook_name] = versions.sort.reverse
397
- res
398
- end
399
-
400
- sorted_list
401
- end
402
-
403
- def self.cdb_load_filtered_recipe_list(name, couchdb=nil)
404
- cdb_load_filtered_cookbook_versions(name, couchdb).map do |cb_name, cb|
405
- if cb.empty? # no available versions
406
- [] # empty list elided with flatten
407
- else
408
- latest_version = cb.first
409
- latest_version.recipe_filenames_by_name.keys.map do |recipe|
410
- case recipe
411
- when DEFAULT
412
- cb_name
413
- else
414
- "#{cb_name}::#{recipe}"
415
- end
416
- end
417
- end
418
- end.flatten
419
- end
420
-
421
261
  def self.load_filtered_recipe_list(environment)
422
262
  chef_server_rest.get_rest("environments/#{environment}/recipes")
423
263
  end
@@ -443,16 +283,5 @@ class Chef
443
283
  end
444
284
  end
445
285
 
446
- def self.create_default_environment(couchdb=nil)
447
- couchdb = couchdb || Chef::CouchDB.new
448
- begin
449
- Chef::Environment.cdb_load('_default', couchdb)
450
- rescue Chef::Exceptions::CouchDBNotFound
451
- env = Chef::Environment.new(couchdb)
452
- env.name '_default'
453
- env.description 'The default Chef environment'
454
- env.cdb_save
455
- end
456
- end
457
286
  end
458
287
  end
@@ -21,6 +21,21 @@ class Chef
21
21
  # Chef's custom exceptions are all contained within the Chef::Exceptions
22
22
  # namespace.
23
23
  class Exceptions
24
+
25
+ # Backcompat with Chef::ShellOut code:
26
+ require 'mixlib/shellout/exceptions'
27
+
28
+ def self.const_missing(const_name)
29
+ if const_name == :ShellCommandFailed
30
+ Chef::Log.warn("Chef::Exceptions::ShellCommandFailed is deprecated, use Mixlib::ShellOut::ShellCommandFailed")
31
+ called_from = caller[0..3].inject("Called from:\n") {|msg, trace_line| msg << " #{trace_line}\n" }
32
+ Chef::Log.warn(called_from)
33
+ Mixlib::ShellOut::ShellCommandFailed
34
+ else
35
+ super
36
+ end
37
+ end
38
+
24
39
  class Application < RuntimeError; end
25
40
  class Cron < RuntimeError; end
26
41
  class Env < RuntimeError; end
@@ -39,7 +54,6 @@ class Chef
39
54
  class Group < RuntimeError; end
40
55
  class Link < RuntimeError; end
41
56
  class Mount < RuntimeError; end
42
- class CouchDBNotFound < RuntimeError; end
43
57
  class PrivateKeyMissing < RuntimeError; end
44
58
  class CannotWritePrivateKey < RuntimeError; end
45
59
  class RoleNotFound < RuntimeError; end
@@ -60,10 +74,8 @@ class Chef
60
74
  class RequestedUIDUnavailable < RuntimeError; end
61
75
  class InvalidHomeDirectory < ArgumentError; end
62
76
  class DsclCommandFailed < RuntimeError; end
63
- class PlistUtilCommandFailed < RuntimeError; end
64
77
  class UserIDNotFound < ArgumentError; end
65
78
  class GroupIDNotFound < ArgumentError; end
66
- class ConflictingMembersInGroup < ArgumentError; end
67
79
  class InvalidResourceReference < RuntimeError; end
68
80
  class ResourceNotFound < RuntimeError; end
69
81
  class InvalidResourceSpecification < ArgumentError; end
@@ -82,7 +94,8 @@ class Chef
82
94
  # Thrown when Win32 API layer binds to non-existent Win32 function. Occurs
83
95
  # when older versions of Windows don't support newer Win32 API functions.
84
96
  class Win32APIFunctionNotImplemented < NotImplementedError; end
85
-
97
+ # Attempting to run windows code on a not-windows node
98
+ class Win32NotWindows < RuntimeError; end
86
99
  class ObsoleteDependencySyntax < ArgumentError; end
87
100
  class InvalidDataBagPath < ArgumentError; end
88
101
 
@@ -99,13 +112,35 @@ class Chef
99
112
 
100
113
  # File operation attempted but no permissions to perform it
101
114
  class InsufficientPermissions < RuntimeError; end
102
-
115
+
103
116
  # Ifconfig failed
104
117
  class Ifconfig < RuntimeError; end
105
118
 
106
- # Backcompat with Chef::ShellOut code:
107
- require 'mixlib/shellout/exceptions'
108
- class ShellCommandFailed < Mixlib::ShellOut::ShellCommandFailed; end
119
+ # Invalid "source" parameter to a remote_file resource
120
+ class InvalidRemoteFileURI < ArgumentError; end
121
+
122
+ # Node::Attribute computes the merged version of of attributes
123
+ # and makes it read-only. Attempting to modify a read-only
124
+ # attribute will cause this error.
125
+ class ImmutableAttributeModification < NoMethodError; end
126
+
127
+ # Merged node attributes are invalidated when the component
128
+ # attributes are updated. Attempting to read from a stale copy
129
+ # of merged attributes will trigger this error.
130
+ class StaleAttributeRead < StandardError; end
131
+
132
+ #Registry Helper throws the following errors
133
+ class Win32RegArchitectureIncorrect < RuntimeError; end
134
+ class Win32RegHiveMissing < ArgumentError; end
135
+ class Win32RegKeyMissing < RuntimeError; end
136
+ class Win32RegValueMissing < RuntimeError; end
137
+ class Win32RegDataMissing < RuntimeError; end
138
+ class Win32RegValueExists < RuntimeError; end
139
+ class Win32RegNoRecursive < ArgumentError; end
140
+ class Win32RegTypeDoesNotExist < ArgumentError; end
141
+ class Win32RegBadType < ArgumentError; end
142
+ class Win32RegBadValueSize < ArgumentError; end
143
+ class Win32RegTypesMismatch < ArgumentError; end
109
144
 
110
145
  class MissingRole < RuntimeError
111
146
  NULL = Object.new
@@ -128,6 +163,49 @@ class Chef
128
163
 
129
164
 
130
165
  end
166
+ # Exception class for collecting multiple failures. Used when running
167
+ # delayed notifications so that chef can process each delayed
168
+ # notification even if chef client or other notifications fail.
169
+ class MultipleFailures < StandardError
170
+ def initialize(*args)
171
+ super
172
+ @all_failures = []
173
+ end
174
+
175
+ def message
176
+ base = "Multiple failures occurred:\n"
177
+ @all_failures.inject(base) do |message, (location, error)|
178
+ message << "* #{error.class} occurred in #{location}: #{error.message}\n"
179
+ end
180
+ end
181
+
182
+ def client_run_failure(exception)
183
+ set_backtrace(exception.backtrace)
184
+ @all_failures << [ "chef run", exception ]
185
+ end
186
+
187
+ def notification_failure(exception)
188
+ @all_failures << [ "delayed notification", exception ]
189
+ end
190
+
191
+ def raise!
192
+ unless empty?
193
+ raise self.for_raise
194
+ end
195
+ end
196
+
197
+ def empty?
198
+ @all_failures.empty?
199
+ end
200
+
201
+ def for_raise
202
+ if @all_failures.size == 1
203
+ @all_failures[0][1]
204
+ else
205
+ self
206
+ end
207
+ end
208
+ end
131
209
 
132
210
  class CookbookVersionSelection
133
211
 
@@ -189,13 +267,8 @@ class Chef
189
267
  result.to_json(*a)
190
268
  end
191
269
  end
192
- end # CookbookVersionSelection
193
270
 
194
- # When the server sends a redirect, RFC 2616 states a user-agent should
195
- # not follow it with a method other than GET or HEAD, unless a specific
196
- # action is taken by the user. A redirect received as response to a
197
- # non-GET and non-HEAD request will thus raise an InvalidRedirect.
198
- class InvalidRedirect < StandardError; end
271
+ end # CookbookVersionSelection
199
272
 
200
273
  end
201
274
  end