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
@@ -0,0 +1,220 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 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/chef_fs/file_system/chef_server_root_dir'
21
+
22
+ describe Chef::ChefFS::FileSystem::DataBagsDir do
23
+ let(:root_dir) {
24
+ Chef::ChefFS::FileSystem::ChefServerRootDir.new('remote',
25
+ {
26
+ :chef_server_url => 'url',
27
+ :node_name => 'username',
28
+ :client_key => 'key'
29
+ }, 'everything')
30
+ }
31
+ let(:data_bags_dir) { root_dir.child('data_bags') }
32
+ let(:should_list_data_bags) do
33
+ @rest.should_receive(:get_rest).with('data').once.and_return(
34
+ {
35
+ "achild" => "http://opscode.com/achild",
36
+ "bchild" => "http://opscode.com/bchild"
37
+ })
38
+ end
39
+ before(:each) do
40
+ @rest = double("rest")
41
+ Chef::REST.stub(:new).with('url','username','key') { @rest }
42
+ end
43
+
44
+ it 'has / as parent' do
45
+ data_bags_dir.parent.should == root_dir
46
+ end
47
+ it 'is a directory' do
48
+ data_bags_dir.dir?.should be_true
49
+ end
50
+ it 'exists' do
51
+ data_bags_dir.exists?.should be_true
52
+ end
53
+ it 'has name data_bags' do
54
+ data_bags_dir.name.should == 'data_bags'
55
+ end
56
+ it 'has path /data_bags' do
57
+ data_bags_dir.path.should == '/data_bags'
58
+ end
59
+ it 'has path_for_printing remote/data_bags' do
60
+ data_bags_dir.path_for_printing.should == 'remote/data_bags'
61
+ end
62
+ it 'has correct children' do
63
+ should_list_data_bags
64
+ data_bags_dir.children.map { |child| child.name }.should =~ %w(achild bchild)
65
+ end
66
+ it 'can have directories as children' do
67
+ data_bags_dir.can_have_child?('blah', true).should be_true
68
+ end
69
+ it 'cannot have files as children' do
70
+ data_bags_dir.can_have_child?('blah', false).should be_false
71
+ end
72
+
73
+ shared_examples_for 'a data bag item' do
74
+ it 'has data bag as parent' do
75
+ data_bag_item.parent.should == data_bag_dir
76
+ end
77
+ it 'is not a directory' do
78
+ data_bag_item.dir?.should be_false
79
+ end
80
+ it 'exists' do
81
+ should_list_data_bag_items
82
+ data_bag_item.exists?.should be_true
83
+ end
84
+ it 'has correct name' do
85
+ data_bag_item.name.should == data_bag_item_name
86
+ end
87
+ it 'has correct path' do
88
+ data_bag_item.path.should == "/data_bags/#{data_bag_dir_name}/#{data_bag_item_name}"
89
+ end
90
+ it 'has correct path_for_printing' do
91
+ data_bag_item.path_for_printing.should == "remote/data_bags/#{data_bag_dir_name}/#{data_bag_item_name}"
92
+ end
93
+ it 'reads correctly' do
94
+ @rest.should_receive(:get_rest).with("data/#{data_bag_dir_name}/#{data_bag_item_short_name}").once.and_return({
95
+ 'a' => 'b'
96
+ })
97
+ data_bag_item.read.should == '{
98
+ "a": "b"
99
+ }'
100
+ end
101
+ end
102
+
103
+ shared_examples_for 'a data bag' do
104
+ let(:should_list_data_bag_items) do
105
+ @rest.should_receive(:get_rest).with("data/#{data_bag_dir_name}").once.and_return(
106
+ {
107
+ "aitem" => "http://opscode.com/achild",
108
+ "bitem" => "http://opscode.com/bchild"
109
+ })
110
+ end
111
+ it 'has /data as a parent' do
112
+ data_bag_dir.parent.should == data_bags_dir
113
+ end
114
+ it 'is a directory' do
115
+ should_list_data_bags
116
+ data_bag_dir.dir?.should be_true
117
+ end
118
+ it 'exists' do
119
+ should_list_data_bags
120
+ data_bag_dir.exists?.should be_true
121
+ end
122
+ it 'has correct name' do
123
+ data_bag_dir.name.should == data_bag_dir_name
124
+ end
125
+ it 'has correct path' do
126
+ data_bag_dir.path.should == "/data_bags/#{data_bag_dir_name}"
127
+ end
128
+ it 'has correct path_for_printing' do
129
+ data_bag_dir.path_for_printing.should == "remote/data_bags/#{data_bag_dir_name}"
130
+ end
131
+ it 'has correct children' do
132
+ should_list_data_bag_items
133
+ data_bag_dir.children.map { |child| child.name }.should =~ %w(aitem.json bitem.json)
134
+ end
135
+ it 'can have json files as children' do
136
+ data_bag_dir.can_have_child?('blah.json', false).should be_true
137
+ end
138
+ it 'cannot have non-json files as children' do
139
+ data_bag_dir.can_have_child?('blah', false).should be_false
140
+ end
141
+ it 'cannot have directories as children' do
142
+ data_bag_dir.can_have_child?('blah', true).should be_false
143
+ data_bag_dir.can_have_child?('blah.json', true).should be_false
144
+ end
145
+ context 'aitem from data_bag.children' do
146
+ let(:data_bag_item) do
147
+ should_list_data_bag_items
148
+ data_bag_dir.children.select { |child| child.name == 'aitem.json' }.first
149
+ end
150
+ let(:data_bag_item_short_name) { 'aitem' }
151
+ let(:data_bag_item_name) { 'aitem.json' }
152
+ it_behaves_like 'a data bag item'
153
+ end
154
+ context 'data_bag.child(aitem)' do
155
+ let(:data_bag_item) { data_bag_dir.child('aitem.json') }
156
+ let(:data_bag_item_short_name) { 'aitem' }
157
+ let(:data_bag_item_name) { 'aitem.json' }
158
+ it_behaves_like 'a data bag item'
159
+ end
160
+ context 'nonexistent child()' do
161
+ let(:nonexistent_child) { data_bag_dir.child('blah.json') }
162
+ it 'has correct parent, name, path and path_for_printing' do
163
+ nonexistent_child.parent.should == data_bag_dir
164
+ nonexistent_child.name.should == "blah.json"
165
+ nonexistent_child.path.should == "/data_bags/#{data_bag_dir_name}/blah.json"
166
+ nonexistent_child.path_for_printing.should == "remote/data_bags/#{data_bag_dir_name}/blah.json"
167
+ end
168
+ it 'does not exist' do
169
+ should_list_data_bag_items
170
+ nonexistent_child.exists?.should be_false
171
+ end
172
+ it 'is not a directory' do
173
+ nonexistent_child.dir?.should be_false
174
+ end
175
+ it 'read returns NotFoundError' do
176
+ @rest.should_receive(:get_rest).with("data/#{data_bag_dir_name}/blah").once.and_raise(Net::HTTPServerException.new(nil,Net::HTTPResponse.new(nil,'404',nil)))
177
+ expect { nonexistent_child.read }.to raise_error(Chef::ChefFS::FileSystem::NotFoundError)
178
+ end
179
+ end
180
+ end
181
+
182
+ context 'achild from data_bags.children' do
183
+ let(:data_bag_dir) do
184
+ should_list_data_bags
185
+ data_bags_dir.children.select { |child| child.name == 'achild' }.first
186
+ end
187
+ let(:data_bag_dir_name) { 'achild' }
188
+ it_behaves_like 'a data bag'
189
+ end
190
+
191
+ context 'data_bags.child(achild)' do
192
+ let(:data_bag_dir) do
193
+ data_bags_dir.child('achild')
194
+ end
195
+ let(:data_bag_dir_name) { 'achild' }
196
+ it_behaves_like 'a data bag'
197
+ end
198
+
199
+ context 'nonexistent child()' do
200
+ let(:nonexistent_child) { data_bags_dir.child('blah') }
201
+ it 'has correct parent, name, path and path_for_printing' do
202
+ nonexistent_child.parent.should == data_bags_dir
203
+ nonexistent_child.name.should == "blah"
204
+ nonexistent_child.path.should == "/data_bags/blah"
205
+ nonexistent_child.path_for_printing.should == "remote/data_bags/blah"
206
+ end
207
+ it 'does not exist' do
208
+ should_list_data_bags
209
+ nonexistent_child.exists?.should be_false
210
+ end
211
+ it 'is not a directory' do
212
+ should_list_data_bags
213
+ nonexistent_child.dir?.should be_false
214
+ end
215
+ it 'read returns NotFoundError' do
216
+ expect { nonexistent_child.read }.to raise_error(Chef::ChefFS::FileSystem::NotFoundError)
217
+ end
218
+ end
219
+
220
+ end
@@ -0,0 +1,136 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 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 'support/shared/unit/file_system_support'
21
+ require 'chef/chef_fs/file_system'
22
+ require 'chef/chef_fs/file_pattern'
23
+
24
+ describe Chef::ChefFS::FileSystem do
25
+ include FileSystemSupport
26
+
27
+ context 'with empty filesystem' do
28
+ let(:fs) { memory_fs('', {}) }
29
+
30
+ context 'list' do
31
+ it '/' do
32
+ list_should_yield_paths(fs, '/', '/')
33
+ end
34
+ it '/a' do
35
+ list_should_yield_paths(fs, '/a', '/a')
36
+ end
37
+ it '/a/b' do
38
+ list_should_yield_paths(fs, '/a/b')
39
+ end
40
+ it '/*' do
41
+ list_should_yield_paths(fs, '/*', '/')
42
+ end
43
+ end
44
+
45
+ context 'resolve_path' do
46
+ it '/' do
47
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/').path.should == '/'
48
+ end
49
+ it 'nonexistent /a' do
50
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a').path.should == '/a'
51
+ end
52
+ it 'nonexistent /a/b' do
53
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a/b').path.should == '/a/b'
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'with a populated filesystem' do
59
+ let(:fs) {
60
+ memory_fs('', {
61
+ :a => {
62
+ :aa => {
63
+ :c => '',
64
+ :zz => ''
65
+ },
66
+ :ab => {
67
+ :c => '',
68
+ }
69
+ },
70
+ :x => ''
71
+ })
72
+ }
73
+ context 'list' do
74
+ it '/**' do
75
+ list_should_yield_paths(fs, '/**', '/', '/a', '/x', '/a/aa', '/a/aa/c', '/a/aa/zz', '/a/ab', '/a/ab/c')
76
+ end
77
+ it '/' do
78
+ list_should_yield_paths(fs, '/', '/')
79
+ end
80
+ it '/*' do
81
+ list_should_yield_paths(fs, '/*', '/', '/a', '/x')
82
+ end
83
+ it '/*/*' do
84
+ list_should_yield_paths(fs, '/*/*', '/a/aa', '/a/ab')
85
+ end
86
+ it '/*/*/*' do
87
+ list_should_yield_paths(fs, '/*/*/*', '/a/aa/c', '/a/aa/zz', '/a/ab/c')
88
+ end
89
+ it '/*/*/?' do
90
+ list_should_yield_paths(fs, '/*/*/?', '/a/aa/c', '/a/ab/c')
91
+ end
92
+ it '/a/*/c' do
93
+ list_should_yield_paths(fs, '/a/*/c', '/a/aa/c', '/a/ab/c')
94
+ end
95
+ it '/**b/c' do
96
+ list_should_yield_paths(fs, '/**b/c', '/a/ab/c')
97
+ end
98
+ it '/a/ab/c' do
99
+ no_blocking_calls_allowed
100
+ list_should_yield_paths(fs, '/a/ab/c', '/a/ab/c')
101
+ end
102
+ it 'nonexistent /a/ab/blah' do
103
+ no_blocking_calls_allowed
104
+ list_should_yield_paths(fs, '/a/ab/blah', '/a/ab/blah')
105
+ end
106
+ it 'nonexistent /a/ab/blah/bjork' do
107
+ no_blocking_calls_allowed
108
+ list_should_yield_paths(fs, '/a/ab/blah/bjork')
109
+ end
110
+ end
111
+
112
+ context 'resolve_path' do
113
+ before(:each) do
114
+ no_blocking_calls_allowed
115
+ end
116
+ it 'resolves /' do
117
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/').path.should == '/'
118
+ end
119
+ it 'resolves /x' do
120
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/x').path.should == '/x'
121
+ end
122
+ it 'resolves /a' do
123
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a').path.should == '/a'
124
+ end
125
+ it 'resolves /a/aa' do
126
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a/aa').path.should == '/a/aa'
127
+ end
128
+ it 'resolves /a/aa/zz' do
129
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/a/aa/zz').path.should == '/a/aa/zz'
130
+ end
131
+ it 'resolves nonexistent /y/x/w' do
132
+ Chef::ChefFS::FileSystem.resolve_path(fs, '/y/x/w').path.should == '/y/x/w'
133
+ end
134
+ end
135
+ end
136
+ end
@@ -35,17 +35,15 @@ shared_examples_for Chef::Client do
35
35
  ohai_data = { :fqdn => @fqdn,
36
36
  :hostname => @hostname,
37
37
  :platform => 'example-platform',
38
- :platform_version => 'example-platform',
38
+ :platform_version => 'example-platform-1.0',
39
39
  :data => {} }
