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
@@ -23,6 +23,8 @@ describe Chef::Resource::Directory do
23
23
 
24
24
  let(:directory_base) { "directory_spec" }
25
25
 
26
+ let(:default_mode) { "755" }
27
+
26
28
  def create_resource
27
29
  events = Chef::EventDispatch::Dispatcher.new
28
30
  node = Chef::Node.new
@@ -36,4 +38,6 @@ describe Chef::Resource::Directory do
36
38
 
37
39
  it_behaves_like "a directory resource"
38
40
 
41
+ it_behaves_like "a securable resource with reporting"
42
+
39
43
  end
@@ -29,41 +29,75 @@ describe Chef::Resource::File do
29
29
  node = Chef::Node.new
30
30
  run_context = Chef::RunContext.new(node, {}, events)
31
31
  resource = Chef::Resource::File.new(path, run_context)
32
- resource.content(expected_content)
33
32
  resource
34
33
  end
35
34
 
36
35
  let!(:resource) do
36
+ r = create_resource
37
+ r.content(expected_content)
38
+ r
39
+ end
40
+
41
+ let(:resource_without_content) do
37
42
  create_resource
38
43
  end
39
44
 
40
- it_behaves_like "a file resource"
45
+ let(:unmanaged_content) do
46
+ "This is file content that is not managed by chef"
47
+ end
41
48
 
42
- context "when the target file does not exist" do
43
- it "it creates the file when the :touch action is run" do
44
- resource.run_action(:touch)
45
- File.should exist(path)
46
- end
49
+ let(:current_resource) do
50
+ provider = resource.provider_for_action(resource.action)
51
+ provider.load_current_resource
52
+ provider.current_resource
47
53
  end
48
54
 
49
- context "when the target file has the correct content" do
50
- before(:each) do
51
- File.open(path, "w") { |f| f.print expected_content }
52
- end
55
+ let(:default_mode) { ((0100666 - File.umask) & 07777).to_s(8) }
56
+
57
+ it_behaves_like "a file resource"
58
+
59
+ it_behaves_like "a securable resource with reporting"
53
60
 
54
- it "updates the mtime/atime of the file when the :touch action is run" do
55
- expected_mtime = File.stat(path).mtime
56
- expected_atime = File.stat(path).atime
57
- sleep 1
58
- resource.run_action(:touch)
59
- File.stat(path).mtime.should > expected_mtime
60
- File.stat(path).atime.should > expected_atime
61
+ describe "when running action :touch" do
62
+ context "and the target file does not exist" do
63
+ before do
64
+ resource.run_action(:touch)
65
+ end
66
+
67
+ it "it creates the file" do
68
+ File.should exist(path)
69
+ end
70
+
71
+ it "is marked updated by last action" do
72
+ resource.should be_updated_by_last_action
73
+ end
61
74
  end
62
75
 
63
- it "does not change the content when :touch action is run" do
64
- expected_checksum = sha256_checksum(path)
65
- resource.run_action(:touch)
66
- sha256_checksum(path).should == expected_checksum
76
+ context "and the target file exists and has the correct content" do
77
+ before(:each) do
78
+ File.open(path, "w") { |f| f.print expected_content }
79
+
80
+ @expected_checksum = sha256_checksum(path)
81
+
82
+ now = Time.now.to_i
83
+ File.utime(now - 9000, now - 9000, path)
84
+ @expected_mtime = File.stat(path).mtime
85
+
86
+ resource.run_action(:touch)
87
+ end
88
+
89
+ it "updates the mtime of the file" do
90
+ File.stat(path).mtime.should > @expected_mtime
91
+ end
92
+
93
+ it "does not change the content" do
94
+ sha256_checksum(path).should == @expected_checksum
95
+ end
96
+
97
+ it "is marked as updated by last action" do
98
+ resource.should be_updated_by_last_action
99
+ end
67
100
  end
68
101
  end
102
+
69
103
  end
@@ -25,6 +25,8 @@ end
25
25
  describe Chef::Resource::Link, :not_supported_on_win2k3 do
26
26
  let(:file_base) { "file_spec" }
27
27
 
28
+ let(:expect_updated?) {true}
29
+
28
30
  let(:base_dir) do
29
31
  if windows?
