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
@@ -24,162 +24,186 @@
24
24
  require 'etc'
25
25
 
26
26
  shared_context "setup correct permissions" do
27
- context "on unix", :unix_only do
28
- context "with root", :requires_root do
29
- before :each do
30
- File.chown(Etc.getpwnam('nobody').uid, 1337, path)
31
- File.chmod(0776, path)
32
- now = Time.now.to_i
33
- File.utime(now - 9000, now - 9000, path)
34
- end
35
- end
36
27
 
37
- context "without root", :requires_unprivileged_user do
38
- before :each do
39
- File.chmod(0776, path)
40
- now = Time.now.to_i
41
- File.utime(now - 9000, now - 9000, path)
42
- end
43
- end
28
+ # I could not get this to work with :requires_unprivileged_user for whatever
29
+ # reason. The setup when running as root is the same as non-root, except we
30
+ # also do a chown, so this sets up correct context for either case.
31
+ before :each, :unix_only do
32
+ File.chmod(0776, path)
33
+ now = Time.now.to_i
34
+ File.utime(now - 9000, now - 9000, path)
35
+ end
36
+
37
+ # Root only context.
38
+ before :each, :unix_only, :requires_root do
39
+ File.chown(Etc.getpwnam('nobody').uid, 1337, path)
44
40
  end
45
41
 
46
42
  # FIXME: windows
47
43
  end
48
44
 
49
45
  shared_context "setup broken permissions" do
50
- context "on unix", :unix_only do
51
- context "with root", :requires_root do
52
- before :each do
53
- File.chown(0, 0, path)
54
- File.chmod(0644, path)
55
- end
56
- end
57
-
58
- context "without root", :requires_unprivileged_user do
59
- before :each do
60
- File.chmod(0644, path)
61
- end
62
- end
46
+
47
+ before :each, :unix_only do
48
+ File.chmod(0644, path)
49
+ end
50
+
51
+ before :each, :unix_only, :requires_root do
52
+ File.chown(0, 0, path)
63
53
  end
64
54
 
65
55
  # FIXME: windows
66
56
  end
67
57
 
68
- shared_context "use Windows permissions", :windows_only do
58
+ shared_examples_for "a securable resource" do
59
+ context "on Unix", :unix_only do
60
+ let(:expected_user_name) { 'nobody' }
61
+ let(:expected_uid) { Etc.getpwnam(expected_user_name).uid }
62
+ let(:desired_gid) { 1337 }
63
+ let(:expected_gid) { 1337 }
69
64
 
70
- if windows?
71
- SID ||= Chef::ReservedNames::Win32::Security::SID
72
- ACE ||= Chef::ReservedNames::Win32::Security::ACE
73
- end
65
+ pending "should set an owner (Rerun specs under root)", :requires_unprivileged_user => true
66
+ pending "should set a group (Rerun specs under root)", :requires_unprivileged_user => true
74
67
 
75
- def get_security_descriptor(path)
76
- Chef::ReservedNames::Win32::Security.get_named_security_info(path)
77
- end
68
+ describe "when setting the owner", :requires_root do
69
+ before do
70
+ resource.owner expected_user_name
71
+ resource.run_action(:create)
72
+ end
78
73
 
79
- def explicit_aces
80
- descriptor.dacl.select { |ace| ace.explicit? }
81
- end
74
+ it "should set an owner" do
75
+ File.lstat(path).uid.should == expected_uid
76
+ end
77
+
78
+ it "is marked as updated only if changes are made" do
79
+ resource.updated_by_last_action?.should == expect_updated?
80
+ end
82
81
 
83
- def extract_ace_properties(aces)
84
- hashes = []
85
- aces.each do |ace|
86
- hashes << { :mask => ace.mask, :type => ace.type, :flags => ace.flags }
87
82
  end
88
- hashes
89
- end
90
83
 
91
- # Standard expected rights
92
- let(:expected_read_perms) do
93
- {
94
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ,
95
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ,
96
- }
97
- end
84
+ describe "when setting the group", :requires_root do
85
+ before do
86
+ resource.group desired_gid
87
+ resource.run_action(:create)
88
+ end
98
89
 
99
- let(:expected_read_execute_perms) do
100
- {
101
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE,
102
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE
103
- }
104
- end
90
+ it "should set a group" do
91
+ File.lstat(path).gid.should == expected_gid
92
+ end
105
93
 
106
- let(:expected_write_perms) do
107
- {
108
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE,
109
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE
110
- }
111
- end
94
+ it "is marked as updated only if changes are made" do
95
+ resource.updated_by_last_action?.should == expect_updated?
96
+ end
112
97
 
