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
@@ -150,32 +150,11 @@ describe Chef::Daemon do
150
150
  File.stub!(:exists?).with("/var/run/chef/chef-client.pid").and_return(true)
151
151
  end
152
152
 
153
- describe "and contains the current pid" do
154
-
155
- before do
156
- File.stub!(:read).with("/var/run/chef/chef-client.pid").and_return("#$$\n")
157
- end
158
-
159
- it "should remove the file" do
160
- FileUtils.should_receive(:rm).with("/var/run/chef/chef-client.pid")
161
- Chef::Daemon.remove_pid_file
162
- end
163
-
153
+ it "should remove the file" do
154
+ FileUtils.should_receive(:rm).with("/var/run/chef/chef-client.pid")
155
+ Chef::Daemon.remove_pid_file
164
156
  end
165
157
 
166
- describe "and contains a different pid" do
167
-
168
- before do
169
- other_pid = Process.pid + 1
170
- File.stub!(:read).with("/var/run/chef/chef-client.pid").and_return("#{other_pid}\n")
171
- end
172
-
173
- it "should not remove the file" do
174
- FileUtils.should_not_receive(:rm)
175
- Chef::Daemon.remove_pid_file
176
- end
177
-
178
- end
179
158
 
180
159
  end
181
160
 
@@ -76,13 +76,14 @@ describe Chef::DataBag do
76
76
  Chef::REST.stub!(:new).and_return(@rest)
77
77
  end
78
78
 
79
- it "should silently proceed when the data bag already exists" do
80
- exception = mock("409 error", :code => "409")
81
- @rest.should_receive(:post_rest).and_raise(Net::HTTPServerException.new("foo", exception))
79
+ it "should update the data bag when it already exists" do
80
+ @rest.should_receive(:put_rest).with("data/piggly_wiggly", @data_bag)
82
81
  @data_bag.save
83
82
  end
84
83
 
85
- it "should create the data bag" do
84
+ it "should create the data bag when it is not found" do
85
+ exception = mock("404 error", :code => "404")
86
+ @rest.should_receive(:put_rest).and_raise(Net::HTTPServerException.new("foo", exception))
86
87
  @rest.should_receive(:post_rest).with("data", @data_bag)
87
88
  @data_bag.save
88
89
  end
@@ -95,6 +96,7 @@ describe Chef::DataBag do
95
96
  Chef::Config[:why_run] = false
96
97
  end
97
98
  it "should not save" do
99
+ @rest.should_not_receive(:put_rest)
98
100
  @rest.should_not_receive(:post_rest)
99
101
  @data_bag.save
100
102
  end