40
40
  ohai_data.stub!(:all_plugins).and_return(true)
41
- ohai_data.stub!(:data).and_return(ohai_data[:data])
41
+ ohai_data.stub!(:data).and_return(ohai_data)
42
42
  Ohai::System.stub!(:new).and_return(ohai_data)
43
43
 
44
- @node = Chef::Node.new(@hostname)
44
+ @node = Chef::Node.new
45
45
  @node.name(@fqdn)
46
46
  @node.chef_environment("_default")
47
- @node[:platform] = "example-platform"
48
- @node[:platform_version] = "example-platform-1.0"
49
47
 
50
48
  @client = Chef::Client.new
51
49
  @client.node = @node
@@ -75,6 +73,111 @@ shared_examples_for Chef::Client do
75
73
  end
76
74
  end
77
75
 
76
+ describe "configuring output formatters" do
77
+ before do
78
+ @original_config = Chef::Config.configuration
79
+ end
80
+
81
+ after do
82
+ Chef::Config.configuration.replace(@original_config)
83
+ end
84
+ context "when no formatter has been configured" do
85
+ before do
86
+ Chef::Config.formatters.clear
87
+ @client = Chef::Client.new
88
+ end
89
+
90
+ context "and STDOUT is a TTY" do
91
+ before do
92
+ Chef::Config[:force_formatter] = false
93
+ Chef::Config[:force_logger] = false
94
+ STDOUT.stub!(:tty?).and_return(true)
95
+ end
96
+
97
+ it "configures the :doc formatter" do
98
+ @client.formatters_for_run.should == [[:doc]]
99
+ end
100
+
101
+ context "and force_logger is set" do
102
+ before do
103
+ Chef::Config[:force_logger] = true
104
+ end
105
+
106
+ it "configures the :null formatter" do
107
+ Chef::Config[:force_logger].should be_true
108
+ @client.formatters_for_run.should == [[:null]]
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+
115
+ context "and STDOUT is not a TTY" do
116
+ before do
117
+ Chef::Config[:force_formatter] = false
118
+ STDOUT.stub!(:tty?).and_return(false)
119
+ end
120
+
121
+ it "configures the :null formatter" do
122
+ @client.formatters_for_run.should == [[:null]]
123
+ end
124
+
125
+ context "and force_formatter is set" do
126
+ before do
127
+ Chef::Config[:force_formatter] = true
128
+ end
129
+ it "it configures the :doc formatter" do
130
+ @client.formatters_for_run.should == [[:doc]]
131
+ end
132
+ end
133
+ end
134
+
135
+ end
136
+
137
+ context "when a formatter is configured" do
138
+ context "with no output path" do
139
+ before do
140
+ Chef::Config.formatters.clear
141
+ @client = Chef::Client.new
142
+ Chef::Config.add_formatter(:min)
143
+ end
144
+
145
+ it "does not configure a default formatter" do
146
+ @client.formatters_for_run.should == [[:min, nil]]
147
+ end
148
+
149
+ it "configures the formatter for STDOUT/STDERR" do
150
+ configured_formatters = @client.configure_formatters
151
+ min_formatter = configured_formatters[0]
152
+ min_formatter.output.out.should == STDOUT
153
+ min_formatter.output.err.should == STDERR
154
+ end
155
+ end
156
+
157
+ context "with an output path" do
158
+ before do
159
+ Chef::Config.formatters.clear
160
+ @client = Chef::Client.new
161
+ @tmpout = Tempfile.open("rspec-for-client-formatter-selection-#{Process.pid}")
162
+ Chef::Config.add_formatter(:min, @tmpout.path)
163
+ end
164
+
165
+ after do
166
+ @tmpout.close unless @tmpout.closed?
167
+ @tmpout.unlink
168
+ end
169
+
170
+ it "configures the formatter for the file path" do
171
+ configured_formatters = @client.configure_formatters
172
+ min_formatter = configured_formatters[0]
173
+ min_formatter.output.out.path.should == @tmpout.path
174
+ min_formatter.output.err.path.should == @tmpout.path
175
+ end
176
+ end
177
+
178
+ end
179
+ end
180
+
78
181
  describe "run" do