113
- let(:expected_modify_perms) do
114
- {
115
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE,
116
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE
117
- }
118
- end
98
+ end
119
99
 
120
- let(:expected_full_control_perms) do
121
- {
122
- :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_ALL,
123
- :specific => Chef::ReservedNames::Win32::API::Security::FILE_ALL_ACCESS
124
- }
125
- end
100
+ describe "when setting the permissions from octal given as a String" do
101
+ before do
102
+ @mode_string = '776'
103
+ resource.mode @mode_string
104
+ resource.run_action(:create)
105
+ end
106
+
107
+ it "should set permissions as specified" do
108
+ pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
109
+ (File.lstat(path).mode & 007777).should == (@mode_string.oct & 007777)
110
+ end
111
+ end
126
112
 
127
- RSpec::Matchers.define :have_expected_properties do |mask, type, flags|
128
- match do |ace|
129
- ace.mask == mask
130
- ace.type == type
131
- ace.flags == flags
113
+ it "is marked as updated only if changes are made" do
114
+ resource.updated_by_last_action?.should == expect_updated?
115
+ end
132
116
  end
133
- end
134
117
 
135
- def descriptor
136
- get_security_descriptor(path)
118
+ describe "when setting permissions from a literal octal Integer" do
119
+ before do
120
+ @mode_integer = 0776
121
+ resource.mode @mode_integer
122
+ resource.run_action(:create)
123
+ end
124
+
125
+ it "should set permissions in numeric form as a ruby-interpreted octal" do
126
+ pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
127
+ (File.lstat(path).mode & 007777).should == (@mode_integer & 007777)
128
+ end
129
+ end
130
+
131
+ it "is marked as updated only if changes are made" do
132
+ resource.updated_by_last_action?.should == expect_updated?
133
+ end
134
+ end
137
135
  end
138
- end
139
136
 
140
- shared_examples_for "a securable resource" do
141
- context "on Unix", :unix_only do
142
- let(:expected_user_name) { 'nobody' }
143
- let(:expected_uid) { Etc.getpwnam(expected_user_name).uid }
144
- let(:desired_gid) { 1337 }
145
- let(:expected_gid) { 1337 }
137
+ context "on Windows", :windows_only do
146
138
 
147
- pending "should set an owner (Rerun specs under root)", :requires_unprivileged_user => true
148
- pending "should set a group (Rerun specs under root)", :requires_unprivileged_user => true
139
+ if windows?
140
+ SID = Chef::ReservedNames::Win32::Security::SID
141
+ ACE = Chef::ReservedNames::Win32::Security::ACE
142
+ end
149
143
 
150
- it "should set an owner", :requires_root do
151
- resource.owner expected_user_name
152
- resource.run_action(:create)
153
- File.lstat(path).uid.should == expected_uid
144
+ def get_security_descriptor(path)
145
+ Chef::ReservedNames::Win32::Security.get_named_security_info(path)
154
146
  end
155
147
 
156
- it "should set a group", :requires_root do
157
- resource.group desired_gid
158
- resource.run_action(:create)
159
- File.lstat(path).gid.should == expected_gid
148
+ def explicit_aces
149
+ descriptor.dacl.select { |ace| ace.explicit? }
160
150
  end
161
151
 
162
- it "should set permissions in string form as an octal number" do
163
- mode_string = '776'
164
- resource.mode mode_string
165
- resource.run_action(:create)
166
- pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
167
- (File.lstat(path).mode & 007777).should == (mode_string.oct & 007777)
168
- end
152
+ def extract_ace_properties(aces)
153
+ hashes = []
154
+ aces.each do |ace|
155
+ hashes << { :mask => ace.mask, :type => ace.type, :flags => ace.flags }
156
+ end
157
+ hashes
169
158
  end
170
159
 
171
- it "should set permissions in numeric form as a ruby-interpreted octal" do
172
- mode_integer = 0776
173
- resource.mode mode_integer
174
- resource.run_action(:create)
175
- pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
176
- (File.lstat(path).mode & 007777).should == (mode_integer & 007777)
160
+ # Standard expected rights
161
+ let(:expected_read_perms) do
162
+ {
163
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ,
164
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ,
165
+ }
166
+ end
167
+
168
+ let(:expected_read_execute_perms) do
169
+ {
170
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE,
171
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE
172
+ }
173
+ end
174
+
175
+ let(:expected_write_perms) do
176
+ {
177
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE,
178
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE
179
+ }
180
+ end
181
+
182
+ let(:expected_modify_perms) do
183
+ {
184
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE,
185
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE
186
+ }
187
+ end
188
+
189
+ let(:expected_full_control_perms) do
190
+ {
191
+ :generic => Chef::ReservedNames::Win32::API::Security::GENERIC_ALL,
192
+ :specific => Chef::ReservedNames::Win32::API::Security::FILE_ALL_ACCESS
193
+ }
194
+ end
195
+
196
+ RSpec::Matchers.define :have_expected_properties do |mask, type, flags|
197
+ match do |ace|
198
+ ace.mask == mask
199
+ ace.type == type
200
+ ace.flags == flags
177
201
  end
