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
@@ -2,7 +2,8 @@
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
3
  # Author:: Tim Hinderliter (<tim@opscode.com>)
4
4
  # Author:: Daniel DeLeo (<dan@opscode.com>)
5
- # Copyright:: Copyright (c) 2008, 2011 Opscode, Inc.
5
+ # Author:: John Keiser (<jkeiser@opscode.com>)
6
+ # Copyright:: Copyright (c) 2008, 2011, 2012 Opscode, Inc.
6
7
  # License:: Apache License, Version 2.0
7
8
  #
8
9
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,124 +28,6 @@ describe Chef::Knife::UI do
27
28
  @ui = Chef::Knife::UI.new(@out, @err, @in, @config)
28
29
  end
29
30
 
30
- describe "edit" do
31
- ruby_for_json = { 'foo' => 'bar' }
32
- json_from_ruby = "{\n \"foo\": \"bar\"\n}"
33
- json_from_editor = "{\n \"bar\": \"foo\"\n}"
34
- ruby_from_editor = { 'bar' => 'foo' }
35
- my_editor = "veeeye"
36
- temp_path = "/tmp/bar/baz"
37
-
38
- let(:subject) { @ui.edit_data(ruby_for_json, parse_output) }
39
- let(:parse_output) { false }
40
-
41
- context "when editing is disabled" do
42
- before do
43
- @ui.config[:disable_editing] = true
44
- stub_const("Tempfile", double) # Tempfiles should never be invoked
45
- end
46
- context "when parse_output is false" do
47
- it "returns pretty json string" do
48
- expect(subject).to eql(json_from_ruby)
49
- end
50
- end
51
- context "when parse_output is true" do
52
- let(:parse_output) { true }
53
- it "returns a ruby object" do
54
- expect(subject).to eql(ruby_for_json)
55
- end
56
- end
57
-
58
- end
59
-
60
- context "when editing is enabled" do
61
- before do
62
- @ui.config[:disable_editing] = false
63
- @ui.config[:editor] = my_editor
64
- @mock = mock('Tempfile')
65
- @mock.should_receive(:sync=).with(true)
66
- @mock.should_receive(:puts).with(json_from_ruby)
67
- @mock.should_receive(:close)
68
- @mock.should_receive(:path).at_least(:once).and_return(temp_path)
69
- Tempfile.should_receive(:open).with([ 'knife-edit-', '.json' ]).and_yield(@mock)
70
- end
71
- context "and the editor works" do
72
- before do
73
- @ui.should_receive(:system).with("#{my_editor} #{temp_path}").and_return(true)
74
- IO.should_receive(:read).with(temp_path).and_return(json_from_editor)
75
- end
76
-
77
- context "when parse_output is false" do
78
- it "returns an edited pretty json string" do
79
- expect(subject).to eql(json_from_editor)
80
- end
81
- end
82
- context "when parse_output is true" do
83
- let(:parse_output) { true }
84
- it "returns an edited ruby object" do
85
- expect(subject).to eql(ruby_from_editor)
86
- end
87
- end
88
- end
89
- context "when running the editor fails with nil" do
90
- before do
91
- @ui.should_receive(:system).with("#{my_editor} #{temp_path}").and_return(nil)
92
- IO.should_not_receive(:read)
93
- end
94
- it "throws an exception" do
95
- expect{ subject }.to raise_error(RuntimeError)
96
- end
97
- end
98
- context "when running the editor fails with false" do
99
- before do
100
- @ui.should_receive(:system).with("#{my_editor} #{temp_path}").and_return(false)
101
- IO.should_not_receive(:read)
102
- end
103
- it "throws an exception" do
104
- expect{ subject }.to raise_error(RuntimeError)
105
- end
106
- end
107
- end
108
- context "when editing and not stubbing Tempfile (semi-functional test)" do
109
- before do
110
- @ui.config[:disable_editing] = false
111
- @ui.config[:editor] = my_editor
112
- @tempfile = Tempfile.new([ 'knife-edit-', '.json' ])
113
- Tempfile.should_receive(:open).with([ 'knife-edit-', '.json' ]).and_yield(@tempfile)
114
- end
115
-
116
- context "and the editor works" do
117
- before do
118
- @ui.should_receive(:system).with("#{my_editor} #{@tempfile.path}").and_return(true)
119
- IO.should_receive(:read).with(@tempfile.path).and_return(json_from_editor)
120
- end
121
-
122
- context "when parse_output is false" do
123
- it "returns an edited pretty json string" do
124
- expect(subject).to eql(json_from_editor)
125
- end
126
- it "the tempfile should have mode 0600", :unix_only do
127
- # XXX: this looks odd because we're really testing Tempfile.new here
128
- expect(File.stat(@tempfile.path).mode & 0777).to eql(0600)
129
- expect(subject).to eql(json_from_editor)
130
- end
131
- end
132
-
133
- context "when parse_output is true" do
134
- let(:parse_output) { true }
135
- it "returns an edited ruby object" do
136
- expect(subject).to eql(ruby_from_editor)
137
- end
138
- it "the tempfile should have mode 0600", :unix_only do
139
- # XXX: this looks odd because we're really testing Tempfile.new here
140
- expect(File.stat(@tempfile.path).mode & 0777).to eql(0600)
141
- expect(subject).to eql(ruby_from_editor)
142
- end
143
- end
144
- end
145
- end
146
- end
147
-
148
31
  describe "format_list_for_display" do