79
182
 
80
183
  it "should identify the node and run ohai, then register the client" do
@@ -89,10 +192,8 @@ shared_examples_for Chef::Client do
89
192
  File.should_receive(:exists?).with(Chef::Config[:client_key]).exactly(1).times.and_return(false)
90
193
 
91
194
  # Client.register will register with the validation client name.
92
- Chef::REST.should_receive(:new).with(Chef::Config[:client_url], Chef::Config[:validation_client_name], Chef::Config[:validation_key]).exactly(1).and_return(mock_chef_rest_for_client)
93
- mock_chef_rest_for_client.should_receive(:register).with(@fqdn, Chef::Config[:client_key]).exactly(1).and_return(true)
195
+ Chef::ApiClient::Registration.any_instance.should_receive(:run)
94
196
  # Client.register will then turn around create another
95
-
96
197
  # Chef::REST object, this time with the client key it got from the
97
198
  # previous step.
98
199
  Chef::REST.should_receive(:new).with(Chef::Config[:chef_server_url], @fqdn, Chef::Config[:client_key]).exactly(1).and_return(mock_chef_rest_for_node)
@@ -124,11 +225,14 @@ shared_examples_for Chef::Client do
124
225
  Chef::REST.should_receive(:new).with(Chef::Config[:chef_server_url]).and_return(mock_chef_rest_for_node_save)