30
32
  Chef::ReservedNames::Win32::File.get_long_path_name(Dir.tmpdir.gsub('/', '\\'))
@@ -0,0 +1,576 @@
1
+ #
2
+ # Author:: Prajakta Purohit (<prajakta@opscode.com>)
3
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
4
+ # Copyright:: Copyright (c) 2011 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require "chef/win32/registry"
21
+ require "chef/resource_reporter"
22
+ require "spec_helper"
23
+
24
+ describe Chef::Resource::RegistryKey, :unix_only do
25
+ before(:all) do
26
+ events = Chef::EventDispatch::Dispatcher.new
27
+ node = Chef::Node.new
28
+ ohai = Ohai::System.new
29
+ ohai.all_plugins
30
+ node.consume_external_attrs(ohai.data,{})
31
+ run_context = Chef::RunContext.new(node, {}, events)
32
+ @resource = Chef::Resource::RegistryKey.new("HKCU\\Software", run_context)
33
+ end
34
+ context "when load_current_resource is run on a non-windows node" do
35
+ it "throws an exception because you don't have a windows registry (derp)" do
36
+ @resource.key("HKCU\\Software\\Opscode")
37
+ @resource.values([{:name=>"Color", :type=>:string, :data=>"Orange"}])
38
+ lambda{@resource.run_action(:create)}.should raise_error(Chef::Exceptions::Win32NotWindows)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe Chef::Resource::RegistryKey, :windows_only do
44
+
45
+ # parent and key must be single keys, not paths
46
+ let(:parent) { 'Opscode' }
47
+ let(:child) { 'Whatever' }
48
+ let(:key_parent) { "SOFTWARE\\" + parent }
49
+ let(:key_child) { "SOFTWARE\\" + parent + "\\" + child }
50
+ # must be under HKLM\SOFTWARE for WOW64 redirection to work
51
+ let(:reg_parent) { "HKLM\\" + key_parent }
52
+ let(:reg_child) { "HKLM\\" + key_child }
53
+ let(:hive_class) { ::Win32::Registry::HKEY_LOCAL_MACHINE }
54
+ let(:resource_name) { "This is the name of my Resource" }
55
+
56
+ def clean_registry
57
+ # clean 64-bit space on WOW64
58
+ begin
59
+ hive_class.open(key_parent, Win32::Registry::KEY_WRITE | 0x0100) do |reg|
60
+ reg.delete_key(child, true)
61
+ end
62
+ rescue
63
+ end
64
+ # clean 32-bit space on WOW64
65
+ begin
66
+ hive_class.open(key_parent, Win32::Registry::KEY_WRITE | 0x0200) do |reg|
67
+ reg.delete_key(child, true)
68
+ end
69
+ rescue
70
+ end
71
+ end
72
+
73
+ def reset_registry
74
+ clean_registry
75
+ hive_class.create(key_parent, Win32::Registry::KEY_WRITE | 0x0100)
76
+ hive_class.create(key_parent, Win32::Registry::KEY_WRITE | 0x0200)
77
+ end
78
+
79
+ def create_deletable_keys
80
+ # create them both 32-bit and 64-bit
81
+ [ 0x0100, 0x0200 ].each do |flag|
82
+ hive_class.create(key_parent + '\Opscode', Win32::Registry::KEY_WRITE | flag)
83
+ hive_class.open(key_parent + '\Opscode', Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
84
+ reg["Color", Win32::Registry::REG_SZ] = "Orange"
85
+ reg.write("Opscode", Win32::Registry::REG_MULTI_SZ, ["Seattle", "Washington"])
86
+ reg["AKA", Win32::Registry::REG_SZ] = "OC"
87
+ end
88
+ hive_class.create(key_parent + '\ReportKey', Win32::Registry::KEY_WRITE | flag)
89
+ hive_class.open(key_parent + '\ReportKey', Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
90
+ reg["ReportVal4", Win32::Registry::REG_SZ] = "report4"
91
+ reg["ReportVal5", Win32::Registry::REG_SZ] = "report5"
92
+ end
93
+ hive_class.create(key_parent + '\OpscodeWhyRun', Win32::Registry::KEY_WRITE | flag)
94
+ hive_class.open(key_parent + '\OpscodeWhyRun', Win32::Registry::KEY_ALL_ACCESS | flag) do |reg|
95
+ reg["BriskWalk", Win32::Registry::REG_SZ] = "is good for health"
96
+ end
97
+ end
98
+ end
99
+
100
+ before(:all) do
101
+ @events = Chef::EventDispatch::Dispatcher.new
102
+ @node = Chef::Node.new
103
+ ohai = Ohai::System.new
104
+ ohai.all_plugins
105
+ @node.consume_external_attrs(ohai.data,{})
106
+ @run_context = Chef::RunContext.new(@node, {}, @events)
107
+
108
+ @new_resource = Chef::Resource::RegistryKey.new(resource_name, @run_context)
109
+ @registry = Chef::Win32::Registry.new(@run_context)
110
+
111
+ @current_whyrun = Chef::Config[:why_run]
112
+
113
+ reset_registry
114
+ end
115
+
116
+ #Reporting setup
117
+ before do
118
+ @node.name("windowsbox")
119
+ @rest_client = mock("Chef::REST (mock)")
120
+ @rest_client.stub!(:create_url).and_return("reports/nodes/windowsbox/runs/ABC123");
121
+ @rest_client.stub!(:raw_http_request).and_return({"result"=>"ok"});
122
+ @rest_client.stub!(:post_rest).and_return({"uri"=>"https://example.com/reports/nodes/windowsbox/runs/ABC123"});
123
+
124
+ @resource_reporter = Chef::ResourceReporter.new(@rest_client)
125
+ @events.register(@resource_reporter)
126
+ @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
127
+
128
+ @new_resource.cookbook_name = "monkey"
129
+ @cookbook_version = mock("Cookbook::Version", :version => "1.2.3")
130
+ @new_resource.stub!(:cookbook_version).and_return(@cookbook_version)
131
+ end
132
+
133
+ after (:all) do
134
+ clean_registry
135
+ end
136
+
137
+ context "when action is create" do
138
+ before (:all) do
139
+ reset_registry
140
+ end
141
+ it "creates registry key, value if the key is missing" do
142
+ @new_resource.key(reg_child)
143
+ @new_resource.values([{:name=>"Color", :type=>:string, :data=>"Orange"}])
144
+ @new_resource.run_action(:create)
145
+
146
+ @registry.key_exists?(reg_child).should == true
147
+ @registry.data_exists?(reg_child, {:name=>"Color", :type=>:string, :data=>"Orange"}).should == true
148
+ end
149
+
150
+ it "does not create the key if it already exists with same value, type and data" do
151
+ @new_resource.key(reg_child)
152
+ @new_resource.values([{:name=>"Color", :type=>:string, :data=>"Orange"}])
153
+ @new_resource.run_action(:create)
154
+
155
+ @registry.key_exists?(reg_child).should == true
156
+ @registry.data_exists?(reg_child, {:name=>"Color", :type=>:string, :data=>"Orange"}).should == true
157
+ end
158
+
159
+ it "creates a value if it does not exist" do
160
+ @new_resource.key(reg_child)
161
+ @new_resource.values([{:name=>"Mango", :type=>:string, :data=>"Yellow"}])
162
+ @new_resource.run_action(:create)
163
+
164
+ @registry.data_exists?(reg_child, {:name=>"Mango", :type=>:string, :data=>"Yellow"}).should == true
165
+ end
166
+
167
+ it "modifies the data if the key and value exist and type matches" do
168
+ @new_resource.key(reg_child)
169
+ @new_resource.values([{:name=>"Color", :type=>:string, :data=>"Not just Orange - OpscodeOrange!"}])
170
+ @new_resource.run_action(:create)
171
+
172
+ @registry.data_exists?(reg_child, {:name=>"Color", :type=>:string, :data=>"Not just Orange - OpscodeOrange!"}).should == true
173
+ end
174
+
175
+ it "modifys the type if the key and value exist and the type does not match" do
176
+ @new_resource.key(reg_child)
177
+ @new_resource.values([{:name=>"Color", :type=>:multi_string, :data=>["Not just Orange - OpscodeOrange!"]}])
178
+ @new_resource.run_action(:create)
179
+
180
+ @registry.data_exists?(reg_child, {:name=>"Color", :type=>:multi_string, :data=>["Not just Orange - OpscodeOrange!"]}).should == true
181
+ end
182
+
183
+ it "creates subkey if parent exists" do
184
+ @new_resource.key(reg_child + '\OpscodeTest')
185
+ @new_resource.values([{:name=>"Chef", :type=>:multi_string, :data=>["OpscodeOrange", "Rules"]}])
186
+ @new_resource.recursive(false)
187
+ @new_resource.run_action(:create)
188
+
189
+ @registry.key_exists?(reg_child + '\OpscodeTest').should == true
190
+ @registry.value_exists?(reg_child + '\OpscodeTest', {:name=>"Chef", :type=>:multi_string, :data=>["OpscodeOrange", "Rules"]}).should == true
191
+ end
192
+
193
+ it "gives error if action create and parent does not exist and recursive is set to false" do
194
+ @new_resource.key(reg_child + '\Missing1\Missing2')
195
+ @new_resource.values([{:name=>"OC", :type=>:string, :data=>"MissingData"}])
196
+ @new_resource.recursive(false)
197
+ lambda{@new_resource.run_action(:create)}.should raise_error(Chef::Exceptions::Win32RegNoRecursive)
198
+ end
199
+
200
+ it "creates missing keys if action create and parent does not exist and recursive is set to true" do
201
+ @new_resource.key(reg_child + '\Missing1\Missing2')
202
+ @new_resource.values([{:name=>"OC", :type=>:string, :data=>"MissingData"}])
203
+ @new_resource.recursive(true)
204
+ @new_resource.run_action(:create)
205
+
206
+ @registry.key_exists?(reg_child + '\Missing1\Missing2').should == true
207
+ @registry.value_exists?(reg_child + '\Missing1\Missing2', {:name=>"OC", :type=>:string, :data=>"MissingData"}).should == true
208
+ end
209
+
210
+ it "creates key with multiple value as specified" do
211
+ @new_resource.key(reg_child)
212
+ @new_resource.values([{:name=>"one", :type=>:string, :data=>"1"},{:name=>"two", :type=>:string, :data=>"2"},{:name=>"three", :type=>:string, :data=>"3"}])
213
+ @new_resource.recursive(true)
214
+ @new_resource.run_action(:create)
215
+
216
+ @new_resource.values.each do |value|
217
+ @registry.value_exists?(reg_child, value).should == true
218
+ end
219
+ end
220
+
221
+ context "when running on 64-bit server", :windows64_only do
222
+ before(:all) do
223
+ reset_registry
224
+ end
225
+ after(:all) do
226
+ @new_resource.architecture(:machine)
227
+ @registry.architecture = :machine
228
+ end
229
+ it "creates a key in a 32-bit registry that is not viewable in 64-bit" do
230
+ @new_resource.key(reg_child + '\Atraxi' )
231
+ @new_resource.values([{:name=>"OC", :type=>:string, :data=>"Data"}])
232
+ @new_resource.recursive(true)
233
+ @new_resource.architecture(:i386)
234
+ @new_resource.run_action(:create)
235
+ @registry.architecture = :i386
236
+ @registry.data_exists?(reg_child + '\Atraxi', {:name=>"OC", :type=>:string, :data=>"Data"}).should == true
237
+ @registry.architecture = :x86_64
238
+ @registry.key_exists?(reg_child + '\Atraxi').should == false
239
+ end
240
+ end
241
+
242
+ it "prepares the reporting data for action :create" do
243
+ @new_resource.key(reg_child + '\Ood')
244
+ @new_resource.values([{:name=>"ReportingVal1", :type=>:string, :data=>"report1"},{:name=>"ReportingVal2", :type=>:string, :data=>"report2"}])
245
+ @new_resource.recursive(true)
246
+ @new_resource.run_action(:create)
247
+ @report = @resource_reporter.prepare_run_data
248
+
249
+ @report["action"].should == "end"
250
+ @report["resources"][0]["type"].should == "registry_key"
251
+ @report["resources"][0]["name"].should == resource_name
252
+ @report["resources"][0]["id"].should == reg_child + '\Ood'
253
+ @report["resources"][0]["after"][:values].should == [{:name=>"ReportingVal1", :type=>:string, :data=>"report1"},
254
+ {:name=>"ReportingVal2", :type=>:string, :data=>"report2"}]
255
+ @report["resources"][0]["before"][:values].should == []
256
+ @report["resources"][0]["result"].should == "create"
257
+ @report["status"].should == "success"
258
+ @report["total_res_count"].should == "1"
259
+ end
260
+
261
+ context "while running in whyrun mode" do
262
+ before (:all) do
263
+ Chef::Config[:why_run] = true
264
+ end
265
+ after (:all) do
266
+ Chef::Config[:why_run] = @current_whyrun
267
+ end
268
+
269
+ it "does not throw an exception if the keys do not exist but recursive is set to false" do
270
+ @new_resource.key(reg_child + '\Slitheen\Raxicoricofallapatorius')
271
+ @new_resource.values([{:name=>"BriskWalk",:type=>:string,:data=>"is good for health"}])
272
+ @new_resource.recursive(false)
273
+ lambda{@new_resource.run_action(:create)}.should_not raise_error
274
+ @registry.key_exists?(reg_child + '\Slitheen').should == false
275
+ @registry.key_exists?(reg_child + '\Slitheen\Raxicoricofallapatorius').should == false
276
+ end
277
+ it "does not create key if the action is create" do
278
+ @new_resource.key(reg_child + '\Slitheen')
279
+ @new_resource.values([{:name=>"BriskWalk",:type=>:string,:data=>"is good for health"}])
280
+ @new_resource.recursive(false)
281
+ @new_resource.run_action(:create)
282
+ @registry.key_exists?(reg_child + '\Slitheen').should == false
283
+ end
284
+ end
285
+ end
286
+
287
+ context "when action is create_if_missing" do
288
+ before (:all) do
289
+ reset_registry
290
+ end
291
+
292
+ it "creates registry key, value if the key is missing" do
293
+ @new_resource.key(reg_child)
294
+ @new_resource.values([{:name=>"Color", :type=>:string, :data=>"Orange"}])
295
+ @new_resource.run_action(:create_if_missing)
296
+
297
+ @registry.key_exists?(reg_parent).should == true
298
+ @registry.key_exists?(reg_child).should == true
299
+ @registry.data_exists?(reg_child, {:name=>"Color", :type=>:string, :data=>"Orange"}).should == true
300
+ end
301
+
302
+ it "does not create the key if it already exists with same value, type and data" do
303
+ @new_resource.key(reg_child)
304
+ @new_resource.values([{:name=>"Color", :type=>:string, :data=>"Orange"}])
305
+ @new_resource.run_action(:create_if_missing)
306
+
307
+ @registry.key_exists?(reg_child).should == true
308
+ @registry.data_exists?(reg_child, {:name=>"Color", :type=>:string, :data=>"Orange"}).should == true
309
+ end
310
+
311
+ it "creates a value if it does not exist" do
312
+ @new_resource.key(reg_child)
313
+ @new_resource.values([{:name=>"Mango", :type=>:string, :data=>"Yellow"}])
314
+ @new_resource.run_action(:create_if_missing)
315
+
316
+ @registry.data_exists?(reg_child, {:name=>"Mango", :type=>:string, :data=>"Yellow"}).should == true
317
+ end
318
+
319
+ it "creates subkey if parent exists" do
320
+ @new_resource.key(reg_child + '\Pyrovile')
321
+ @new_resource.values([{:name=>"Chef", :type=>:multi_string, :data=>["OpscodeOrange", "Rules"]}])
322
+ @new_resource.recursive(false)
323
+ @new_resource.run_action(:create_if_missing)
324
+
325
+ @registry.key_exists?(reg_child + '\Pyrovile').should == true
326
+ @registry.value_exists?(reg_child + '\Pyrovile', {:name=>"Chef", :type=>:multi_string, :data=>["OpscodeOrange", "Rules"]}).should == true
327
+ end
328
+
329
+ it "gives error if action create and parent does not exist and recursive is set to false" do
330
+ @new_resource.key(reg_child + '\Sontaran\Sontar')
331
+ @new_resource.values([{:name=>"OC", :type=>:string, :data=>"MissingData"}])
332
+ @new_resource.recursive(false)
333
+ lambda{@new_resource.run_action(:create_if_missing)}.should raise_error(Chef::Exceptions::Win32RegNoRecursive)
334
+ end
335
+
336
+ it "creates missing keys if action create and parent does not exist and recursive is set to true" do
337
+ @new_resource.key(reg_child + '\Sontaran\Sontar')
338
+ @new_resource.values([{:name=>"OC", :type=>:string, :data=>"MissingData"}])
339
+ @new_resource.recursive(true)
340
+ @new_resource.run_action(:create_if_missing)
341
+
342
+ @registry.key_exists?(reg_child + '\Sontaran\Sontar').should == true
343
+ @registry.value_exists?(reg_child + '\Sontaran\Sontar', {:name=>"OC", :type=>:string, :data=>"MissingData"}).should == true
344
+ end
345
+
346
+ it "creates key with multiple value as specified" do
347
+ @new_resource.key(reg_child + '\Adipose')
348
+ @new_resource.values([{:name=>"one", :type=>:string, :data=>"1"},{:name=>"two", :type=>:string, :data=>"2"},{:name=>"three", :type=>:string, :data=>"3"}])
349
+ @new_resource.recursive(true)
350
+ @new_resource.run_action(:create_if_missing)
351
+
352
+ @new_resource.values.each do |value|
353
+ @registry.value_exists?(reg_child + '\Adipose', value).should == true
354
+ end
355
+ end
356
+
357
+ it "prepares the reporting data for :create_if_missing" do
358
+ @new_resource.key(reg_child + '\Judoon')
359
+ @new_resource.values([{:name=>"ReportingVal3", :type=>:string, :data=>"report3"}])
360
+ @new_resource.recursive(true)
361
+ @new_resource.run_action(:create_if_missing)
362
+ @report = @resource_reporter.prepare_run_data
363
+
364
+ @report["action"].should == "end"
365
+ @report["resources"][0]["type"].should == "registry_key"
366
+ @report["resources"][0]["name"].should == resource_name
367
+ @report["resources"][0]["id"].should == reg_child + '\Judoon'
368
+ @report["resources"][0]["after"][:values].should == [{:name=>"ReportingVal3", :type=>:string, :data=>"report3"}]
369
+ @report["resources"][0]["before"][:values].should == []
370
+ @report["resources"][0]["result"].should == "create_if_missing"
371
+ @report["status"].should == "success"
372
+ @report["total_res_count"].should == "1"
373
+ end
374
+
375
+ context "while running in whyrun mode" do
376
+ before (:all) do
377
+ Chef::Config[:why_run] = true
378
+ end
379
+ after (:all) do
380
+ Chef::Config[:why_run] = @current_whyrun
381
+ end
382
+
383
+ it "does not throw an exception if the keys do not exist but recursive is set to false" do
384
+ @new_resource.key(reg_child + '\Zygons\Zygor')
385
+ @new_resource.values([{:name=>"BriskWalk",:type=>:string,:data=>"is good for health"}])
386
+ @new_resource.recursive(false)
387
+ lambda{@new_resource.run_action(:create_if_missing)}.should_not raise_error
388
+ @registry.key_exists?(reg_child + '\Zygons').should == false
389
+ @registry.key_exists?(reg_child + '\Zygons\Zygor').should == false
390
+ end
391
+ it "does nothing if the action is create_if_missing" do
392
+ @new_resource.key(reg_child + '\Zygons')
393
+ @new_resource.values([{:name=>"BriskWalk",:type=>:string,:data=>"is good for health"}])
394
+ @new_resource.recursive(false)
395
+ @new_resource.run_action(:create_if_missing)
396
+ @registry.key_exists?(reg_child + '\Zygons').should == false
397
+ end
398
+ end
399
+ end
400
+
401
+ context "when the action is delete" do
402
+ before(:all) do
403
+ reset_registry
404
+ create_deletable_keys
405
+ end
406
+
407
+ it "takes no action if the specified key path does not exist in the system" do
408
+ @registry.key_exists?(reg_parent + '\Osirian').should == false
409
+
410
+ @new_resource.key(reg_parent+ '\Osirian')
411
+ @new_resource.recursive(false)
412
+ @new_resource.run_action(:delete)
413
+
414
+ @registry.key_exists?(reg_parent + '\Osirian').should == false
415
+ end
416
+
417
+ it "takes no action if the key exists but the value does not" do
418
+ @registry.data_exists?(reg_parent + '\Opscode', {:name=>"Color", :type=>:string, :data=>"Orange"}).should == true
419
+
420
+ @new_resource.key(reg_parent + '\Opscode')
421
+ @new_resource.values([{:name=>"LooksLike", :type=>:multi_string, :data=>["SeattleGrey", "OCOrange"]}])
422
+ @new_resource.recursive(false)
423
+ @new_resource.run_action(:delete)
424
+
425
+ @registry.data_exists?(reg_parent + '\Opscode', {:name=>"Color", :type=>:string, :data=>"Orange"}).should == true
426
+ end
427
+
428
+ it "deletes only specified values under a key path" do
429
+ @new_resource.key(reg_parent + '\Opscode')
430
+ @new_resource.values([{:name=>"Opscode", :type=>:multi_string, :data=>["Seattle", "Washington"]}, {:name=>"AKA", :type=>:string, :data=>"OC"}])
431
+ @new_resource.recursive(false)
432
+ @new_resource.run_action(:delete)
433
+
434
+ @registry.data_exists?(reg_parent + '\Opscode', {:name=>"Color", :type=>:string, :data=>"Orange"}).should == true
435
+ @registry.value_exists?(reg_parent + '\Opscode', {:name=>"AKA", :type=>:string, :data=>"OC"}).should == false
436
+ @registry.value_exists?(reg_parent + '\Opscode', {:name=>"Opscode", :type=>:multi_string, :data=>["Seattle", "Washington"]}).should == false
437
+ end
438
+
439
+ it "it deletes the values with the same name irrespective of it type and data" do
440
+ @new_resource.key(reg_parent + '\Opscode')
441
+ @new_resource.values([{:name=>"Color", :type=>:multi_string, :data=>["Black", "Orange"]}])
442
+ @new_resource.recursive(false)
443
+ @new_resource.run_action(:delete)
444
+
445
+ @registry.value_exists?(reg_parent + '\Opscode', {:name=>"Color", :type=>:string, :data=>"Orange"}).should == false
446
+ end
447
+
448
+ it "prepares the reporting data for action :delete" do
449
+ @new_resource.key(reg_parent + '\ReportKey')
450
+ @new_resource.values([{:name=>"ReportVal4", :type=>:string, :data=>"report4"},{:name=>"ReportVal5", :type=>:string, :data=>"report5"}])
451
+ @new_resource.recursive(true)
452
+ @new_resource.run_action(:delete)
453
+
454
+ @report = @resource_reporter.prepare_run_data
455
+
456
+ @registry.value_exists?(reg_parent + '\ReportKey', [{:name=>"ReportVal4", :type=>:string, :data=>"report4"},{:name=>"ReportVal5", :type=>:string, :data=>"report5"}]).should == false
457
+
458
+ @report["action"].should == "end"
459
+ @report["resources"].count.should == 1
460
+ @report["resources"][0]["type"].should == "registry_key"
461
+ @report["resources"][0]["name"].should == resource_name
462
+ @report["resources"][0]["id"].should == reg_parent + '\ReportKey'
463
+ @report["resources"][0]["before"][:values].should == [{:name=>"ReportVal4", :type=>:string, :data=>"report4"},
464
+ {:name=>"ReportVal5", :type=>:string, :data=>"report5"}]
465
+ #Not testing for after values to match since after -> new_resource values.
466
+ @report["resources"][0]["result"].should == "delete"
467
+ @report["status"].should == "success"
468
+ @report["total_res_count"].should == "1"
469
+ end
470
+
471
+ context "while running in whyrun mode" do
472
+ before (:all) do
473
+ Chef::Config[:why_run] = true
474
+ end
475
+ after (:all) do
476
+ Chef::Config[:why_run] = @current_whyrun
477
+ end
478
+ it "does nothing if the action is delete" do
479
+ @new_resource.key(reg_parent + '\OpscodeWhyRun')
480
+ @new_resource.values([{:name=>"BriskWalk",:type=>:string,:data=>"is good for health"}])
481
+ @new_resource.recursive(false)
482
+ @new_resource.run_action(:delete)
483
+
484
+ @registry.key_exists?(reg_parent + '\OpscodeWhyRun').should == true
485
+ end
486
+ end
487
+ end
488
+
489
+ context "when the action is delete_key" do
490
+ before (:all) do
491
+ reset_registry
492
+ create_deletable_keys
493
+ end
494
+
495
+ it "takes no action if the specified key path does not exist in the system" do
496
+ @registry.key_exists?(reg_parent + '\Osirian').should == false
497
+
498
+ @new_resource.key(reg_parent + '\Osirian')
499
+ @new_resource.recursive(false)
500
+ @new_resource.run_action(:delete_key)
501
+
502
+ @registry.key_exists?(reg_parent + '\Osirian').should == false
503
+ end
504
+
505
+ it "deletes key if it has no subkeys and recursive == false" do
506
+ @new_resource.key(reg_parent + '\OpscodeTest')
507
+ @new_resource.recursive(false)
508
+ @new_resource.run_action(:delete_key)
509
+
510
+ @registry.key_exists?(reg_parent + '\OpscodeTest').should == false
511
+ end
512
+
513
+ it "raises an exception if the the key has subkeys and recursive == false" do
514
+ @new_resource.key(reg_parent)
515
+ @new_resource.recursive(false)
516
+ lambda{@new_resource.run_action(:delete_key)}.should raise_error(Chef::Exceptions::Win32RegNoRecursive)
517
+ end
518
+
519
+ it "ignores the values under a key" do
520
+ @new_resource.key(reg_parent + '\OpscodeIgnoredValues')
521
+ #@new_resource.values([{:name=>"DontExist", :type=>:string, :data=>"These will be ignored anyways"}])
522
+ @new_resource.recursive(true)
523
+ @new_resource.run_action(:delete_key)
524
+ end
525
+
526
+ it "deletes the key if it has subkeys and recursive == true" do
527
+ @new_resource.key(reg_parent + '\Opscode')
528
+ @new_resource.recursive(true)
529
+ @new_resource.run_action(:delete_key)
530
+
531
+ @registry.key_exists?(reg_parent + '\Opscode').should == false
532
+ end
533
+
534
+ it "prepares the reporting data for action :delete_key" do
535
+ @new_resource.key(reg_parent + '\ReportKey')
536
+ @new_resource.recursive(true)
537
+ @new_resource.run_action(:delete_key)
538
+
539
+ @report = @resource_reporter.prepare_run_data
540
+ @report["action"].should == "end"
541
+ @report["resources"][0]["type"].should == "registry_key"
542
+ @report["resources"][0]["name"].should == resource_name
543
+ @report["resources"][0]["id"].should == reg_parent + '\ReportKey'
544
+ #Not testing for before or after values to match since
545
+ #after -> new_resource.values and
546
+ #before -> current_resource.values
547
+ @report["resources"][0]["result"].should == "delete_key"
548
+ @report["status"].should == "success"
549
+ @report["total_res_count"].should == "1"
550
+ end
551
+ context "while running in whyrun mode" do
552
+ before (:all) do
553
+ Chef::Config[:why_run] = true
554
+ end
555
+ after (:all) do
556
+ Chef::Config[:why_run] = @current_whyrun
557
+ end
558
+
559
+ it "does not throw an exception if the key has subkeys but recursive is set to false" do
560
+ @new_resource.key(reg_parent + '\OpscodeWhyRun')
561
+ @new_resource.values([{:name=>"BriskWalk",:type=>:string,:data=>"is good for health"}])
562
+ @new_resource.recursive(false)
563
+ @new_resource.run_action(:delete_key)
564
+ @new_resource.should_not raise_error(ArgumentError)
565
+ end
566
+ it "does nothing if the action is delete_key" do
567
+ @new_resource.key(reg_parent + '\OpscodeWhyRun')
568
+ @new_resource.values([{:name=>"BriskWalk",:type=>:string,:data=>"is good for health"}])
569
+ @new_resource.recursive(false)
570
+ @new_resource.run_action(:delete_key)
571
+
572
+ @registry.key_exists?(reg_parent + '\OpscodeWhyRun').should == true
573
+ end
574
+ end
575
+ end
576
+ end