149
32
  it "should print the full hash if --with-uri is true" do
150
33
  @ui.config[:with_uri] = true
@@ -157,6 +40,153 @@ describe Chef::Knife::UI do
157
40
  end
158
41
  end
159
42
 
43
+ describe "output" do
44
+ it "formats strings appropriately" do
45
+ @ui.output("hi")
46
+ @out.string.should == "hi\n"
47
+ end
48
+
49
+ it "formats hashes appropriately" do
50
+ @ui.output({'hi' => 'a', 'lo' => 'b' })
51
+ @out.string.should == <<EOM
52
+ hi: a
53
+ lo: b
54
+ EOM
55
+ end
56
+
57
+ it "formats empty hashes appropriately" do
58
+ @ui.output({})
59
+ @out.string.should == "\n"
60
+ end
61
+
62
+ it "formats arrays appropriately" do
63
+ @ui.output([ 'a', 'b' ])
64
+ @out.string.should == <<EOM
65
+ a
66
+ b
67
+ EOM
68
+ end
69
+
70
+ it "formats empty arrays appropriately" do
71
+ @ui.output([ ])
72
+ @out.string.should == "\n"
73
+ end
74
+
75
+ it "formats single-member arrays appropriately" do
76
+ @ui.output([ 'a' ])
77
+ @out.string.should == "a\n"
78
+ end
79
+
80
+ it "formats nested single-member arrays appropriately" do
81
+ @ui.output([ [ 'a' ] ])
82
+ @out.string.should == "a\n"
83
+ end
84
+
85
+ it "formats nested arrays appropriately" do
86
+ @ui.output([ [ 'a', 'b' ], [ 'c', 'd' ]])
87
+ @out.string.should == <<EOM
88
+ a
89
+ b
90
+
91
+ c
92
+ d
93
+ EOM
94
+ end
95
+
96
+ it "formats nested arrays with single- and empty subarrays appropriately" do
97
+ @ui.output([ [ 'a', 'b' ], [ 'c' ], [], [ 'd', 'e' ]])
98
+ @out.string.should == <<EOM
99
+ a
100
+ b
101
+
102
+ c
103
+
104
+
105
+ d
106
+ e
107
+ EOM
108
+ end
109
+
110
+ it "formats arrays of hashes with extra lines in between for readability" do
111
+ @ui.output([ { 'a' => 'b', 'c' => 'd' }, { 'x' => 'y' }, { 'm' => 'n', 'o' => 'p' }])
112
+ @out.string.should == <<EOM
113
+ a: b
114
+ c: d
115
+
116
+ x: y
117
+
118
+ m: n
119
+ o: p
120
+ EOM
121
+ end
122
+
123
+ it "formats hashes with empty array members appropriately" do
124
+ @ui.output({ 'a' => [], 'b' => 'c' })
125
+ @out.string.should == <<EOM
126
+ a:
127
+ b: c
128
+ EOM
129
+ end
130
+
131
+ it "formats hashes with single-member array values appropriately" do
132
+ @ui.output({ 'a' => [ 'foo' ], 'b' => 'c' })
133
+ @out.string.should == <<EOM
134
+ a: foo
135
+ b: c
136
+ EOM
137
+ end
138
+
139
+ it "formats hashes with array members appropriately" do
140
+ @ui.output({ 'a' => [ 'foo', 'bar' ], 'b' => 'c' })
141
+ @out.string.should == <<EOM
142
+ a:
143
+ foo
144
+ bar
145
+ b: c
146
+ EOM
147
+ end
148
+
149
+ it "formats hashes with single-member nested array values appropriately" do
150
+ @ui.output({ 'a' => [ [ 'foo' ] ], 'b' => 'c' })
151
+ @out.string.should == <<EOM
152
+ a:
153
+ foo
154
+ b: c
155
+ EOM
156
+ end
157
+
158
+ it "formats hashes with nested array values appropriately" do
159
+ @ui.output({ 'a' => [ [ 'foo', 'bar' ], [ 'baz', 'bjork' ] ], 'b' => 'c' })
160
+ @out.string.should == <<EOM
161
+ a:
162
+ foo
163
+ bar
164
+
165
+ baz
166
+ bjork
167
+ b: c
168
+ EOM
169
+ end
170
+
171
+ it "formats hashes with hash values appropriately" do
172
+ @ui.output({ 'a' => { 'aa' => 'bb', 'cc' => 'dd' }, 'b' => 'c' })
173
+ @out.string.should == <<EOM
174
+ a:
175
+ aa: bb
176
+ cc: dd
177
+ b: c
178
+ EOM
179
+ end
180
+
181
+ it "formats hashes with empty hash values appropriately" do
182
+ @ui.output({ 'a' => { }, 'b' => 'c' })
183
+ @out.string.should == <<EOM
184
+ a:
185
+ b: c
186
+ EOM
187
+ end
188
+ end
189
+
160
190
  describe "format_for_display" do