@@ -0,0 +1,50 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
4
+ # Copyright:: Copyright (c) 2009 Opscode, Inc.
5
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ require 'spec_helper'
22
+
23
+ describe Chef::Digester do
24
+ before(:each) do
25
+ @cache = Chef::Digester.instance
26
+ end
27
+
28
+ describe "when computing checksums of cookbook files and templates" do
29
+
30
+ it "proxies the class method checksum_for_file to the instance" do
31
+ @cache.should_receive(:checksum_for_file).with("a_file_or_a_fail")
32
+ Chef::Digester.checksum_for_file("a_file_or_a_fail")
33
+ end
34
+
35
+ it "computes a checksum of a file" do
36
+ fixture_file = CHEF_SPEC_DATA + "/checksum/random.txt"
37
+ expected = "09ee9c8cc70501763563bcf9c218d71b2fbf4186bf8e1e0da07f0f42c80a3394"
38
+ @cache.checksum_for_file(fixture_file).should == expected
39
+ end
40
+
41
+ it "generates a checksum from a non-file IO object" do
42
+ io = StringIO.new("riseofthemachines\nriseofthechefs\n")
43
+ expected_md5 = '0e157ac1e2dd73191b76067fb6b4bceb'
44
+ @cache.generate_md5_checksum(io).should == expected_md5
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
@@ -0,0 +1,66 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+ require 'chef/dsl/data_query'
21
+
22
+ class DataQueryDSLTester
23
+ include Chef::DSL::DataQuery
24
+ end
25
+
26
+ describe Chef::DSL::DataQuery do
27
+ before(:each) do
28
+ @language = DataQueryDSLTester.new
29
+ @node = Hash.new
30
+ @language.stub!(:node).and_return(@node)
31
+ end
32
+
33
+ describe "when loading data bags and items" do
34
+ it "lists the items in a data bag" do
35
+ Chef::DataBag.should_receive(:load).with("bag_name").and_return("item_1" => "http://url_for/item_1", "item_2" => "http://url_for/item_2")
36
+ @language.data_bag("bag_name").sort.should == %w[item_1 item_2]
37
+ end
38
+
39
+ it "validates the name of the data bag you're trying to load" do
40
+ lambda {@language.data_bag("!# %^&& ")}.should raise_error(Chef::Exceptions::InvalidDataBagName)
41
+ end
42
+
43
+ it "fetches a data bag item" do
44
+ @item = Chef::DataBagItem.new
45
+ @item.data_bag("bag_name")
46
+ @item.raw_data = {"id" => "item_name", "FUU" => "FUU"}
47
+ Chef::DataBagItem.should_receive(:load).with("bag_name", "item_name").and_return(@item)
48
+ @language.data_bag_item("bag_name", "item_name").should == @item
49
+ end
50
+
51
+ it "validates the name of the data bag you're trying to load an item from" do
52
+ lambda {@language.data_bag_item(" %%^& ", "item_name")}.should raise_error(Chef::Exceptions::InvalidDataBagName)
53
+ end
54
+
55
+ it "validates the id of the data bag item you're trying to load" do
56
+ lambda {@language.data_bag_item("bag_name", " 987 (*&()")}.should raise_error(Chef::Exceptions::InvalidDataBagItemID)
57
+ end
58
+
59
+ it "validates that the id of the data bag item is not nil" do
60
+ lambda {@language.data_bag_item("bag_name", nil)}.should raise_error(Chef::Exceptions::InvalidDataBagItemID)
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
@@ -0,0 +1,130 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+ require 'chef/dsl/platform_introspection'
21
+
22
+ class LanguageTester
23
+ attr_reader :node
24
+ def initialize(node)
25
+ @node = node
26
+ end
27
+ include Chef::DSL::PlatformIntrospection
28
+ end
29
+
30
+ describe "PlatformIntrospection implementors" do
31
+
32
+ let(:node) { Chef::Node.new }
33
+ let(:platform_introspector) { LanguageTester.new(node) }
34
+
35
+ it_behaves_like "a platform introspector"
36
+
37
+ end
38
+
39
+ describe Chef::DSL::PlatformIntrospection::PlatformDependentValue do
40
+ before do
41
+ platform_hash = {
42
+ :openbsd => {:default => 'free, functional, secure'},
43
+ [:redhat, :centos, :fedora, :scientific] => {:default => '"stable"'},
44
+ :ubuntu => {'10.04' => 'using upstart more', :default => 'using init more'},
45
+ :default => 'bork da bork'
46
+ }
47
+ @platform_specific_value = Chef::DSL::PlatformIntrospection::PlatformDependentValue.new(platform_hash)
48
+ end
49
+
50
+ it "returns the default value when the platform doesn't match" do
51
+ @platform_specific_value.value_for_node(:platform => :dos).should == 'bork da bork'
52
+ end
53
+
54
+ it "returns a value for a platform set as a group" do
55
+ @platform_specific_value.value_for_node(:platform => :centos).should == '"stable"'
56
+ end
57
+
58
+ it "returns a value for the platform when it was set as a symbol but fetched as a string" do
59
+ @platform_specific_value.value_for_node(:platform => "centos").should == '"stable"'
60
+ end
61
+
62
+ it "returns a value for a specific platform version" do
63
+ node = {:platform => 'ubuntu', :platform_version => '10.04'}
64
+ @platform_specific_value.value_for_node(node).should == 'using upstart more'
65
+ end
66
+
67
+ it "returns a platform-default value if the platform version doesn't match an explicit one" do
68
+ node = {:platform => 'ubuntu', :platform_version => '9.10' }
69
+ @platform_specific_value.value_for_node(node).should == 'using init more'
70
+ end
71
+
72
+ it "returns nil if there is no default and no platforms match" do
73
+ # this matches the behavior in the original implementation.
74
+ # whether or not it's correct is another matter.
75
+ platform_specific_value = Chef::DSL::PlatformIntrospection::PlatformDependentValue.new({})
76
+ platform_specific_value.value_for_node(:platform => 'foo').should be_nil
77
+ end
78
+
79
+ it "raises an argument error if the platform hash is not correctly structured" do
80
+ bad_hash = {:ubuntu => :foo} # should be :ubuntu => {:default => 'foo'}
81
+ lambda {Chef::DSL::PlatformIntrospection::PlatformDependentValue.new(bad_hash)}.should raise_error(ArgumentError)
82
+ end
83
+
84
+ end
85
+ describe Chef::DSL::PlatformIntrospection::PlatformFamilyDependentValue do
86
+ before do
87
+ @array_values = [:stop, :start, :reload]
88
+
89
+ @platform_family_hash = {
90
+ "debian" => "debian value",
91
+ [:rhel, "fedora"] => "redhatty value",
92
+ "suse" => @array_values,
93
+ :gentoo => "gentoo value",
94
+ :default => "default value"
95
+ }
96
+
97
+ @platform_family_value = Chef::DSL::PlatformIntrospection::PlatformFamilyDependentValue.new(@platform_family_hash)
98
+ end
99
+
100
+ it "returns the default value when the platform family doesn't match" do
101
+ @platform_family_value.value_for_node(:platform_family => :os2).should == 'default value'
102
+ end
103
+
104
+
105
+ it "returns a value for the platform family when it was set as a string but fetched as a symbol" do
106
+ @platform_family_value.value_for_node(:platform_family => :debian).should == "debian value"
107
+ end
108
+
109
+ it "returns a value for the platform family when it was set as a symbol but fetched as a string" do
110
+ @platform_family_value.value_for_node(:platform_family => "gentoo").should == "gentoo value"
111
+ end
112
+
113
+ it "returns an array value stored for a platform family" do
114
+ @platform_family_value.value_for_node(:platform_family => "suse").should == @array_values
115
+ end
116
+
117
+ it "returns a value for the platform family when it was set within an array hash key as a symbol" do
118
+ @platform_family_value.value_for_node(:platform_family => :rhel).should == "redhatty value"
119
+ end
120
+
121
+ it "returns a value for the platform family when it was set within an array hash key as a string" do
122
+ @platform_family_value.value_for_node(:platform_family => "fedora").should == "redhatty value"
123
+ end
124
+
125
+ it "returns nil if there is no default and no platforms match" do
126
+ platform_specific_value = Chef::DSL::PlatformIntrospection::PlatformFamilyDependentValue.new({})
127
+ platform_specific_value.value_for_node(:platform_family => 'foo').should be_nil
128
+ end
129
+
130
+ end
@@ -0,0 +1,55 @@
1
+ #
2
+ # Author:: Prajakta Purohit (<prajakta@opscode.com>)
3
+ # Copyright:: Copyright (c) 2011 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require "chef/dsl/registry_helper"
20
+ require "spec_helper"
21
+
22
+ describe Chef::Resource::RegistryKey do
23
+
24
+ before (:all) do
25
+ events = Chef::EventDispatch::Dispatcher.new
26
+ node = Chef::Node.new
27
+ ohai = Ohai::System.new
28
+ ohai.all_plugins
29
+ node.consume_external_attrs(ohai.data,{})
30
+ run_context = Chef::RunContext.new(node, {}, events)
31
+ @resource = Chef::Resource::new("foo", run_context)
32
+ end
33
+
34
+ context "tests registry dsl" do
35
+ it "resource can access registry_helper method registry_key_exists" do
36
+ @resource.respond_to?('registry_key_exists?').should == true
37
+ end
38
+ it "resource can access registry_helper method registry_get_values" do
39
+ @resource.respond_to?('registry_get_values').should == true
40
+ end
41
+ it "resource can access registry_helper method registry_has_subkey" do
42
+ @resource.respond_to?('registry_has_subkeys?').should == true
43
+ end
44
+ it "resource can access registry_helper method registry_get_subkeys" do
45
+ @resource.respond_to?('registry_get_subkeys').should == true
46
+ end
47
+ it "resource can access registry_helper method registry_value_exists" do
48
+ @resource.respond_to?('registry_value_exists?').should == true
49
+ end
50
+ it "resource can access registry_helper method data_value_exists" do
51
+ @resource.respond_to?('registry_data_exists?').should == true
52
+ end
53
+ end
54
+ end
55
+
@@ -19,7 +19,7 @@
19
19
  require 'spec_helper'
