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,391 +0,0 @@
1
- #
2
- # Author:: Daniel DeLeo (<dan@kallistec.com>)
3
- # Copyright:: Copyright (c) 2009 Daniel DeLeo
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
-
19
- require 'spec_helper'
20
-
21
- class Chef
22
- class IndexableTestHarness
23
- include Chef::IndexQueue::Indexable
24
- attr_reader :couchdb_id
25
- def couchdb_id=(value)
26
- self.index_id = @couchdb_id = value
27
- end
28
- attr_reader :index_id
29
- def index_id=(value)
30
- @index_id = value
31
- end
32
-
33
- def to_hash
34
- {"ohai_world" => "I am IndexableTestHarness", "object_id" => object_id}
35
- end
36
-
37
- end
38
- end
39
-
40
- class IndexQueueSpecError < RuntimeError ; end
41
-
42
- class FauxQueue
43
-
44
- attr_reader :published_message, :publish_options
45
-
46
- # Note: If publish is not called, this published_message will cause
47
- # JSON parsing to die with "can't convert Symbol into String"
48
- def initialize
49
- @published_message = :epic_fail!
50
- @publish_options = :epic_fail!
51
- end
52
-
53
- def publish(message, options=nil)
54
- @published_message = message
55
- @publish_options = options
56
- end
57
- end
58
-
59
- class IndexConsumerTestHarness
60
- include Chef::IndexQueue::Consumer
61
-
62
- attr_reader :last_indexed_object, :unexposed_attr
63
-
64
- expose :index_this
65
-
66
- def index_this(object_to_index)
67
- @last_indexed_object = object_to_index
68
- end
69
-
70
- def not_exposed(arg)
71
- @unexposed_attr = arg
72
- end
73
- end
74
-
75
- describe Chef::IndexQueue::Indexable do
76
- def a_uuid
77
- /[0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12}/
78
- end
79
-
80
- before do
81
- Chef::IndexableTestHarness.reset_index_metadata!
82
- @publisher = Chef::IndexQueue::AmqpClient.instance
83
- @indexable_obj = Chef::IndexableTestHarness.new
84
- @item_as_hash = {"ohai_world" => "I am IndexableTestHarness", "object_id" => @indexable_obj.object_id}
85
-
86
- @now = Time.now
87
- Time.stub!(:now).and_return(@now)
88
- end
89
-
90
- it "downcases the class name for the index_object_type when it's not explicitly set" do
91
- @indexable_obj.index_object_type.should == "indexable_test_harness"
92
- end
93
-
94
- it "uses an explicitly set index_object_type" do
95
- Chef::IndexableTestHarness.index_object_type :a_weird_name
96
- @indexable_obj.index_object_type.should == "a_weird_name"
97
- end
98
-
99
- it "adds 'database', 'type', and 'id' (UUID) keys to the published object" do
100
- with_metadata = @indexable_obj.with_indexer_metadata(:database => "foo", :id=>UUIDTools::UUID.random_create.to_s)
101
- with_metadata.should have(5).keys
102
- with_metadata.keys.should include("type", "id", "item", "database", "enqueued_at")
103
- with_metadata["type"].should == "indexable_test_harness"
104
- with_metadata["database"].should == "foo"
105
- with_metadata["item"].should == @item_as_hash
106
- with_metadata["id"].should match(a_uuid)
107
- with_metadata["enqueued_at"].should == @now.utc.to_i
108
- end
109
-
110
- it "uses the couchdb_id if available" do
111
- expected_uuid = "0000000-1111-2222-3333-444444444444"
112
- @indexable_obj.couchdb_id = expected_uuid
113
- metadata_id = @indexable_obj.with_indexer_metadata["id"]
114
- metadata_id.should == expected_uuid
115
- end
116
-
117
- describe "adds and removes items to and from the index and respects Chef::Config[:persistent_queue]" do
118
- before do
119
- @exchange = mock("Bunny::Exchange")
120
- @amqp_client = mock("Bunny::Client", :start => true, :exchange => @exchange)
121
- @publisher.stub!(:amqp_client).and_return(@amqp_client)
122
- @queue = FauxQueue.new
123
- @publisher.should_receive(:queue_for_object).with("0000000-1111-2222-3333-444444444444").and_yield(@queue)
124
- Chef::Config[:persistent_queue] = false
125
- end
126
-
127
- it "adds items to the index" do
128
- @amqp_client.should_not_receive(:tx_select)
129
- @amqp_client.should_not_receive(:tx_commit)
130
- @amqp_client.should_not_receive(:tx_rollback)
131
-
132
- @indexable_obj.add_to_index(:database => "couchdb@localhost,etc.", :id=>"0000000-1111-2222-3333-444444444444")
133
-
134
- published_message = Chef::JSONCompat.from_json(@queue.published_message)
135
- published_message.should == {"action" => "add", "payload" => {"item" => @item_as_hash,
136
- "type" => "indexable_test_harness",
137
- "database" => "couchdb@localhost,etc.",
138
- "id" => "0000000-1111-2222-3333-444444444444",
139
- "enqueued_at" => @now.utc.to_i}}
140
- @queue.publish_options[:persistent].should == false
141
- end
142
-
143
- it "adds items to the index transactionactionally when Chef::Config[:persistent_queue] == true" do
144
- @amqp_client.should_receive(:tx_select)
145
- @amqp_client.should_receive(:tx_commit)
146
- @amqp_client.should_not_receive(:tx_rollback)
147
-
148
- # set and restore Chef::Config[:persistent_queue] to true
149
- orig_value = Chef::Config[:persistent_queue]
150
- Chef::Config[:persistent_queue] = true
151
- begin
152
- @indexable_obj.add_to_index(:database => "couchdb@localhost,etc.", :id=>"0000000-1111-2222-3333-444444444444")
153
- ensure
154
- Chef::Config[:persistent_queue] = orig_value
155
- end
156
-
157
- published_message = Chef::JSONCompat.from_json(@queue.published_message)
158
- published_message.should == {"action" => "add", "payload" => {"item" => @item_as_hash,
159
- "type" => "indexable_test_harness",
160
- "database" => "couchdb@localhost,etc.",
161
- "id" => "0000000-1111-2222-3333-444444444444",
162
- "enqueued_at" => @now.utc.to_i}}
163
- @queue.publish_options[:persistent].should == true
164
- end
165
-
166
- it "adds items to the index transactionally when Chef::Config[:persistent_queue] == true and rolls it back when there is a failure" do
167
- @amqp_client.should_receive(:tx_select)
168
- @amqp_client.should_receive(:tx_rollback)
169
- @amqp_client.should_not_receive(:tx_commit)
170
-
171
- # cause the publish to fail, and make sure the failure is our own
172
- # by using a specific class
173
- @queue.should_receive(:publish).and_raise(IndexQueueSpecError)
174
-
175
- # set and restore Chef::Config[:persistent_queue] to true
176
- orig_value = Chef::Config[:persistent_queue]
177
- Chef::Config[:persistent_queue] = true
178
- begin
179
- lambda{
180
- @indexable_obj.add_to_index(:database => "couchdb@localhost,etc.", :id=>"0000000-1111-2222-3333-444444444444")
181
- }.should raise_error(IndexQueueSpecError)
182
- ensure
183
- Chef::Config[:persistent_queue] = orig_value
184
- end
185
- end
186
-
187
- it "removes items from the index" do
188
- @amqp_client.should_not_receive(:tx_select)
189
- @amqp_client.should_not_receive(:tx_commit)
190
- @amqp_client.should_not_receive(:tx_rollback)
191
-
192
- @indexable_obj.delete_from_index(:database => "couchdb2@localhost", :id=>"0000000-1111-2222-3333-444444444444")
193
- published_message = Chef::JSONCompat.from_json(@queue.published_message)
194
- published_message.should == {"action" => "delete", "payload" => { "item" => @item_as_hash,
195
- "type" => "indexable_test_harness",
196
- "database" => "couchdb2@localhost",
197
- "id" => "0000000-1111-2222-3333-444444444444",
198
- "enqueued_at" => @now.utc.to_i}}
199
- @queue.publish_options[:persistent].should == false
200
- end
201
-
202
- it "removes items from the index transactionactionally when Chef::Config[:persistent_queue] == true" do
203
- @amqp_client.should_receive(:tx_select)
204
- @amqp_client.should_receive(:tx_commit)
205
- @amqp_client.should_not_receive(:tx_rollback)
206
-
207
- # set and restore Chef::Config[:persistent_queue] to true
208
- orig_value = Chef::Config[:persistent_queue]
209
- Chef::Config[:persistent_queue] = true
210
- begin
211
- @indexable_obj.delete_from_index(:database => "couchdb2@localhost", :id=>"0000000-1111-2222-3333-444444444444")
212
- ensure
213
- Chef::Config[:persistent_queue] = orig_value
214
- end
215
-
216
- published_message = Chef::JSONCompat.from_json(@queue.published_message)
217
- published_message.should == {"action" => "delete", "payload" => { "item" => @item_as_hash,
218
- "type" => "indexable_test_harness",
219
- "database" => "couchdb2@localhost",
220
- "id" => "0000000-1111-2222-3333-444444444444",
221
- "enqueued_at" => @now.utc.to_i}}
222
- @queue.publish_options[:persistent].should == true
223
- end
224
-
225
- it "remove items from the index transactionally when Chef::Config[:persistent_queue] == true and rolls it back when there is a failure" do
226
- @amqp_client.should_receive(:tx_select)
227
- @amqp_client.should_receive(:tx_rollback)
228
- @amqp_client.should_not_receive(:tx_commit)
229
-
230
- # cause the publish to fail, and make sure the failure is our own
231
- # by using a specific class
232
- @queue.should_receive(:publish).and_raise(IndexQueueSpecError)
233
-
234
- # set and restore Chef::Config[:persistent_queue] to true
235
- orig_value = Chef::Config[:persistent_queue]
236
- Chef::Config[:persistent_queue] = true
237
- begin
238
- lambda{
239
- @indexable_obj.delete_from_index(:database => "couchdb2@localhost", :id=>"0000000-1111-2222-3333-444444444444") }.should raise_error(IndexQueueSpecError)
240
- ensure
241
- Chef::Config[:persistent_queue] = orig_value
242
- end
243
- end
244
- end
245
-
246
- end
247
-
248
- describe Chef::IndexQueue::Consumer do
249
- before do
250
- @amqp_client = Chef::IndexQueue::AmqpClient.instance
251
- @consumer = IndexConsumerTestHarness.new
252
- end
253
-
254
- it "keeps a whitelist of exposed methods" do
255
- IndexConsumerTestHarness.exposed_methods.should == [:index_this]
256
- IndexConsumerTestHarness.whitelisted?(:index_this).should be_true
257
- IndexConsumerTestHarness.whitelisted?(:not_exposed).should be_false
258
- end
259
-
260
- it "doesn't route non-whitelisted methods" do
261
- payload_json = {"payload" => {"a_placeholder" => "object"}, "action" => "not_exposed"}.to_json
262
- received_message = {:payload => payload_json}
263
- lambda {@consumer.call_action_for_message(received_message)}.should raise_error(ArgumentError)
264
- @consumer.unexposed_attr.should be_nil
265
- end
266
-
267
- it "routes message payloads to the correct method" do
268
- payload_json = {"payload" => {"a_placeholder" => "object"}, "action" => "index_this"}.to_json
269
- received_message = {:payload => payload_json}
270
- @consumer.call_action_for_message(received_message)
271
- @consumer.last_indexed_object.should == {"a_placeholder" => "object"}
272
-
273
- end
274
-
275
- it "subscribes to the queue for the indexer" do
276
- payload_json = {"payload" => {"a_placeholder" => "object"}, "action" => "index_this"}.to_json
277
- message = {:payload => payload_json}
278
- queue = mock("Bunny::Queue")
279
- @amqp_client.stub!(:queue).and_return(queue)
280
- queue.should_receive(:subscribe).with(:timeout => false, :ack => true).and_yield(message)
281
- @consumer.run
282
- @consumer.last_indexed_object.should == {"a_placeholder" => "object"}
283
- end
284
-
285
- end
286
-
287
-
288
- describe Chef::IndexQueue::AmqpClient do
289
- before do
290
- Chef::Config[:amqp_host] = '4.3.2.1'
291
- Chef::Config[:amqp_port] = '1337'
292
- Chef::Config[:amqp_user] = 'teh_rspecz'
293
- Chef::Config[:amqp_pass] = 'access_granted2rspec'
294
- Chef::Config[:amqp_vhost] = '/chef-specz'
295
- Chef::Config[:amqp_consumer_id] = nil
296
-
297
- @publisher = Chef::IndexQueue::AmqpClient.instance
298
- @exchange = mock("Bunny::Exchange")
299
-
300
- @amqp_client = mock("Bunny::Client", :start => true, :exchange => @exchange)
301
- def @amqp_client.connected?; false; end # stubbing predicate methods not working?
302
- Bunny.stub!(:new).and_return(@amqp_client)
303
-
304
- @publisher.reset!
305
- end
306
-
307
- after do
308
- @publisher.disconnected!
309
- end
310
-
311
- it "is a singleton" do
312
- lambda {Chef::IndexQueue::Indexable::AmqpClient.new}.should raise_error
313
- end
314
-
315
- it "creates an amqp client object on demand, starts a connection, and caches it" do
316
- @amqp_client.should_receive(:start).once
317
- @amqp_client.should_receive(:qos).with(:prefetch_count => 1)
318
- ::Bunny.should_receive(:new).once.and_return(@amqp_client)
319
- @publisher.amqp_client.should == @amqp_client
320
- @publisher.amqp_client
321
- end
322
-
323
- it "configures the amqp client with credentials from the config file" do
324
- @publisher.reset!
325
- Bunny.should_receive(:new).with(:spec => '08', :host => '4.3.2.1', :port => '1337', :user => "teh_rspecz",
326
- :pass => "access_granted2rspec", :vhost => '/chef-specz').and_return(@amqp_client)
327
- @amqp_client.should_receive(:qos).with(:prefetch_count => 1)
328
- @publisher.amqp_client.should == @amqp_client
329
- end
330
-
331
- it "creates an amqp exchange on demand and caches it" do
332
- @amqp_client.stub!(:qos)
333
- @publisher.exchange.should == @exchange
334
- @amqp_client.should_not_receive(:exchange)
335
- @publisher.exchange.should == @exchange
336
- end
337
-
338
- describe "publishing" do
339
-
340
- before do
341
- @queue_1 = FauxQueue.new
342
- @queue_2 = FauxQueue.new
343
-
344
- @amqp_client.stub!(:qos)
345
- #@amqp_client.stub!(:queue).and_return(@queue)
346
- @data = {"some_data" => "in_a_hash"}
347
- end
348
-
349
- it "resets the client upon a Bunny::ServerDownError when publishing" do
350
- Bunny.stub!(:new).and_return(@amqp_client)
351
- @amqp_client.should_receive(:queue).with("vnode-68", {:passive=>false, :durable=>true, :exclusive=>false, :auto_delete=>false}).twice.and_return(@queue_1, @queue_2)
352
-
353
- @queue_1.should_receive(:publish).with(@data).and_raise(Bunny::ServerDownError)
354
- @queue_2.should_receive(:publish).with(@data).and_raise(Bunny::ServerDownError)
355
-
356
- @publisher.should_receive(:disconnected!).at_least(3).times
357
- lambda {@publisher.queue_for_object("00000000-1111-2222-3333-444444444444") {|q| q.publish(@data)}}.should raise_error(Bunny::ServerDownError)
358
- end
359
-
360
- it "resets the client upon a Bunny::ConnectionError when publishing" do
361
- Bunny.stub!(:new).and_return(@amqp_client)
362
- @amqp_client.should_receive(:queue).with("vnode-68", {:passive=>false, :durable=>true, :exclusive=>false, :auto_delete=>false}).twice.and_return(@queue_1, @queue_2)
363
-
364
- @queue_1.should_receive(:publish).with(@data).and_raise(Bunny::ConnectionError)
365
- @queue_2.should_receive(:publish).with(@data).and_raise(Bunny::ConnectionError)
366
-
367
- @publisher.should_receive(:disconnected!).at_least(3).times
368
- lambda {@publisher.queue_for_object("00000000-1111-2222-3333-444444444444") {|q| q.publish(@data)}}.should raise_error(Bunny::ConnectionError)
369
- end
370
-
371
- it "resets the client upon a Errno::ECONNRESET when publishing" do
372
- Bunny.stub!(:new).and_return(@amqp_client)
373
- @amqp_client.should_receive(:queue).with("vnode-68", {:passive=>false, :durable=>true, :exclusive=>false, :auto_delete=>false}).twice.and_return(@queue_1, @queue_2)
374
-
375
- @queue_1.should_receive(:publish).with(@data).and_raise(Errno::ECONNRESET)
376
- @queue_2.should_receive(:publish).with(@data).and_raise(Errno::ECONNRESET)
377
-
378
- @publisher.should_receive(:disconnected!).at_least(3).times
379
- lambda {@publisher.queue_for_object("00000000-1111-2222-3333-444444444444") {|q| q.publish(@data)}}.should raise_error(Errno::ECONNRESET)
380
- end
381
-
382
- end
383
-
384
- it "stops bunny and clears subscriptions" do
385
- bunny_client = mock("Bunny::Client")
386
- @publisher.instance_variable_set(:@amqp_client, bunny_client)
387
- bunny_client.should_receive(:stop)
388
- @publisher.stop
389
- end
390
-
391
- end
@@ -1,305 +0,0 @@
1
- #
2
- # Author:: Seth Falcon (<seth@opscode.com>)
3
- # Copyright:: Copyright (c) 2010 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
-
19
- require 'spec_helper'
20
- require 'chef/mixin/language'
21
-
22
- class LanguageTester
23
- include Chef::Mixin::Language
24
- end
25
-
26
- describe Chef::Mixin::Language do
27
- before(:each) do
28
- @language = LanguageTester.new
29
- @node = Hash.new
30
- @language.stub!(:node).and_return(@node)
31
- @platform_hash = {}
32
- %w{openbsd freebsd}.each do |x|
33
- @platform_hash[x] = {
34
- "default" => x,
35
- "1.2.3" => "#{x}-1.2.3"
36
- }
37
- end
38
- @platform_hash["debian"] = {["5", "6"] => "debian-5/6", "default" => "debian"}
39
- @platform_hash["default"] = "default"
40
-
41
- @platform_family_hash = {
42
- "debian" => "debian value",
43
- [:rhel, :fedora] => "redhatty value",
44
- "suse" => "suse value",
45
- :default => "default value"
46
- }
47
- end
48
-
49
- it "returns a default value when there is no known platform" do
50
- @node = Hash.new
51
- @language.value_for_platform(@platform_hash).should == "default"
52
- end
53
-
54
- it "returns a default value when there is no known platform family" do
55
- @language.value_for_platform_family(@platform_family_hash).should == "default value"
56
- end
57
-
58
- it "returns a default value when the current platform doesn't match" do
59
- @node[:platform] = "not-a-known-platform"
60
- @language.value_for_platform(@platform_hash).should == "default"
61
- end
62
-
63
- it "returns a default value when current platform_family doesn't match" do
64
- @node[:platform_family] = "ultra-derived-linux"
65
- @language.value_for_platform_family(@platform_family_hash).should == "default value"
66
- end
67
-
68
- it "returns a value based on the current platform" do
69
- @node[:platform] = "openbsd"
70
- @language.value_for_platform(@platform_hash).should == "openbsd"
71
- end
72
-
73
- it "returns a value based on the current platform family" do
74
- @node[:platform_family] = "debian"
75
- @language.value_for_platform_family(@platform_family_hash).should == "debian value"
76
- end
77
-
78
- it "returns a version-specific value based on the current platform" do
79
- @node[:platform] = "openbsd"
80
- @node[:platform_version] = "1.2.3"
81
- @language.value_for_platform(@platform_hash).should == "openbsd-1.2.3"
82
- end
83
-
84
- it "returns a value based on the current platform if version not found" do
85
- @node[:platform] = "openbsd"
86
- @node[:platform_version] = "0.0.0"
87
- @language.value_for_platform(@platform_hash).should == "openbsd"
88
- end
89
-
90
- describe "when platform versions is an array" do
91
- it "returns a version-specific value based on the current platform" do
92
- @node[:platform] = "debian"
93
- @node[:platform_version] = "6"
94
- @language.value_for_platform(@platform_hash).should == "debian-5/6"
95
- end
96
-
97
- it "returns a value based on the current platform if version not found" do
98
- @node[:platform] = "debian"
99
- @node[:platform_version] = "0.0.0"
100
- @language.value_for_platform(@platform_hash).should == "debian"
101
- end
102
- end
103
-
104
- describe "when checking platform?" do
105
- before(:each) do
106
- @language = LanguageTester.new
107
- @node = Hash.new
108
- @language.stub!(:node).and_return(@node)
109
- end
110
-
111
- it "returns true if the node is a provided platform and platforms are provided as symbols" do
112
- @node[:platform] = 'ubuntu'
113
- @language.platform?([:redhat, :ubuntu]).should == true
114
- end
115
-
116
- it "returns true if the node is a provided platform and platforms are provided as strings" do
117
- @node[:platform] = 'ubuntu'
118
- @language.platform?(["redhat", "ubuntu"]).should == true
119
- end
120
-
121
- it "returns false if the node is not of the provided platforms" do
122
- @node[:platform] = 'ubuntu'
123
- @language.platform?(:splatlinux).should == false
124
- end
125
- end
126
-
127
- describe "when checking platform_family?" do
128
- before(:each) do
129
- @language = LanguageTester.new
130
- @node = Hash.new
131
- @language.stub!(:node).and_return(@node)
132
- end
133
-
134
- it "returns true if the node is in a provided platform family and families are provided as symbols" do
135
- @node[:platform_family] = 'debian'
136
- @language.platform_family?([:rhel, :debian]).should == true
137
- end
138
-
139
- it "returns true if the node is a provided platform and platforms are provided as strings" do
140
- @node[:platform_family] = 'rhel'
141
- @language.platform_family?(["rhel", "debian"]).should == true
142
- end
143
-
144
- it "returns false if the node is not of the provided platforms" do
145
- @node[:platform_family] = 'suse'
146
- @language.platform_family?(:splatlinux).should == false
147
- end
148
-
149
- it "returns false if the node is not of the provided platforms and platform_family is not set" do
150
- @language.platform_family?(:splatlinux).should == false
151
- end
152
-
153
- end
154
- # NOTE: this is a regression test for bug CHEF-1514
155
- describe "when the value is an array" do
156
- before do
157
- @platform_hash = {
158
- "debian" => { "4.0" => [ :restart, :reload ], "default" => [ :restart, :reload, :status ] },
159
- "ubuntu" => { "default" => [ :restart, :reload, :status ] },
160
- "centos" => { "default" => [ :restart, :reload, :status ] },
161
- "redhat" => { "default" => [ :restart, :reload, :status ] },
162
- "fedora" => { "default" => [ :restart, :reload, :status ] },
163
- "default" => { "default" => [:restart, :reload ] }}
164
- end
165
-
166
- it "returns the correct default for a given platform" do
167
- @node[:platform] = "debian"
168
- @node[:platform_version] = '9000'
169
- @language.value_for_platform(@platform_hash).should == [ :restart, :reload, :status ]
170
- end
171
-
172
- it "returns the correct platform+version specific value " do
173
- @node[:platform] = "debian"
174
- @node[:platform_version] = '4.0'
175
- @language.value_for_platform(@platform_hash).should == [:restart, :reload]
176
- end
177
- end
178
-
179
- describe "when loading data bags and items" do
180
- it "lists the items in a data bag" do
181
- Chef::DataBag.should_receive(:load).with("bag_name").and_return("item_1" => "http://url_for/item_1", "item_2" => "http://url_for/item_2")
182
- @language.data_bag("bag_name").sort.should == %w[item_1 item_2]
183
- end
184
-
185
- it "validates the name of the data bag you're trying to load" do
186
- lambda {@language.data_bag("!# %^&& ")}.should raise_error(Chef::Exceptions::InvalidDataBagName)
187
- end
188
-
189
- it "fetches a data bag item" do
190
- @item = Chef::DataBagItem.new
191
- @item.data_bag("bag_name")
192
- @item.raw_data = {"id" => "item_name", "FUU" => "FUU"}
193
- Chef::DataBagItem.should_receive(:load).with("bag_name", "item_name").and_return(@item)
194
- @language.data_bag_item("bag_name", "item_name").should == @item
195
- end
196
-
197
- it "validates the name of the data bag you're trying to load an item from" do
198
- lambda {@language.data_bag_item(" %%^& ", "item_name")}.should raise_error(Chef::Exceptions::InvalidDataBagName)
199
- end
200
-
201
- it "validates the id of the data bag item you're trying to load" do
202
- lambda {@language.data_bag_item("bag_name", " 987 (*&()")}.should raise_error(Chef::Exceptions::InvalidDataBagItemID)
203
- end
204
-
205
- it "validates that the id of the data bag item is not nil" do
206
- lambda {@language.data_bag_item("bag_name", nil)}.should raise_error(Chef::Exceptions::InvalidDataBagItemID)
207
- end
208
-
209
- end
210
-
211
- end
212
-
213
- describe Chef::Mixin::Language::PlatformDependentValue do
214
- before do
215
- platform_hash = {
216
- :openbsd => {:default => 'free, functional, secure'},
217
- [:redhat, :centos, :fedora, :scientific] => {:default => '"stable"'},
218
- :ubuntu => {'10.04' => 'using upstart more', :default => 'using init more'},
219
- :default => 'bork da bork'
220
- }
221
- @platform_specific_value = Chef::Mixin::Language::PlatformDependentValue.new(platform_hash)
222
- end
223
-
224
- it "returns the default value when the platform doesn't match" do
225
- @platform_specific_value.value_for_node(:platform => :dos).should == 'bork da bork'
226
- end
227
-
228
- it "returns a value for a platform set as a group" do
229
- @platform_specific_value.value_for_node(:platform => :centos).should == '"stable"'
230
- end
231
-
232
- it "returns a value for the platform when it was set as a symbol but fetched as a string" do
233
- @platform_specific_value.value_for_node(:platform => "centos").should == '"stable"'
234
- end
235
-
236
- it "returns a value for a specific platform version" do
237
- node = {:platform => 'ubuntu', :platform_version => '10.04'}
238
- @platform_specific_value.value_for_node(node).should == 'using upstart more'
239
- end
240
-
241
- it "returns a platform-default value if the platform version doesn't match an explicit one" do
242
- node = {:platform => 'ubuntu', :platform_version => '9.10' }
243
- @platform_specific_value.value_for_node(node).should == 'using init more'
244
- end
245
-
246
- it "returns nil if there is no default and no platforms match" do
247
- # this matches the behavior in the original implementation.
248
- # whether or not it's correct is another matter.
249
- platform_specific_value = Chef::Mixin::Language::PlatformDependentValue.new({})
250
- platform_specific_value.value_for_node(:platform => 'foo').should be_nil
251
- end
252
-
253
- it "raises an argument error if the platform hash is not correctly structured" do
254
- bad_hash = {:ubuntu => :foo} # should be :ubuntu => {:default => 'foo'}
255
- lambda {Chef::Mixin::Language::PlatformDependentValue.new(bad_hash)}.should raise_error(ArgumentError)
256
- end
257
-
258
- end
259
- describe Chef::Mixin::Language::PlatformFamilyDependentValue do
260
- before do
261
- @array_values = [:stop, :start, :reload]
262
-
263
- @platform_family_hash = {
264
- "debian" => "debian value",
265
- [:rhel, "fedora"] => "redhatty value",
266
- "suse" => @array_values,
267
- :gentoo => "gentoo value",
268
- :default => "default value"
269
- }
270
-
271
- @platform_family_value = Chef::Mixin::Language::PlatformFamilyDependentValue.new(@platform_family_hash)
272
- end
273
-
274
- it "returns the default value when the platform family doesn't match" do
275
- @platform_family_value.value_for_node(:platform_family => :os2).should == 'default value'
276
- end
277
-
278
-
279
- it "returns a value for the platform family when it was set as a string but fetched as a symbol" do
280
- @platform_family_value.value_for_node(:platform_family => :debian).should == "debian value"
281
- end
282
-
283
-
284
- it "returns a value for the platform family when it was set as a symbol but fetched as a string" do
285
- @platform_family_value.value_for_node(:platform_family => "gentoo").should == "gentoo value"
286
- end
287
-
288
- it "returns an array value stored for a platform family" do
289
- @platform_family_value.value_for_node(:platform_family => "suse").should == @array_values
290
- end
291
-
292
- it "returns a value for the platform family when it was set within an array hash key as a symbol" do
293
- @platform_family_value.value_for_node(:platform_family => :rhel).should == "redhatty value"
294
- end
295
-
296
- it "returns a value for the platform family when it was set within an array hash key as a string" do
297
- @platform_family_value.value_for_node(:platform_family => "fedora").should == "redhatty value"
298
- end
299
-
300
- it "returns nil if there is no default and no platforms match" do
301
- platform_specific_value = Chef::Mixin::Language::PlatformFamilyDependentValue.new({})
302
- platform_specific_value.value_for_node(:platform_family => 'foo').should be_nil
303
- end
304
-
305
- end