161
191
  it "should return the raw data" do
162
192
  input = { :gi => :go }
@@ -165,20 +195,21 @@ describe Chef::Knife::UI do
165
195
 
166
196
  describe "with --attribute passed" do
167
197
  it "should return the deeply nested attribute" do
168
- input = { "gi" => { "go" => "ge" } }
198
+ input = { "gi" => { "go" => "ge" }, "id" => "sample-data-bag-item" }
169
199
  @ui.config[:attribute] = "gi.go"
170
- @ui.format_for_display(input).should == { "gi.go" => "ge" }
200
+ @ui.format_for_display(input).should == { "sample-data-bag-item" => { "gi.go" => "ge" } }
171
201
  end
172
202
  end
173
203
 
174
204
  describe "with --run-list passed" do
175
205
  it "should return the run list" do
176
206
  input = Chef::Node.new
207
+ input.name("sample-node")
177
208
  input.run_list("role[monkey]", "role[churchmouse]")
178
209
  @ui.config[:run_list] = true
179
210
  response = @ui.format_for_display(input)
180
- response["run_list"][0].should == "role[monkey]"
181
- response["run_list"][1].should == "role[churchmouse]"
211
+ response["sample-node"]["run_list"][0].should == "role[monkey]"
212
+ response["sample-node"]["run_list"][1].should == "role[churchmouse]"
182
213
  end
183
214
  end
184
215
  end
@@ -207,8 +238,8 @@ describe Chef::Knife::UI do
207
238
  it "should return the URIs" do
208
239
  response = {
209
240
  "cookbook_name"=>{
210
- "1.0.0" => "http://url/cookbooks/1.0.0",
211
- "2.0.0" => "http://url/cookbooks/2.0.0",
241
+ "1.0.0" => "http://url/cookbooks/1.0.0",
242
+ "2.0.0" => "http://url/cookbooks/2.0.0",
212
243
  "3.0.0" => "http://url/cookbooks/3.0.0"}
213
244
  }
214
245
  @ui.config[:with_uri] = true
@@ -82,6 +82,15 @@ describe Chef::Knife::DataBagCreate do
82
82
 
83
83
  @rest.should_receive(:post_rest).with("data", {'name' => 'sudoing_admins'}).ordered
84
84
  @rest.should_receive(:post_rest).with("data/sudoing_admins", data_bag_item).ordered
85
+
86
+ @secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
87
+ @secret_file.puts(@secret)
88
+ @secret_file.flush
89
+ end
90
+
91
+ after do
92
+ @secret_file.close
93
+ @secret_file.unlink
85
94
  end
86
95
 
87
96
  it "creates an encrypted data bag item via --secret" do
@@ -83,10 +83,7 @@ describe Chef::Knife::DataBagEdit do
83
83
  end
84
84
 
85
85
  it "decrypts and encrypts via --secret_file" do
86
- secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
87
- secret_file.puts(@secret)
88
- secret_file.flush
89
- @knife.stub!(:config).and_return({:secret_file => secret_file.path})
86
+ @knife.stub!(:config).and_return({:secret_file => @secret_file.path})
90
87
  @knife.should_receive(:edit_data).with(@plain_data).and_return(@edited_data)