178
202
  end
179
- end
180
203
 
181
- context "on Windows", :windows_only do
182
- include_context "use Windows permissions"
204
+ def descriptor
205
+ get_security_descriptor(path)
206
+ end
183
207
 
184
208
  before(:each) do
185
209
  resource.run_action(:delete)
@@ -329,7 +353,7 @@ shared_examples_for "a securable resource" do
329
353
 
330
354
  context "with a mode attribute" do
331
355
  if windows?
332
- Security ||= Chef::ReservedNames::Win32::API::Security
356
+ Security = Chef::ReservedNames::Win32::API::Security
333
357
  end
334
358
 
335
359
  it "respects mode in string form as an octal number" do
@@ -0,0 +1,375 @@
1
+
2
+ shared_examples_for "a securable resource with reporting" do
3
+
4
+ let(:current_resource) do
5
+ provider = resource.provider_for_action(resource.action)
6
+ provider.load_current_resource
7
+ provider.current_resource
8
+ end
9
+
10
+ # Default mode varies based on implementation. Providers that use a tempfile
11
+ # will default to 0600. Providers that use File.open will default to 0666 -
12
+ # umask
13
+ # let(:default_mode) { ((0100666 - File.umask) & 07777).to_s(8) }
14
+
15
+ describe "reading file security metadata for reporting on unix", :unix_only => true do
16
+ context "when the target file doesn't exist" do
17
+ before do
18
+ resource.action(:create)
19
+ end
20
+
21
+ it "has empty values for file metadata in 'current_resource'" do
22
+ current_resource.owner.should be_nil
23
+ current_resource.group.should be_nil
24
+ current_resource.mode.should be_nil
25
+ end
26
+
27
+ context "and no security metadata is specified in new_resource" do
28
+ it "sets the metadata values on the new_resource as strings after creating" do
29
+ resource.run_action(:create)
30
+ # TODO: most stable way to specify?
31
+ resource.owner.should == Etc.getpwuid(Process.uid).name
32
+ resource.group.should == Etc.getgrgid(Process.gid).name
33
+ resource.mode.should == "0#{default_mode}"
34
+ end
35
+ end
36
+
37
+ context "and owner is specified with a String (username) in new_resource", :requires_root => true do
38
+
39
+ # TODO/bug: duplicated from the "securable resource" tests
40
+ let(:expected_user_name) { 'nobody' }
41
+
42
+ before do
43
+ resource.owner(expected_user_name)
44
+ resource.run_action(:create)
45
+ end
46
+
47
+ it "sets the owner on new_resource to the username (String) of the desired owner" do
48
+ resource.owner.should == expected_user_name
49
+ end
50
+
51
+ end
52
+
53
+ context "and owner is specified with an Integer (uid) in new_resource", :requires_root => true do
54
+
55
+ # TODO: duplicated from "securable resource"
56
+ let(:expected_user_name) { 'nobody' }
57
+ let(:expected_uid) { Etc.getpwnam(expected_user_name).uid }
58
+ let(:desired_gid) { 1337 }
59
+ let(:expected_gid) { 1337 }
60
+
61
+ before do
62
+ resource.owner(expected_uid)
63
+ resource.run_action(:create)
64
+ end
65
+
66
+ it "sets the owner on new_resource to the uid (Integer) of the desired owner" do
67
+ resource.owner.should == expected_uid
68
+ end
69
+ end
70
+
71
+ context "and group is specified with a String (group name)", :requires_root => true do
72
+
73
+ let(:expected_group_name) { Etc.getgrent.name }
74
+
75
+ before do
76
+ resource.group(expected_group_name)
77
+ resource.run_action(:create)
78
+ end
79
+
80
+ it "sets the group on new_resource to the group name (String) of the group" do
81
+ resource.group.should == expected_group_name
82
+ end
83
+
84
+ end
85
+
86
+ context "and group is specified with an Integer (gid)", :requires_root => true do
87
+ let(:expected_gid) { Etc.getgrent.gid }
88
+
89
+ before do
90
+ resource.group(expected_gid)
91
+ resource.run_action(:create)
92
+ end
93
+
94
+ it "sets the group on new_resource to the gid (Integer)" do
95
+ resource.group.should == expected_gid
96
+ end
97
+
98
+ end
99
+
100
+ context "and mode is specified as a String" do
101
+ # Need full permission for owner here or else remote directory gets
102
+ # into trouble trying to manage nested directories
103
+ let(:set_mode) { "0740" }
104
+ let(:expected_mode) { "0740" }
105
+
106
+ before do
107
+ resource.mode(set_mode)
108
+ resource.run_action(:create)
109
+ end
110
+
111
+ it "sets mode on the new_resource as a String" do
112
+ resource.mode.should == expected_mode
113
+ end
114
+ end
115
+
116
+ context "and mode is specified as an Integer" do
117
+ let(:set_mode) { 00740 }
118
+
119
+ let(:expected_mode) { "0740" }
120
+ before do
121
+ resource.mode(set_mode)
122
+ resource.run_action(:create)
123
+ end
124
+
125
+ it "sets mode on the new resource as a String" do
126
+ resource.mode.should == expected_mode
127
+ end
128
+ end
129
+ end
130
+
131
+ context "when the target file exists" do
132
+ before do
133
+ FileUtils.touch(resource.path)
134
+ resource.action(:create)
135
+ end
136
+
137
+ context "and no security metadata is specified in new_resource" do
138
+ it "sets the current values on current resource as strings" do
139
+ # TODO: most stable way to specify?
140
+ current_resource.owner.should == Etc.getpwuid(Process.uid).name
141
+ current_resource.group.should == Etc.getgrgid(Process.gid).name
142
+ current_resource.mode.should == "0#{((0100666 - File.umask) & 07777).to_s(8)}"
143
+ end
144
+ end
145
+
146
+ context "and owner is specified with a String (username) in new_resource" do
147
+
148
+ let(:expected_user_name) { Etc.getpwuid(Process.uid).name }
149
+
150
+ before do
151
+ resource.owner(expected_user_name)
152
+ end
153
+
154
+ it "sets the owner on new_resource to the username (String) of the desired owner" do
155
+ current_resource.owner.should == expected_user_name
156
+ end
157
+
158
+ end
159
+
160
+ context "and owner is specified with an Integer (uid) in new_resource" do
161
+
162
+ let(:expected_uid) { Process.uid }
163
+
164
+ before do
165
+ resource.owner(expected_uid)
166
+ end
167
+
168
+ it "sets the owner on new_resource to the uid (Integer) of the desired owner" do
169
+ current_resource.owner.should == expected_uid
170
+ end
171
+ end
172
+
173
+ context "and group is specified with a String (group name)" do
174
+
175
+ let(:expected_group_name) { Etc.getgrgid(Process.gid).name }
176
+
177
+ before do
178
+ resource.group(expected_group_name)
179
+ end
180
+
181
+ it "sets the group on new_resource to the group name (String) of the group" do
182
+ current_resource.group.should == expected_group_name
183
+ end
184
+
185
+ end
186
+
187
+ context "and group is specified with an Integer (gid)" do
188
+ let(:expected_gid) { Process.gid }
189
+
190
+ before do
191
+ resource.group(expected_gid)
192
+ end
193
+
194
+ it "sets the group on new_resource to the gid (Integer)" do
195
+ current_resource.group.should == expected_gid
196
+ end
197
+
198
+ end
199
+
200
+ context "and mode is specified as a String" do
201
+ let(:default_create_mode) { (0100666 - File.umask) }
202
+ let(:expected_mode) { "0#{(default_create_mode & 07777).to_s(8)}" }
203
+
204
+ before do
205
+ resource.mode(expected_mode)
206
+ end
207
+
208
+ it "sets mode on the new_resource as a String" do
209
+ current_resource.mode.should == expected_mode
210
+ end
211
+ end
212
+
213
+ context "and mode is specified as an Integer" do
214
+ let(:set_mode) { (0100666 - File.umask) & 07777 }
215
+ let(:expected_mode) { "0#{set_mode.to_s(8)}" }
216
+
217
+ before do
218
+ resource.mode(set_mode)
219
+ end
220
+
221
+ it "sets mode on the new resource as a String" do
222
+ current_resource.mode.should == expected_mode
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ describe "reading file security metadata for reporting on windows", :windows_only do
229
+
230
+ before do
231
+ pending "windows reporting not yet fully supported"
232
+ end
233
+
234
+ ALL_EXPANDED_PERMISSIONS = ["generic read",
235
+ "generic write",
236
+ "generic execute",
237
+ "generic all",
238
+ "delete",
239
+ "read permissions",
240
+ "change permissions",
241
+ "take ownership",
242
+ "synchronize",
243
+ "access system security",
244
+ "read data / list directory",
245
+ "write data / add file",
246
+ "append data / add subdirectory",
247
+ "read extended attributes",
248
+ "write extended attributes",
249
+ "execute / traverse",
250
+ "delete child",
251
+ "read attributes",
252
+ "write attributes"]
253
+
254
+
255
+ context "when the target file doesn't exist" do
256
+
257
+ # Windows reporting data should look like this (+/- ish):
258
+ # { "owner" => "bob", "checksum" => "ffff", "access control" => { "bob" => { "permissions" => ["perm1", "perm2", ...], "flags" => [] }}}
259
+
260
+
261
+ before do
262
+ resource.action(:create)
263
+ end
264
+
265
+ it "has empty values for file metadata in 'current_resource'" do
266
+ current_resource.owner.should be_nil
267
+ current_resource.expanded_rights.should be_nil
268
+ end
269
+
270
+ context "and no security metadata is specified in new_resource" do
271
+ it "sets the metadata values on the new_resource as strings after creating" do
272
+ resource.run_action(:create)
273
+ # TODO: most stable way to specify?
274
+ resource.owner.should == etc.getpwuid(process.uid).name
275
+ resource.state[:expanded_rights].should == { "CURRENTUSER" => { "permissions" => ALL_EXPANDED_PERMISSIONS, "flags" => [] }}
276
+ resource.state[:expanded_deny_rights].should == {}
277
+ resource.state[:inherits].should be_true
278
+ end
279
+ end
280
+
281
+
282
+ context "and owner is specified with a string (username) in new_resource" do
283
+
284
+ # TODO/bug: duplicated from the "securable resource" tests
285
+ let(:expected_user_name) { 'Guest' }
286
+
287
+ before do
288
+ resource.owner(expected_user_name)
289
+ resource.run_action(:create)
290
+ end
291
+
292
+ it "sets the owner on new_resource to the username (string) of the desired owner" do
293
+ resource.owner.should == expected_user_name
294
+ end
295
+
296
+ end
297
+
298
+ context "and owner is specified with a fully qualified domain user" do
299
+
300
+ # TODO: duplicated from "securable resource"
301
+ let(:expected_user_name) { 'domain\user' }
302
+
303
+ before do
304
+ resource.owner(expected_user_name)
305
+ resource.run_action(:create)
306
+ end
307
+
308
+ it "sets the owner on new_resource to the fully qualified name of the desired owner" do
309
+ resource.owner.should == expected_user_name
310
+ end
311
+ end
312
+
313
+ end
314
+
315
+ context "when the target file exists" do
316
+ before do
317
+ FileUtils.touch(resource.path)
318
+ resource.action(:create)
319
+ end
320
+
321
+ context "and no security metadata is specified in new_resource" do
322
+ it "sets the current values on current resource as strings" do
323
+ # TODO: most stable way to specify?
324
+ current_resource.owner.should == etc.getpwuid(process.uid).name
325
+ current_resource.expanded_rights.should == { "CURRENTUSER" => ALL_EXPANDED_PERMISSIONS }
326
+ end
327
+ end
328
+
329
+ context "and owner is specified with a string (username) in new_resource" do
330
+
331
+ let(:expected_user_name) { etc.getpwuid(process.uid).name }
332
+
333
+ before do
334
+ resource.owner(expected_user_name)
335
+ end
336
+
337
+ it "sets the owner on current_resource to the username (string) of the desired owner" do
338
+ current_resource.owner.should == expected_user_name
339
+ end
340
+
341
+ end
342
+
343
+ context "and owner is specified as a fully qualified 'domain\\user' in new_resource" do
344
+
345
+ let(:expected_user_name) { 'domain\user' }
346
+
347
+ before do
348
+ resource.owner(expected_user_name)
349
+ end
350
+
351
+ it "sets the owner on current_resource to the fully qualified name of the desired owner" do
352
+ current_resource.owner.should == expected_uid
353
+ end
354
+ end
355
+
356
+ context "and access rights are specified on the new_resource" do
357
+ # TODO: before do blah
358
+
359
+ it "sets the expanded_rights on the current resource" do
360
+ pending
361
+ end
362
+ end
363
+
364
+ context "and no access rights are specified on the current resource" do
365
+ # TODO: before do blah
366
+
367
+ it "sets the expanded rights on the current resource" do
368
+ pending
369
+ end
370
+ end
371
+
372
+
373
+ end
374
+ end
375
+ end