125
226
  mock_chef_rest_for_node_save.should_receive(:put_rest).with("nodes/#{@fqdn}", @node).and_return(true)
126
227
 
228
+ Chef::RunLock.any_instance.should_receive(:acquire)
229
+ Chef::RunLock.any_instance.should_receive(:release)
230
+
127
231
  # Post conditions: check that node has been filled in correctly
128
232
  @client.should_receive(:run_started)
129
233
  @client.should_receive(:run_completed_successfully)
130
234
 
131
- if(Chef::Config[:client_fork] && !windows?)
235
+ if(Chef::Config[:client_fork])
132
236
  require 'stringio'
133
237
  if(Chef::Config[:pipe_node])
134
238
  pipe_sim = StringIO.new
@@ -138,7 +242,6 @@ shared_examples_for Chef::Client do
138
242
  res.replace(string)
139
243
  end
140
244
  pipe_sim.should_receive(:gets).and_return(res)
141
- Chef::CouchDB.should_receive(:new).and_return(nil)
142
245
  IO.should_receive(:pipe).and_return([pipe_sim, pipe_sim])
143
246
  IO.should_receive(:select).and_return(true)
144
247
  end
@@ -232,32 +335,13 @@ shared_examples_for Chef::Client do
232
335
  end
233
336
  end