91
88
  @rest.should_receive(:put_rest).with("data/bag_name/item_name", @enc_edited_data).ordered
92
89
 
@@ -170,10 +170,7 @@ describe Chef::Knife::DataBagFromFile do
170
170
  end
171
171
 
172
172
  it "encrypts values when given --secret_file" do
173
- secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
174
- secret_file.puts(@secret)
175
- secret_file.flush
176
- @knife.stub!(:config).and_return({:secret_file => secret_file.path})
173
+ @knife.stub!(:config).and_return({:secret_file => @secret_file.path})
177
174
 
178
175
  @knife.loader.stub!(:load_from).with("data_bags", 'bag_name', @db_file.path).and_return(@plain_data)
179
176
  dbag = Chef::DataBagItem.new
@@ -190,8 +187,9 @@ describe Chef::Knife::DataBagFromFile do
190
187
  it "prints help if given no arguments" do
191
188
  @knife.instance_variable_set(:@name_args, [])
192
189
  lambda { @knife.run }.should raise_error(SystemExit)
193
- expected = 'knife data bag from file BAG FILE|FOLDER [FILE|FOLDER..] (options)'
194
- @stdout.string.should include(expected)
190
+ help_text = "knife data bag from file BAG FILE|FOLDER [FILE|FOLDER..] (options)"
191
+ help_text_regex = Regexp.new("^#{Regexp.escape(help_text)}")
192
+ @stdout.string.should match(help_text_regex)
195
193
  end
196
194
  end
197
195
 
@@ -57,6 +57,7 @@ describe Chef::Knife::DataBagShow do
57
57
 
58
58
  @knife.run
59
59
  Chef::JSONCompat.from_json(@stdout.string).should == data_item.raw_data
60
+
60
61
  end
61
62
 
62
63
  describe "encrypted data bag items" do
@@ -70,6 +71,15 @@ describe Chef::Knife::DataBagShow do
70
71
  @enc_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(@plain_data,
71
72
  @secret)
72
73
  @knife.instance_variable_set(:@name_args, ['bag_name', 'item_name'])
74
+
75
+ @secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
76
+ @secret_file.puts(@secret)
77
+ @secret_file.flush
78
+ end
79
+
80
+ after do
81
+ @secret_file.close
82
+ @secret_file.unlink
73
83
  end
74
84
 
75
85
  it "prints the decrypted contents of an item when given --secret" do
@@ -82,10 +92,7 @@ describe Chef::Knife::DataBagShow do
82
92
  end
83
93
 
84
94
  it "prints the decrypted contents of an item when given --secret_file" do
85
- secret_file = Tempfile.new("encrypted_data_bag_secret_file_test")
86
- secret_file.puts(@secret)
87
- secret_file.flush
88
- @knife.stub!(:config).and_return({:secret_file => secret_file.path})
95
+ @knife.stub!(:config).and_return({:secret_file => @secret_file.path})
89
96
  Chef::EncryptedDataBagItem.should_receive(:load).
90
97
  with('bag_name', 'item_name', @secret).
91
98
  and_return(Chef::EncryptedDataBagItem.new(@enc_data, @secret))
@@ -19,47 +19,110 @@
19
19
  require 'spec_helper'
20
20
 
21
21
  describe Chef::Knife::IndexRebuild do
22
- before do
23
- Chef::Config[:node_name] = "webmonkey.example.com"
24
- @knife = Chef::Knife::IndexRebuild.new
25
- @rest_client = mock("Chef::REST (mock)", :post_rest => { :result => :true })
26
- @knife.ui.stub!(:output)
27
- @knife.stub!(:rest).and_return(@rest_client)
28
-
29
- @out = StringIO.new
30
- @knife.ui.stub!(:stdout).and_return(@out)
31
- end
32
22
 
33
- it "asks a yes/no confirmation and aborts on 'no'" do
34
- @knife.ui.stub!(:stdin).and_return(StringIO.new("NO\n"))
35
- @knife.should_receive(:puts)
36
- @knife.should_receive(:exit).with(7)
37
- @knife.run
38
- @out.string.should match(/yes\/no/)
23
+ let(:knife){Chef::Knife::IndexRebuild.new}
24
+ let(:rest_client){mock(Chef::REST)}
25
+
26
+ let(:stub_rest!) do
27
+ knife.should_receive(:rest).and_return(rest_client)
39
28
  end
40
29
 