20
20
  require 'chef/encrypted_data_bag_item'
21
21
 
22
- module Version0Encryptor
22
+ module Version1Encryptor
23
23
  def self.encrypt_value(plaintext_data, key)
24
24
  data = plaintext_data.to_yaml
25
25
 
@@ -32,83 +32,46 @@ module Version0Encryptor
32
32
  end
33
33
  end
34
34
 
35
- # Encryption/serialization code from Chef 11.
36
- class Version1Encryptor
37
- ALGORITHM = "aes-256-cbc"
38
-
39
- attr_reader :key
40
- attr_reader :plaintext_data
41
-
42
- # Create a new Encryptor for +data+, which will be encrypted with the given
43
- # +key+.
44
- #
45
- # === Arguments:
46
- # * data: An object of any type that can be serialized to json
47
- # * key: A String representing the desired passphrase
48
- # * iv: The optional +iv+ parameter is intended for testing use only. When
49
- # *not* supplied, Encryptor will use OpenSSL to generate a secure random
50
- # IV, which is what you want.
51
- def initialize(plaintext_data, key, iv=nil)
52
- @plaintext_data = plaintext_data
53
- @key = key
54
- @iv = iv && Base64.decode64(iv)
55
- end
35
+ describe Chef::EncryptedDataBagItem::Encryptor do
56
36
 