234
337
 
235
- describe "should set single lettered environments correctly" do
236
- before do
237
- @original_env = Chef::Config[:environment]
238
- end
239
-
240
- after do
241
- Chef::Config[:environment] = @original_env
242
- end
243
-
244
- it "should set the environment correctly" do
245
- @node.chef_environment.should == "_default"
246
- Chef::Config[:environment] = "A"
247
-
248
- @client.build_node
249
-
250
- @node.chef_environment.should == "A"
251
- end
252
- end
253
-
254
338
  describe "when a run list override is provided" do
255
339
  before do
256
- @node = Chef::Node.new(@hostname)
340
+ @node = Chef::Node.new
257
341
  @node.name(@fqdn)
258
342
  @node.chef_environment("_default")
259
- @node[:platform] = "example-platform"
260
- @node[:platform_version] = "example-platform-1.0"
343
+ @node.automatic_attrs[:platform] = "example-platform"
344
+ @node.automatic_attrs[:platform_version] = "example-platform-1.0"
261
345
  end
262
346
 
263
347
  it "should permit spaces in overriding run list" do
@@ -302,8 +386,15 @@ describe Chef::Client do
302
386
  end
303
387
 
304
388
  describe "Chef::Client Forked" do
305
- it_behaves_like Chef::Client
306
389
  before do
390
+ @original_config = Chef::Config.configuration
307
391
  Chef::Config[:client_fork] = true
308
392
  end
393
+
394
+ after do
395
+ Chef::Config.configuration.replace(@original_config)
396
+ end
397
+
398
+ it_behaves_like Chef::Client
399
+
309
400
  end