41
- it "asks a confirmation and continues on 'yes'" do
42
- @knife.ui.stub!(:stdin).and_return(StringIO.new("yes\n"))
43
- @knife.should_not_receive(:exit)
44
- @knife.run
45
- @out.string.should match(/yes\/no/)
30
+ before :each do
31
+ # This keeps the test output clean
32
+ knife.ui.stub!(:stdout).and_return(StringIO.new)
46
33
  end
47
34
 
48
- describe "after confirming the operation" do
49
- before do
50
- @knife.ui.stub!(:print)
51
- @knife.ui.stub!(:puts)
52
- @knife.stub!(:nag)
53
- @knife.ui.stub!(:output)
35
+ context "#grab_api_info" do
36
+ let(:http_not_found_response) do
37
+ e = Net::HTTPNotFound.new("1.1", 404, "blah")
38
+ e.stub(:[]).with("x-ops-api-info").and_return(api_header_value)
39
+ e
40
+ end
41
+
42
+ let(:http_server_exception) do
43
+ Net::HTTPServerException.new("404: Not Found", http_not_found_response)
44
+ end
45
+
46
+ before(:each) do
47
+ stub_rest!
48
+ rest_client.stub(:get_rest).and_raise(http_server_exception)
49
+ end
50
+
51
+ context "against a Chef 11 server" do
52
+ let(:api_header_value){"flavor=osc;version=11.0.0;erchef=1.2.3"}
53
+ it "retrieves API information" do
54
+ knife.grab_api_info.should == {"flavor" => "osc", "version" => "11.0.0", "erchef" => "1.2.3"}
55
+ end
56
+ end # Chef 11
57
+
58
+ context "against a Chef 10 server" do
59
+ let(:api_header_value){nil}
60
+ it "finds no API information" do
61
+ knife.grab_api_info.should == {}
62
+ end
63
+ end # Chef 10
64
+ end # grab_api_info
65
+
66
+ context "#unsupported_version?" do
67
+ context "with Chef 11 API metadata" do
68
+ it "is unsupported" do
69
+ knife.unsupported_version?({"version" => "11.0.0", "flavor" => "osc", "erchef" => "1.2.3"}).should be_true
70
+ end
71
+
72
+ it "only truly relies on the version being non-nil" do
73
+ knife.unsupported_version?({"version" => "1", "flavor" => "osc", "erchef" => "1.2.3"}).should be_true
74
+ end
54
75
  end
55
76
 
56
- it "POSTs to /search/reindex and displays the result" do
57
- @rest_client = mock("Chef::REST")
58
- @knife.stub!(:rest).and_return(@rest_client)
59
- @rest_client.should_receive(:post_rest).with("/search/reindex", {}).and_return("monkey")
60
- @knife.should_receive(:output).with("monkey")
61
- @knife.run
77
+ context "with Chef 10 API metadata" do
78
+ it "is supported" do
79
+ # Chef 10 will have no metadata
80
+ knife.unsupported_version?({}).should be_false
81
+ end
82
+ end
83
+ end # unsupported_version?
84
+
85
+ context "Simulating a 'knife index rebuild' run" do
86
+
87
+ before :each do
88
+ knife.should_receive(:grab_api_info).and_return(api_info)
89
+ server_specific_stubs!
90
+ end
91
+
92
+ context "against a Chef 11 server" do
93
+ let(:api_info) do
94
+ {"flavor" => "osc",
95
+ "version" => "11.0.0",
96
+ "erchef" => "1.2.3"
97
+ }
98
+ end
99
+ let(:server_specific_stubs!) do
100
+ knife.should_receive(:unsupported_server_message).with(api_info)
101
+ knife.should_receive(:exit).with(1)
102
+ end
103
+
104
+ it "should not be allowed" do
105
+ knife.run
106
+ end
107
+ end
108
+
109
+ context "against a Chef 10 server" do
110
+ let(:api_info){ {} }
111
+ let(:server_specific_stubs!) do
112
+ stub_rest!
113
+ rest_client.should_receive(:post_rest).with("/search/reindex", {}).and_return("representative output")
114
+ knife.should_not_receive(:unsupported_server_message)
115
+ knife.should_receive(:deprecated_server_message)
116
+ knife.should_receive(:nag)
117
+ knife.should_receive(:output).with("representative output")
118
+ end
119
+ it "should be allowed" do
120
+ knife.run
121
+ end
62
122
  end
63
123
  end
64
124
 
65
125
  end
126
+
127
+
128
+