57
- # Returns a wrapped and encrypted version of +plaintext_data+ suitable for
58
- # using as the value in an encrypted data bag item.
59
- def for_encrypted_item
60
- {
61
- "encrypted_data" => encrypted_data,
62
- "iv" => Base64.encode64(iv),
63
- "version" => 1,
64
- "cipher" => ALGORITHM
65
- }
66
- end
37
+ describe "generating a random IV" do
38
+ it "generates a new IV for each encryption pass" do
39
+ encryptor1 = Chef::EncryptedDataBagItem::Encryptor.new({"foo" => "bar"}, "passwd")
40
+ encryptor2 = Chef::EncryptedDataBagItem::Encryptor.new({"foo" => "bar"}, "passwd")
67
41
 
68
- # Generates or returns the IV.
69
- def iv
70
- # Generated IV comes from OpenSSL::Cipher::Cipher#random_iv
71
- # This gets generated when +openssl_encryptor+ gets created.
72
- openssl_encryptor if @iv.nil?
73
- @iv
42
+ # No API in ruby OpenSSL to get the iv it used for the encryption back
43
+ # out. Instead we test if the encrypted data is the same. If it *is* the
44
+ # same, we assume the IV was the same each time.
45
+ encryptor1.encrypted_data.should_not == encryptor2.encrypted_data
46
+ end
74
47
  end
75
48
 
76
- # Generates (and memoizes) an OpenSSL::Cipher::Cipher object and configures
77
- # it for the specified iv and encryption key.
78
- def openssl_encryptor
79
- @openssl_encryptor ||= begin
80
- encryptor = OpenSSL::Cipher::Cipher.new(ALGORITHM)
81
- encryptor.encrypt
82
- @iv ||= encryptor.random_iv
83
- encryptor.iv = @iv
84
- encryptor.key = Digest::SHA256.digest(key)
85
- encryptor
49
+ describe "when encrypting a non-hash non-array value" do
50
+ it "serializes the value in a de-serializable way" do
51
+ encryptor = Chef::EncryptedDataBagItem::Encryptor.new(5, "passwd")
52
+ Chef::JSONCompat.from_json(encryptor.serialized_data)["json_wrapper"].should == 5
86
53
  end
54
+
87
55
  end
88
56
 
89
- # Encrypts and Base64 encodes +serialized_data+
90
- def encrypted_data
91
- @encrypted_data ||= begin
92
- enc_data = openssl_encryptor.update(serialized_data)
93
- enc_data << openssl_encryptor.final
94
- Base64.encode64(enc_data)
57
+ describe "wrapping secret values in an envelope" do
58
+ it "wraps the encrypted data in an envelope with the iv and version" do
59
+ encryptor = Chef::EncryptedDataBagItem::Encryptor.new({"foo" => "bar"}, "passwd")
60
+ final_data = encryptor.for_encrypted_item
61
+ final_data["encrypted_data"].should == encryptor.encrypted_data
62
+ final_data["iv"].should == Base64.encode64(encryptor.iv)
63
+ final_data["version"].should == 1
64
+ final_data["cipher"].should == "aes-256-cbc"
95
65
  end
96
- end
97
66
 
98
- # Wraps the data in a single key Hash (JSON Object) and converts to JSON.
99
- # The wrapper is required because we accept values (such as Integers or
100
- # Strings) that do not produce valid JSON when serialized without the
101
- # wrapper.
102
- def serialized_data
103
- Chef::JSONCompat.to_json(:json_wrapper => plaintext_data)
104
67
  end
105
- end
106
68
 
69
+ end
107
70
 
108
71
  describe Chef::EncryptedDataBagItem::Decryptor do
109
72
  context "when decrypting a version 1 (JSON+aes-256-cbc+random iv) encrypted value" do
110
73
  before do
111
- @encryptor = Version1Encryptor.new({"foo" => "bar"}, "passwd")
74
+ @encryptor = Chef::EncryptedDataBagItem::Encryptor.new({"foo" => "bar"}, "passwd")
112
75
  @encrypted_value = @encryptor.for_encrypted_item
113
76
 
114
77
  @decryptor = Chef::EncryptedDataBagItem::Decryptor.for(@encrypted_value, "passwd")
@@ -150,7 +113,7 @@ describe Chef::EncryptedDataBagItem::Decryptor do
150
113
 
151
114
  context "when decrypting a version 0 (YAML+aes-256-cbc+no iv) encrypted value" do
152
115
  before do
153
- @encrypted_value = Version0Encryptor.encrypt_value({"foo" => "bar"}, "passwd")
116
+ @encrypted_value = Version1Encryptor.encrypt_value({"foo" => "bar"}, "passwd")
154
117
 
155
118
  @decryptor = Chef::EncryptedDataBagItem::Decryptor.for(@encrypted_value, "passwd")
156
119
  end
@@ -177,33 +140,41 @@ describe Chef::EncryptedDataBagItem do
177
140
  @secret)
178
141
  end
179
142
 
180
- describe "encrypting" do
181
143
 
182
- it "uses version 0 encryption/serialization" do
183
- @enc_data["greeting"].should == Version0Encryptor.encrypt_value(@plain_data["greeting"], @secret)
184
- end
144
+ describe "encrypting" do
185
145
 
186
146
  it "should not encrypt the 'id' key" do
187
147
  @enc_data["id"].should == "item_name"
188
148
  end
189
149
 
190
- it "should encrypt 'greeting'" do
191
- @enc_data["greeting"].should_not == @plain_data["greeting"]
192
- end
150
+ it "should encrypt non-collection objects" do
151
+ @enc_data["greeting"]["version"].should == 1
152
+ @enc_data["greeting"].should have_key("iv")
153
+
154
+ iv = @enc_data["greeting"]["iv"]
155
+ encryptor = Chef::EncryptedDataBagItem::Encryptor.new("hello", @secret, iv)
193
156
 
194
- it "should encrypt 'nested'" do
195
- nested = @enc_data["nested"]
196
- nested.class.should == String
197
- nested.should_not == @plain_data["nested"]
157
+ @enc_data["greeting"]["encrypted_data"].should == encryptor.for_encrypted_item["encrypted_data"]
198
158
  end
199
159
 
200
- it "from_plain_hash" do
201
- eh1 = Chef::EncryptedDataBagItem.from_plain_hash(@plain_data, @secret)
202
- eh1.class.should == Chef::EncryptedDataBagItem
160
+ it "should encrypt nested values" do
161
+ @enc_data["nested"]["version"].should == 1
162
+ @enc_data["nested"].should have_key("iv")
163
+
164
+ iv = @enc_data["nested"]["iv"]
165
+ encryptor = Chef::EncryptedDataBagItem::Encryptor.new(@plain_data["nested"], @secret, iv)
166
+
167
+ @enc_data["nested"]["encrypted_data"].should == encryptor.for_encrypted_item["encrypted_data"]
203
168
  end
169
+
204
170
  end
205
171
 
206
- shared_examples_for "a decrypted data bag item" do
172
+ describe "decrypting" do
173
+ before(:each) do
174
+ @enc_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(@plain_data,
175
+ @secret)
176
+ @eh = Chef::EncryptedDataBagItem.new(@enc_data, @secret)
177
+ end
207
178
 
208
179
  it "doesn't try to decrypt 'id'" do
209
180
  @eh["id"].should == @plain_data["id"]
@@ -226,32 +197,6 @@ describe Chef::EncryptedDataBagItem do
226
197
  end
227
198
  end
228
199
 
229
- describe "decrypting" do
230
- before(:each) do
231
- @enc_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(@plain_data,
232
- @secret)
233
- @eh = Chef::EncryptedDataBagItem.new(@enc_data, @secret)
234
- end
235
-
236
- it_behaves_like "a decrypted data bag item"
237
- end
238
-
239
- describe "when decrypting a version 1 (Chef 11.x) data bag item" do
240
- before do
241
- @enc_data = @plain_data.inject({}) do |encrypted, (key, value)|
242
- if key == "id"
243
- encrypted["id"] = value
244
- else
245
- encrypted[key] = Version1Encryptor.new(value, @secret).for_encrypted_item
246
- end
247
- encrypted
248
- end
249
- @eh = Chef::EncryptedDataBagItem.new(@enc_data, @secret)
250
- end
251
-
252
- it_behaves_like "a decrypted data bag item"
253
- end
254
-
255
200
  describe "loading" do
256
201
  it "should defer to Chef::DataBagItem.load" do
257
202
  Chef::DataBagItem.stub(:load).with(:the_bag, "my_codes").and_return(@enc_data)