chef 10.34.6-x86-mingw32 → 11.6.2-x86-mingw32

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 (777) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTING.md +155 -0
  3. data/README.md +89 -0
  4. data/Rakefile +18 -1
  5. data/bin/chef-apply +25 -0
  6. data/bin/chef-service-manager +37 -0
  7. data/bin/chef-shell +34 -0
  8. data/bin/shef +6 -5
  9. data/distro/common/html/chef-client.8.html +4 -4
  10. data/distro/common/html/chef-expander.8.html +4 -4
  11. data/distro/common/html/chef-expanderctl.8.html +4 -4
  12. data/distro/common/html/chef-server-webui.8.html +4 -4
  13. data/distro/common/html/chef-server.8.html +4 -4
  14. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  15. data/distro/common/html/chef-solo.8.html +4 -4
  16. data/distro/common/html/chef-solr.8.html +5 -5
  17. data/distro/common/html/knife-bootstrap.1.html +4 -4
  18. data/distro/common/html/knife-client.1.html +4 -4
  19. data/distro/common/html/knife-configure.1.html +4 -4
  20. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  21. data/distro/common/html/knife-cookbook.1.html +4 -4
  22. data/distro/common/html/knife-data-bag.1.html +4 -4
  23. data/distro/common/html/knife-environment.1.html +4 -4
  24. data/distro/common/html/knife-exec.1.html +9 -9
  25. data/distro/common/html/knife-index.1.html +4 -4
  26. data/distro/common/html/knife-node.1.html +4 -4
  27. data/distro/common/html/knife-role.1.html +4 -4
  28. data/distro/common/html/knife-search.1.html +4 -4
  29. data/distro/common/html/knife-ssh.1.html +4 -4
  30. data/distro/common/html/knife-status.1.html +4 -4
  31. data/distro/common/html/knife-tag.1.html +4 -4
  32. data/distro/common/html/knife.1.html +8 -13
  33. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  34. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  35. data/distro/common/man/man1/knife-client.1 +0 -99
  36. data/distro/common/man/man1/knife-configure.1 +1 -1
  37. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  38. data/distro/common/man/man1/knife-cookbook.1 +1 -1
  39. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  40. data/distro/common/man/man1/knife-environment.1 +0 -168
  41. data/distro/common/man/man1/knife-exec.1 +4 -7
  42. data/distro/common/man/man1/knife-index.1 +1 -1
  43. data/distro/common/man/man1/knife-node.1 +1 -1
  44. data/distro/common/man/man1/knife-role.1 +1 -1
  45. data/distro/common/man/man1/knife-search.1 +1 -1
  46. data/distro/common/man/man1/knife-ssh.1 +1 -1
  47. data/distro/common/man/man1/knife-status.1 +1 -1
  48. data/distro/common/man/man1/knife-tag.1 +1 -1
  49. data/distro/common/man/man1/knife.1 +3 -6
  50. data/distro/common/man/man8/chef-client.8 +1 -1
  51. data/distro/common/man/man8/chef-expander.8 +1 -1
  52. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  53. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  54. data/distro/common/man/man8/chef-server.8 +1 -1
  55. data/distro/common/man/man8/chef-solo.8 +1 -1
  56. data/distro/common/man/man8/chef-solr.8 +1 -1
  57. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  58. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  59. data/distro/common/markdown/man1/knife.mkd +4 -9
  60. data/distro/debian/etc/default/chef-client +0 -1
  61. data/distro/debian/etc/init.d/chef-client +6 -4
  62. data/distro/windows/service_manager.rb +2 -146
  63. data/lib/chef.rb +3 -6
  64. data/lib/chef/api_client.rb +20 -130
  65. data/lib/chef/api_client/registration.rb +126 -0
  66. data/lib/chef/application.rb +68 -18
  67. data/lib/chef/application/apply.rb +162 -0
  68. data/lib/chef/application/client.rb +37 -22
  69. data/lib/chef/application/knife.rb +2 -4
  70. data/lib/chef/application/solo.rb +27 -13
  71. data/lib/chef/application/windows_service.rb +114 -54
  72. data/lib/chef/application/windows_service_manager.rb +179 -0
  73. data/lib/chef/applications.rb +1 -0
  74. data/lib/chef/chef_fs.rb +9 -0
  75. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  76. data/lib/chef/chef_fs/command_line.rb +284 -0
  77. data/lib/chef/chef_fs/config.rb +205 -0
  78. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  79. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  80. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  81. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  82. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  83. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  84. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  85. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  86. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  87. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  88. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  89. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  90. data/lib/chef/chef_fs/file_system.rb +426 -0
  91. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  92. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  93. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  94. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  95. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  96. data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
  97. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  98. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  99. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  100. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  101. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +60 -0
  102. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
  103. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
  104. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
  105. data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
  106. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  107. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  108. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  109. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
  110. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
  111. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
  112. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  113. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  114. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  115. data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
  116. data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
  117. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  118. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  119. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  120. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  121. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  122. data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
  123. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
  124. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  125. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  126. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  127. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +113 -0
  128. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
  129. data/lib/chef/chef_fs/knife.rb +116 -0
  130. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  131. data/lib/chef/chef_fs/path_utils.rb +90 -0
  132. data/lib/chef/chef_fs/raw_request.rb +79 -0
  133. data/lib/chef/client.rb +111 -34
  134. data/lib/chef/config.rb +111 -102
  135. data/lib/chef/cookbook/chefignore.rb +2 -1
  136. data/lib/chef/cookbook/metadata.rb +0 -2
  137. data/lib/chef/cookbook/syntax_check.rb +76 -14
  138. data/lib/chef/cookbook_loader.rb +39 -26
  139. data/lib/chef/cookbook_uploader.rb +16 -9
  140. data/lib/chef/cookbook_version.rb +2 -410
  141. data/lib/chef/daemon.rb +24 -19
  142. data/lib/chef/data_bag.rb +20 -104
  143. data/lib/chef/data_bag_item.rb +2 -65
  144. data/lib/chef/deprecation/mixin/template.rb +49 -0
  145. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  146. data/lib/chef/deprecation/provider/file.rb +197 -0
  147. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  148. data/lib/chef/deprecation/provider/template.rb +63 -0
  149. data/lib/chef/deprecation/warnings.rb +38 -0
  150. data/lib/chef/digester.rb +73 -0
  151. data/lib/chef/dsl.rb +6 -0
  152. data/lib/chef/dsl/data_query.rb +71 -0
  153. data/lib/chef/dsl/include_attribute.rb +63 -0
  154. data/lib/chef/dsl/include_recipe.rb +45 -0
  155. data/lib/chef/dsl/platform_introspection.rb +218 -0
  156. data/lib/chef/dsl/recipe.rb +87 -0
  157. data/lib/chef/dsl/registry_helper.rb +59 -0
  158. data/lib/chef/encrypted_data_bag_item.rb +171 -24
  159. data/lib/chef/environment.rb +39 -179
  160. data/lib/chef/event_dispatch/base.rb +3 -0
  161. data/lib/chef/exceptions.rb +107 -8
  162. data/lib/chef/file_access_control/unix.rb +64 -7
  163. data/lib/chef/file_access_control/windows.rb +22 -11
  164. data/lib/chef/file_content_management/content_base.rb +56 -0
  165. data/lib/chef/file_content_management/deploy.rb +38 -0
  166. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  167. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  168. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  169. data/lib/chef/file_content_management/tempfile.rb +61 -0
  170. data/lib/chef/formatters/base.rb +4 -1
  171. data/lib/chef/formatters/doc.rb +1 -1
  172. data/lib/chef/formatters/error_descriptor.rb +5 -4
  173. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  174. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +8 -0
  175. data/lib/chef/json_compat.rb +15 -14
  176. data/lib/chef/knife.rb +99 -41
  177. data/lib/chef/knife/bootstrap.rb +46 -2
  178. data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
  179. data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
  180. data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
  181. data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
  182. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
  183. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
  184. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
  185. data/lib/chef/knife/client_show.rb +2 -5
  186. data/lib/chef/knife/configure.rb +19 -17
  187. data/lib/chef/knife/cookbook_create.rb +6 -5
  188. data/lib/chef/knife/cookbook_download.rb +13 -5
  189. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  190. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  191. data/lib/chef/knife/cookbook_test.rb +4 -2
  192. data/lib/chef/knife/cookbook_upload.rb +4 -4
  193. data/lib/chef/knife/core/bootstrap_context.rb +11 -5
  194. data/lib/chef/knife/core/generic_presenter.rb +42 -13
  195. data/lib/chef/knife/core/node_editor.rb +36 -16
  196. data/lib/chef/knife/core/node_presenter.rb +1 -1
  197. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  198. data/lib/chef/knife/core/text_formatter.rb +23 -37
  199. data/lib/chef/knife/core/ui.rb +34 -13
  200. data/lib/chef/knife/delete.rb +106 -0
  201. data/lib/chef/knife/deps.rb +139 -0
  202. data/lib/chef/knife/diff.rb +63 -0
  203. data/lib/chef/knife/download.rb +63 -0
  204. data/lib/chef/knife/edit.rb +76 -0
  205. data/lib/chef/knife/environment_show.rb +2 -0
  206. data/lib/chef/knife/exec.rb +5 -5
  207. data/lib/chef/knife/help_topics.rb +1 -1
  208. data/lib/chef/knife/index_rebuild.rb +91 -7
  209. data/lib/chef/knife/list.rb +153 -0
  210. data/lib/chef/knife/node_run_list_set.rb +66 -0
  211. data/lib/chef/knife/node_show.rb +1 -7
  212. data/lib/chef/knife/raw.rb +64 -0
  213. data/lib/chef/knife/role_show.rb +2 -4
  214. data/lib/chef/knife/search.rb +45 -28
  215. data/lib/chef/knife/show.rb +55 -0
  216. data/lib/chef/knife/ssh.rb +14 -2
  217. data/lib/chef/knife/upload.rb +69 -0
  218. data/lib/chef/knife/user_create.rb +93 -0
  219. data/lib/chef/knife/user_delete.rb +46 -0
  220. data/lib/chef/knife/user_edit.rb +53 -0
  221. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
  222. data/lib/chef/knife/user_reregister.rb +59 -0
  223. data/lib/chef/knife/user_show.rb +49 -0
  224. data/lib/chef/knife/xargs.rb +265 -0
  225. data/lib/chef/log.rb +2 -2
  226. data/lib/chef/mixin/checksum.rb +3 -3
  227. data/lib/chef/mixin/deep_merge.rb +78 -194
  228. data/lib/chef/mixin/deprecation.rb +35 -0
  229. data/lib/chef/mixin/file_class.rb +0 -9
  230. data/lib/chef/mixin/language.rb +22 -223
  231. data/lib/chef/mixin/language_include_attribute.rb +10 -36
  232. data/lib/chef/mixin/language_include_recipe.rb +7 -33
  233. data/lib/chef/mixin/params_validate.rb +0 -3
  234. data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
  235. data/lib/chef/mixin/securable.rb +32 -7
  236. data/lib/chef/mixin/template.rb +156 -26
  237. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  238. data/lib/chef/mixins.rb +1 -5
  239. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
  240. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  241. data/lib/chef/monkey_patches/net_http.rb +0 -34
  242. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  243. data/lib/chef/monologger.rb +93 -0
  244. data/lib/chef/node.rb +139 -308
  245. data/lib/chef/node/attribute.rb +367 -473
  246. data/lib/chef/node/attribute_collections.rb +206 -0
  247. data/lib/chef/node/immutable_collections.rb +186 -0
  248. data/lib/chef/platform.rb +4 -496
  249. data/lib/chef/platform/provider_mapping.rb +529 -0
  250. data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
  251. data/lib/chef/provider.rb +14 -58
  252. data/lib/chef/provider/batch.rb +35 -0
  253. data/lib/chef/provider/breakpoint.rb +6 -6
  254. data/lib/chef/provider/cookbook_file.rb +11 -80
  255. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  256. data/lib/chef/provider/deploy.rb +26 -21
  257. data/lib/chef/provider/deploy/revision.rb +27 -0
  258. data/lib/chef/provider/directory.rb +12 -18
  259. data/lib/chef/provider/execute.rb +22 -5
  260. data/lib/chef/provider/file.rb +297 -248
  261. data/lib/chef/provider/file/content.rb +39 -0
  262. data/lib/chef/provider/git.rb +76 -43
  263. data/lib/chef/provider/group.rb +31 -51
  264. data/lib/chef/provider/group/dscl.rb +13 -53
  265. data/lib/chef/provider/group/gpasswd.rb +19 -14
  266. data/lib/chef/provider/group/groupadd.rb +1 -41
  267. data/lib/chef/provider/group/groupmod.rb +36 -46
  268. data/lib/chef/provider/group/pw.rb +16 -59
  269. data/lib/chef/provider/group/suse.rb +13 -16
  270. data/lib/chef/provider/group/usermod.rb +18 -40
  271. data/lib/chef/provider/group/windows.rb +6 -13
  272. data/lib/chef/provider/http_request.rb +25 -42
  273. data/lib/chef/provider/ifconfig.rb +25 -35
  274. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  275. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  276. data/lib/chef/provider/link.rb +12 -3
  277. data/lib/chef/provider/lwrp_base.rb +150 -0
  278. data/lib/chef/provider/mount.rb +1 -1
  279. data/lib/chef/provider/mount/mount.rb +8 -3
  280. data/lib/chef/provider/mount/windows.rb +4 -1
  281. data/lib/chef/provider/package/rpm.rb +2 -2
  282. data/lib/chef/provider/package/rubygems.rb +4 -1
  283. data/lib/chef/provider/package/smartos.rb +47 -36
  284. data/lib/chef/provider/package/zypper.rb +45 -55
  285. data/lib/chef/provider/powershell_script.rb +77 -0
  286. data/lib/chef/provider/registry_key.rb +156 -0
  287. data/lib/chef/provider/remote_directory.rb +6 -5
  288. data/lib/chef/provider/remote_file.rb +13 -100
  289. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  290. data/lib/chef/provider/remote_file/content.rb +75 -0
  291. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  292. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  293. data/lib/chef/provider/remote_file/http.rb +124 -0
  294. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  295. data/lib/chef/provider/route.rb +6 -2
  296. data/lib/chef/provider/ruby_block.rb +5 -2
  297. data/lib/chef/provider/script.rb +14 -2
  298. data/lib/chef/provider/service.rb +15 -0
  299. data/lib/chef/provider/service/init.rb +9 -7
  300. data/lib/chef/provider/service/macosx.rb +29 -81
  301. data/lib/chef/provider/service/simple.rb +1 -1
  302. data/lib/chef/provider/service/solaris.rb +6 -5
  303. data/lib/chef/provider/template.rb +16 -81
  304. data/lib/chef/provider/template/content.rb +61 -0
  305. data/lib/chef/provider/template_finder.rb +61 -0
  306. data/lib/chef/provider/user.rb +0 -1
  307. data/lib/chef/provider/user/dscl.rb +175 -568
  308. data/lib/chef/provider/user/useradd.rb +50 -54
  309. data/lib/chef/provider/windows_script.rb +73 -0
  310. data/lib/chef/providers.rb +18 -1
  311. data/lib/chef/recipe.rb +14 -8
  312. data/lib/chef/resource.rb +52 -146
  313. data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
  314. data/lib/chef/resource/conditional.rb +4 -0
  315. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  316. data/lib/chef/resource/file.rb +31 -3
  317. data/lib/chef/resource/group.rb +1 -11
  318. data/lib/chef/resource/http_request.rb +2 -1
  319. data/lib/chef/resource/link.rb +17 -0
  320. data/lib/chef/resource/lwrp_base.rb +132 -0
  321. data/lib/chef/resource/mount.rb +39 -13
  322. data/lib/chef/resource/powershell_script.rb +31 -0
  323. data/lib/chef/resource/registry_key.rb +86 -0
  324. data/lib/chef/resource/remote_directory.rb +6 -5
  325. data/lib/chef/resource/remote_file.rb +62 -25
  326. data/lib/chef/resource/route.rb +1 -1
  327. data/lib/chef/resource/ruby_block.rb +2 -2
  328. data/lib/chef/resource/service.rb +14 -0
  329. data/lib/chef/resource/template.rb +145 -0
  330. data/lib/chef/resource/user.rb +0 -18
  331. data/lib/chef/resource/windows_script.rb +62 -0
  332. data/lib/chef/resource_collection.rb +69 -31
  333. data/lib/chef/resource_reporter.rb +81 -52
  334. data/lib/chef/resources.rb +4 -1
  335. data/lib/chef/rest.rb +55 -127
  336. data/lib/chef/rest/auth_credentials.rb +4 -20
  337. data/lib/chef/rest/rest_request.rb +7 -8
  338. data/lib/chef/role.rb +1 -97
  339. data/lib/chef/run_context.rb +108 -130
  340. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  341. data/lib/chef/run_list.rb +0 -2
  342. data/lib/chef/run_list/run_list_expansion.rb +1 -16
  343. data/lib/chef/run_lock.rb +96 -0
  344. data/lib/chef/runner.rb +28 -6
  345. data/lib/chef/sandbox.rb +15 -148
  346. data/lib/chef/scan_access_control.rb +8 -5
  347. data/lib/chef/search/query.rb +2 -2
  348. data/lib/chef/shef/ext.rb +3 -575
  349. data/lib/chef/{shef.rb → shell.rb} +35 -40
  350. data/lib/chef/shell/ext.rb +593 -0
  351. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  352. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  353. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +15 -13
  354. data/lib/chef/shell_out.rb +7 -0
  355. data/lib/chef/user.rb +182 -0
  356. data/lib/chef/util/backup.rb +84 -0
  357. data/lib/chef/util/diff.rb +145 -0
  358. data/lib/chef/util/file_edit.rb +1 -1
  359. data/lib/chef/util/selinux.rb +100 -0
  360. data/lib/chef/util/windows/net_group.rb +1 -5
  361. data/lib/chef/util/windows/net_user.rb +14 -1
  362. data/lib/chef/util/windows/volume.rb +2 -2
  363. data/lib/chef/version.rb +1 -1
  364. data/lib/chef/version/platform.rb +42 -0
  365. data/lib/chef/version_class.rb +1 -1
  366. data/lib/chef/version_constraint.rb +6 -5
  367. data/lib/chef/{index_queue.rb → version_constraint/platform.rb} +11 -14
  368. data/lib/chef/win32/api/file.rb +8 -2
  369. data/lib/chef/win32/api/security.rb +45 -1
  370. data/lib/chef/win32/registry.rb +382 -0
  371. data/lib/chef/win32/security.rb +19 -0
  372. data/lib/chef/win32/version.rb +25 -8
  373. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  374. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  375. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  376. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  377. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  378. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  379. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  380. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  381. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  382. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  383. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  384. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  385. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  386. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  387. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  388. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  389. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  390. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  391. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  392. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  393. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  394. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  395. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  396. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  397. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  398. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  399. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  400. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  401. data/spec/data/apt/var/www/apt/db/version +4 -0
  402. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  403. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  404. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  405. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  406. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  407. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  408. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  409. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  410. data/spec/data/bootstrap/secret.erb +9 -0
  411. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  412. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  413. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  414. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  415. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  416. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  417. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  418. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  419. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  420. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  421. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  422. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  423. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  424. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  425. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  426. data/spec/data/nodes/default.rb +3 -3
  427. data/spec/data/nodes/test.example.com.rb +3 -3
  428. data/spec/data/nodes/test.rb +3 -3
  429. data/spec/data/null_config.rb +1 -0
  430. data/spec/data/partial_one.erb +1 -0
  431. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  432. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  433. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  434. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  435. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  436. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  437. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  438. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  439. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  440. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  441. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  442. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  443. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  444. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  445. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  446. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  447. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  448. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  449. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  450. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  451. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  452. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  453. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  454. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  455. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  456. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  457. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  458. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  459. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  460. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  461. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  462. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  463. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  464. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  465. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  466. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  467. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  468. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  469. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  470. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  471. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  472. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  473. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  474. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  475. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  476. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  477. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  478. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  479. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  480. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  481. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  482. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  483. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  484. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  485. data/spec/data/shef-config.rb +10 -0
  486. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  487. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  488. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  489. data/spec/functional/knife/exec_spec.rb +3 -3
  490. data/spec/functional/knife/smoke_test.rb +34 -0
  491. data/spec/functional/knife/ssh_spec.rb +5 -1
  492. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  493. data/spec/functional/resource/batch_spec.rb +64 -0
  494. data/spec/functional/resource/cookbook_file_spec.rb +15 -9
  495. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  496. data/spec/functional/resource/directory_spec.rb +5 -1
  497. data/spec/functional/resource/file_spec.rb +71 -21
  498. data/spec/functional/resource/git_spec.rb +259 -0
  499. data/spec/functional/resource/link_spec.rb +424 -388
  500. data/spec/functional/resource/package_spec.rb +297 -0
  501. data/spec/functional/resource/powershell_spec.rb +188 -0
  502. data/spec/functional/resource/registry_spec.rb +576 -0
  503. data/spec/functional/resource/remote_directory_spec.rb +143 -37
  504. data/spec/functional/resource/remote_file_spec.rb +99 -13
  505. data/spec/functional/resource/template_spec.rb +180 -3
  506. data/spec/functional/resource/user_spec.rb +547 -0
  507. data/spec/functional/run_lock_spec.rb +243 -0
  508. data/spec/functional/shell_spec.rb +102 -0
  509. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  510. data/spec/functional/win32/security_spec.rb +37 -0
  511. data/spec/functional/win32/service_manager_spec.rb +269 -0
  512. data/spec/functional/win32/versions_spec.rb +78 -0
  513. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  514. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  515. data/spec/integration/knife/chefignore_spec.rb +271 -0
  516. data/spec/integration/knife/delete_spec.rb +944 -0
  517. data/spec/integration/knife/deps_spec.rb +648 -0
  518. data/spec/integration/knife/diff_spec.rb +536 -0
  519. data/spec/integration/knife/download_spec.rb +962 -0
  520. data/spec/integration/knife/list_spec.rb +633 -0
  521. data/spec/integration/knife/raw_spec.rb +166 -0
  522. data/spec/integration/knife/redirection_spec.rb +57 -0
  523. data/spec/integration/knife/show_spec.rb +158 -0
  524. data/spec/integration/knife/upload_spec.rb +1060 -0
  525. data/spec/integration/solo/solo_spec.rb +41 -0
  526. data/spec/spec_helper.rb +49 -13
  527. data/spec/stress/win32/security_spec.rb +1 -1
  528. data/spec/support/chef_helpers.rb +33 -3
  529. data/spec/support/lib/chef/resource/cat.rb +3 -5
  530. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  531. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  532. data/spec/support/platform_helpers.rb +46 -13
  533. data/spec/support/platforms/win32/spec_service.rb +59 -0
  534. data/spec/support/shared/functional/diff_disabled.rb +10 -0
  535. data/spec/support/shared/functional/directory_resource.rb +129 -38
  536. data/spec/support/shared/functional/file_resource.rb +837 -71
  537. data/spec/support/shared/functional/securable_resource.rb +189 -58
  538. data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
  539. data/spec/support/shared/integration/integration_helper.rb +166 -0
  540. data/spec/support/shared/integration/knife_support.rb +171 -0
  541. data/spec/support/shared/unit/execute_resource.rb +125 -0
  542. data/spec/support/shared/unit/file_system_support.rb +70 -0
  543. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  544. data/spec/support/shared/unit/provider/file.rb +609 -0
  545. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  546. data/spec/support/shared/unit/script_resource.rb +52 -0
  547. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  548. data/spec/tiny_server.rb +13 -11
  549. data/spec/unit/api_client/registration_spec.rb +172 -0
  550. data/spec/unit/api_client_spec.rb +78 -156
  551. data/spec/unit/application/apply.rb +84 -0
  552. data/spec/unit/application/client_spec.rb +16 -14
  553. data/spec/unit/application/knife_spec.rb +17 -0
  554. data/spec/unit/application/solo_spec.rb +1 -1
  555. data/spec/unit/application_spec.rb +113 -3
  556. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  557. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  558. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  559. data/spec/unit/chef_fs/file_system_spec.rb +135 -0
  560. data/spec/unit/client_spec.rb +195 -23
  561. data/spec/unit/config_spec.rb +102 -51
  562. data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
  563. data/spec/unit/cookbook_loader_spec.rb +154 -91
  564. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  565. data/spec/unit/cookbook_spec.rb +3 -20
  566. data/spec/unit/cookbook_version_spec.rb +23 -122
  567. data/spec/unit/daemon_spec.rb +24 -19
  568. data/spec/unit/data_bag_spec.rb +13 -4
  569. data/spec/unit/deprecation_spec.rb +86 -0
  570. data/spec/unit/digester_spec.rb +50 -0
  571. data/spec/unit/dsl/data_query_spec.rb +66 -0
  572. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  573. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  574. data/spec/unit/encrypted_data_bag_item_spec.rb +197 -157
  575. data/spec/unit/environment_spec.rb +94 -126
  576. data/spec/unit/exceptions_spec.rb +8 -4
  577. data/spec/unit/file_access_control_spec.rb +21 -1
  578. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  579. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  580. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  581. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  582. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +6 -5
  583. data/spec/unit/json_compat_spec.rb +8 -0
  584. data/spec/unit/knife/bootstrap_spec.rb +130 -29
  585. data/spec/unit/knife/configure_spec.rb +64 -45
  586. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  587. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  588. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  589. data/spec/unit/knife/cookbook_upload_spec.rb +39 -0
  590. data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
  591. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  592. data/spec/unit/knife/core/ui_spec.rb +196 -124
  593. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  594. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  595. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  596. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  597. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  598. data/spec/unit/knife/knife_help.rb +7 -7
  599. data/spec/unit/knife/node_edit_spec.rb +6 -33
  600. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  601. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  602. data/spec/unit/knife/ssh_spec.rb +12 -15
  603. data/spec/unit/knife/status_spec.rb +2 -2
  604. data/spec/unit/knife/user_create_spec.rb +86 -0
  605. data/spec/unit/knife/user_delete_spec.rb +39 -0
  606. data/spec/unit/knife/user_edit_spec.rb +42 -0
  607. data/spec/unit/knife/user_list_spec.rb +32 -0
  608. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  609. data/spec/unit/knife/user_show_spec.rb +41 -0
  610. data/spec/unit/knife_spec.rb +74 -0
  611. data/spec/unit/lwrp_spec.rb +102 -60
  612. data/spec/unit/mixin/checksum_spec.rb +2 -2
  613. data/spec/unit/mixin/deep_merge_spec.rb +130 -791
  614. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  615. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
  616. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  617. data/spec/unit/mixin/securable_spec.rb +5 -3
  618. data/spec/unit/mixin/template_spec.rb +145 -14
  619. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  620. data/spec/unit/node/attribute_spec.rb +273 -173
  621. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  622. data/spec/unit/node_spec.rb +418 -370
  623. data/spec/unit/platform_spec.rb +21 -8
  624. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  625. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  626. data/spec/unit/provider/cookbook_file_spec.rb +26 -187
  627. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  628. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  629. data/spec/unit/provider/deploy_spec.rb +2 -2
  630. data/spec/unit/provider/directory_spec.rb +99 -67
  631. data/spec/unit/provider/env_spec.rb +2 -2
  632. data/spec/unit/provider/execute_spec.rb +27 -1
  633. data/spec/unit/provider/file/content_spec.rb +101 -0
  634. data/spec/unit/provider/file_spec.rb +25 -475
  635. data/spec/unit/provider/git_spec.rb +224 -28
  636. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  637. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  638. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  639. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  640. data/spec/unit/provider/group/pw_spec.rb +15 -12
  641. data/spec/unit/provider/group/usermod_spec.rb +9 -22
  642. data/spec/unit/provider/group/windows_spec.rb +8 -0
  643. data/spec/unit/provider/group_spec.rb +6 -28
  644. data/spec/unit/provider/http_request_spec.rb +28 -69
  645. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  646. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  647. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  648. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  649. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  650. data/spec/unit/provider/mount_spec.rb +16 -6
  651. data/spec/unit/provider/ohai_spec.rb +4 -4
  652. data/spec/unit/provider/package/apt_spec.rb +0 -1
  653. data/spec/unit/provider/package/ips_spec.rb +0 -1
  654. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  655. data/spec/unit/provider/package/rubygems_spec.rb +1 -1
  656. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  657. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  658. data/spec/unit/provider/package_spec.rb +7 -9
  659. data/spec/unit/provider/powershell_spec.rb +38 -0
  660. data/spec/unit/provider/registry_key_spec.rb +269 -0
  661. data/spec/unit/provider/remote_directory_spec.rb +7 -7
  662. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  663. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  664. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  665. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  666. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  667. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  668. data/spec/unit/provider/remote_file_spec.rb +33 -259
  669. data/spec/unit/provider/route_spec.rb +29 -12
  670. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  671. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  672. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  673. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  674. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  675. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  676. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  677. data/spec/unit/provider/service/macosx_spec.rb +176 -207
  678. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  679. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  680. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  681. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  682. data/spec/unit/provider/service/upstart_service_spec.rb +11 -11
  683. data/spec/unit/provider/service_spec.rb +3 -3
  684. data/spec/unit/provider/subversion_spec.rb +1 -1
  685. data/spec/unit/provider/template/content_spec.rb +78 -0
  686. data/spec/unit/provider/template_spec.rb +52 -160
  687. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  688. data/spec/unit/provider/user/solaris_spec.rb +39 -373
  689. data/spec/unit/provider/user/useradd_spec.rb +12 -379
  690. data/spec/unit/provider/user_spec.rb +1 -1
  691. data/spec/unit/recipe_spec.rb +10 -8
  692. data/spec/unit/registry_helper_spec.rb +376 -0
  693. data/spec/unit/resource/batch_spec.rb +48 -0
  694. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  695. data/spec/unit/resource/execute_spec.rb +3 -101
  696. data/spec/unit/resource/file_spec.rb +0 -5
  697. data/spec/unit/resource/group_spec.rb +9 -0
  698. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  699. data/spec/unit/resource/link_spec.rb +1 -0
  700. data/spec/unit/resource/mount_spec.rb +37 -11
  701. data/spec/unit/resource/powershell_spec.rb +48 -0
  702. data/spec/unit/resource/registry_key_spec.rb +171 -0
  703. data/spec/unit/resource/remote_file_spec.rb +63 -25
  704. data/spec/unit/resource/route_spec.rb +1 -1
  705. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  706. data/spec/unit/resource/script_spec.rb +13 -36
  707. data/spec/unit/resource/service_spec.rb +11 -0
  708. data/spec/unit/resource/template_spec.rb +111 -8
  709. data/spec/unit/resource/user_spec.rb +7 -0
  710. data/spec/unit/resource_collection_spec.rb +61 -32
  711. data/spec/unit/resource_reporter_spec.rb +115 -102
  712. data/spec/unit/resource_spec.rb +197 -5
  713. data/spec/unit/rest/auth_credentials_spec.rb +4 -21
  714. data/spec/unit/rest_spec.rb +134 -284
  715. data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -0
  716. data/spec/unit/run_context_spec.rb +18 -4
  717. data/spec/unit/run_list_spec.rb +0 -209
  718. data/spec/unit/run_lock_spec.rb +37 -0
  719. data/spec/unit/runner_spec.rb +102 -3
  720. data/spec/unit/scan_access_control_spec.rb +8 -6
  721. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  722. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  723. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +16 -58
  724. data/spec/unit/shell_out_spec.rb +18 -0
  725. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  726. data/spec/unit/user_spec.rb +255 -0
  727. data/spec/unit/util/backup_spec.rb +149 -0
  728. data/spec/unit/util/diff_spec.rb +596 -0
  729. data/spec/unit/util/selinux_spec.rb +172 -0
  730. data/spec/unit/version/platform_spec.rb +61 -0
  731. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  732. data/spec/unit/version_constraint_spec.rb +5 -0
  733. metadata +493 -264
  734. data/README.rdoc +0 -177
  735. data/distro/common/html/knife-recipe.1.html +0 -92
  736. data/lib/chef/certificate.rb +0 -161
  737. data/lib/chef/checksum.rb +0 -167
  738. data/lib/chef/checksum_cache.rb +0 -190
  739. data/lib/chef/cookbook_version_selector.rb +0 -168
  740. data/lib/chef/couchdb.rb +0 -246
  741. data/lib/chef/index_queue/amqp_client.rb +0 -116
  742. data/lib/chef/index_queue/consumer.rb +0 -76
  743. data/lib/chef/index_queue/indexable.rb +0 -109
  744. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  745. data/lib/chef/monkey_patches/dir.rb +0 -36
  746. data/lib/chef/monkey_patches/moneta.rb +0 -50
  747. data/lib/chef/monkey_patches/uri.rb +0 -70
  748. data/lib/chef/openid_registration.rb +0 -187
  749. data/lib/chef/solr_query.rb +0 -187
  750. data/lib/chef/solr_query/lucene.treetop +0 -150
  751. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  752. data/lib/chef/solr_query/query_transform.rb +0 -65
  753. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  754. data/lib/chef/webui_user.rb +0 -231
  755. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  756. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  757. data/spec/data/mac_users/10.7.plist.xml +0 -559
  758. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  759. data/spec/data/mac_users/10.8.plist.xml +0 -559
  760. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  761. data/spec/data/mac_users/10.9.plist.xml +0 -560
  762. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  763. data/spec/functional/resource/base.rb +0 -40
  764. data/spec/functional/resource/group_spec.rb +0 -343
  765. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  766. data/spec/unit/certificate_spec.rb +0 -76
  767. data/spec/unit/checksum_cache_spec.rb +0 -209
  768. data/spec/unit/checksum_spec.rb +0 -94
  769. data/spec/unit/couchdb_spec.rb +0 -274
  770. data/spec/unit/index_queue_spec.rb +0 -391
  771. data/spec/unit/mixin/language_spec.rb +0 -305
  772. data/spec/unit/openid_registration_spec.rb +0 -153
  773. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  774. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  775. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  776. data/spec/unit/solr_query_spec.rb +0 -203
  777. data/spec/unit/webui_user_spec.rb +0 -238
@@ -0,0 +1,70 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/chef_fs/file_system'
20
+ require 'chef/chef_fs/file_system/memory_root'
21
+ require 'chef/chef_fs/file_system/memory_dir'
22
+ require 'chef/chef_fs/file_system/memory_file'
23
+
24
+ module FileSystemSupport
25
+ def memory_fs(pretty_name, value, cannot_be_in_regex = nil)
26
+ if !value.is_a?(Hash)
27
+ raise "memory_fs() must take a Hash"
28
+ end
29
+ dir = Chef::ChefFS::FileSystem::MemoryRoot.new(pretty_name, cannot_be_in_regex)
30
+ value.each do |key, child|
31
+ dir.add_child(memory_fs_value(child, key.to_s, dir))
32
+ end
33
+ dir
34
+ end
35
+
36
+ def memory_fs_value(value, name = '', parent = nil)
37
+ if value.is_a?(Hash)
38
+ dir = Chef::ChefFS::FileSystem::MemoryDir.new(name, parent)
39
+ value.each do |key, child|
40
+ dir.add_child(memory_fs_value(child, key.to_s, dir))
41
+ end
42
+ dir
43
+ else
44
+ Chef::ChefFS::FileSystem::MemoryFile.new(name, parent, value || "#{name}\n")
45
+ end
46
+ end
47
+
48
+ def pattern(p)
49
+ Chef::ChefFS::FilePattern.new(p)
50
+ end
51
+
52
+ def return_paths(*expected)
53
+ ReturnPaths.new(expected)
54
+ end
55
+
56
+ def no_blocking_calls_allowed
57
+ [ Chef::ChefFS::FileSystem::MemoryFile, Chef::ChefFS::FileSystem::MemoryDir ].each do |c|
58
+ [ :children, :exists?, :read ].each do |m|
59
+ c.any_instance.stub(m).and_raise("#{m.to_s} should not be called")
60
+ end
61
+ end
62
+ end
63
+
64
+ def list_should_yield_paths(fs, pattern_str, *expected_paths)
65
+ result_paths = []
66
+ Chef::ChefFS::FileSystem.list(fs, pattern(pattern_str)).each { |result| result_paths << result.path }
67
+ result_paths.should =~ expected_paths
68
+ end
69
+ end
70
+
@@ -0,0 +1,162 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@opscode.com>)
3
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
4
+ # Copyright:: Copyright (c) 2010, 2012 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
+
21
+ shared_examples_for "a platform introspector" do
22
+ before(:each) do
23
+ @platform_hash = {}
24
+ %w{openbsd freebsd}.each do |x|
25
+ @platform_hash[x] = {
26
+ "default" => x,
27
+ "1.2.3" => "#{x}-1.2.3"
28
+ }
29
+ end
30
+ @platform_hash["debian"] = {["5", "6"] => "debian-5/6", "default" => "debian"}
31
+ @platform_hash["default"] = "default"
32
+
33
+ @platform_family_hash = {
34
+ "debian" => "debian value",
35
+ [:rhel, :fedora] => "redhatty value",
36
+ "suse" => "suse value",
37
+ :default => "default value"
38
+ }
39
+ end
40
+
41
+ it "returns a default value when there is no known platform" do
42
+ node = Hash.new
43
+ platform_introspector.value_for_platform(@platform_hash).should == "default"
44
+ end
45
+
46
+ it "returns a default value when there is no known platform family" do
47
+ platform_introspector.value_for_platform_family(@platform_family_hash).should == "default value"
48
+ end
49
+
50
+ it "returns a default value when the current platform doesn't match" do
51
+ node.automatic_attrs[:platform] = "not-a-known-platform"
52
+ platform_introspector.value_for_platform(@platform_hash).should == "default"
53
+ end
54
+
55
+ it "returns a default value when current platform_family doesn't match" do
56
+ node.automatic_attrs[:platform_family] = "ultra-derived-linux"
57
+ platform_introspector.value_for_platform_family(@platform_family_hash).should == "default value"
58
+ end
59
+
60
+ it "returns a value based on the current platform" do
61
+ node.automatic_attrs[:platform] = "openbsd"
62
+ platform_introspector.value_for_platform(@platform_hash).should == "openbsd"
63
+ end
64
+
65
+ it "returns a value based on the current platform family" do
66
+ node.automatic_attrs[:platform_family] = "debian"
67
+ platform_introspector.value_for_platform_family(@platform_family_hash).should == "debian value"
68
+ end
69
+
70
+ it "returns a version-specific value based on the current platform" do
71
+ node.automatic_attrs[:platform] = "openbsd"
72
+ node.automatic_attrs[:platform_version] = "1.2.3"
73
+ platform_introspector.value_for_platform(@platform_hash).should == "openbsd-1.2.3"
74
+ end
75
+
76
+ it "returns a value based on the current platform if version not found" do
77
+ node.automatic_attrs[:platform] = "openbsd"
78
+ node.automatic_attrs[:platform_version] = "0.0.0"
79
+ platform_introspector.value_for_platform(@platform_hash).should == "openbsd"
80
+ end
81
+
82
+ describe "when platform versions is an array" do
83
+ it "returns a version-specific value based on the current platform" do
84
+ node.automatic_attrs[:platform] = "debian"
85
+ node.automatic_attrs[:platform_version] = "6"
86
+ platform_introspector.value_for_platform(@platform_hash).should == "debian-5/6"
87
+ end
88
+
89
+ it "returns a value based on the current platform if version not found" do
90
+ node.automatic_attrs[:platform] = "debian"
91
+ node.automatic_attrs[:platform_version] = "0.0.0"
92
+ platform_introspector.value_for_platform(@platform_hash).should == "debian"
93
+ end
94
+ end
95
+
96
+ describe "when checking platform?" do
97
+
98
+ it "returns true if the node is a provided platform and platforms are provided as symbols" do
99
+ node.automatic_attrs[:platform] = 'ubuntu'
100
+ platform_introspector.platform?([:redhat, :ubuntu]).should == true
101
+ end
102
+
103
+ it "returns true if the node is a provided platform and platforms are provided as strings" do
104
+ node.automatic_attrs[:platform] = 'ubuntu'
105
+ platform_introspector.platform?(["redhat", "ubuntu"]).should == true
106
+ end
107
+
108
+ it "returns false if the node is not of the provided platforms" do
109
+ node.automatic_attrs[:platform] = 'ubuntu'
110
+ platform_introspector.platform?(:splatlinux).should == false
111
+ end
112
+ end
113
+
114
+ describe "when checking platform_family?" do
115
+
116
+ it "returns true if the node is in a provided platform family and families are provided as symbols" do
117
+ node.automatic_attrs[:platform_family] = 'debian'
118
+ platform_introspector.platform_family?([:rhel, :debian]).should == true
119
+ end
120
+
121
+ it "returns true if the node is a provided platform and platforms are provided as strings" do
122
+ node.automatic_attrs[:platform_family] = 'rhel'
123
+ platform_introspector.platform_family?(["rhel", "debian"]).should == true
124
+ end
125
+
126
+ it "returns false if the node is not of the provided platforms" do
127
+ node.automatic_attrs[:platform_family] = 'suse'
128
+ platform_introspector.platform_family?(:splatlinux).should == false
129
+ end
130
+
131
+ it "returns false if the node is not of the provided platforms and platform_family is not set" do
132
+ platform_introspector.platform_family?(:splatlinux).should == false
133
+ end
134
+
135
+ end
136
+ # NOTE: this is a regression test for bug CHEF-1514
137
+ describe "when the value is an array" do
138
+ before do
139
+ @platform_hash = {
140
+ "debian" => { "4.0" => [ :restart, :reload ], "default" => [ :restart, :reload, :status ] },
141
+ "ubuntu" => { "default" => [ :restart, :reload, :status ] },
142
+ "centos" => { "default" => [ :restart, :reload, :status ] },
143
+ "redhat" => { "default" => [ :restart, :reload, :status ] },
144
+ "fedora" => { "default" => [ :restart, :reload, :status ] },
145
+ "default" => { "default" => [:restart, :reload ] }}
146
+ end
147
+
148
+ it "returns the correct default for a given platform" do
149
+ node.automatic_attrs[:platform] = "debian"
150
+ node.automatic_attrs[:platform_version] = '9000'
151
+ platform_introspector.value_for_platform(@platform_hash).should == [ :restart, :reload, :status ]
152
+ end
153
+
154
+ it "returns the correct platform+version specific value " do
155
+ node.automatic_attrs[:platform] = "debian"
156
+ node.automatic_attrs[:platform_version] = '4.0'
157
+ platform_introspector.value_for_platform(@platform_hash).should == [:restart, :reload]
158
+ end
159
+ end
160
+
161
+ end
162
+
@@ -0,0 +1,609 @@
1
+ #
2
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+ require 'tmpdir'
21
+ if windows?
22
+ require 'chef/win32/file'
23
+ end
24
+
25
+ # Filesystem stubs
26
+ def file_symlink_class
27
+ if windows?
28
+ Chef::ReservedNames::Win32::File
29
+ else
30
+ File
31
+ end
32
+ end
33
+
34
+ def normalized_path
35
+ File.expand_path(resource_path)
36
+ end
37
+
38
+ def setup_normal_file
39
+ File.stub!(:exists?).with(resource_path).and_return(true)
40
+ File.stub!(:directory?).with(resource_path).and_return(false)
41
+ File.stub!(:directory?).with(enclosing_directory).and_return(true)
42
+ File.stub!(:writable?).with(resource_path).and_return(true)
43
+ file_symlink_class.stub!(:symlink?).with(resource_path).and_return(false)
44
+ file_symlink_class.stub!(:symlink?).with(normalized_path).and_return(false)
45
+ end
46
+
47
+ def setup_missing_file
48
+ File.stub!(:exists?).with(resource_path).and_return(false)
49
+ File.stub!(:directory?).with(resource_path).and_return(false)
50
+ File.stub!(:directory?).with(enclosing_directory).and_return(true)
51
+ File.stub!(:writable?).with(resource_path).and_return(false)
52
+ file_symlink_class.stub!(:symlink?).with(resource_path).and_return(false)
53
+ end
54
+
55
+ def setup_symlink
56
+ File.stub!(:exists?).with(resource_path).and_return(true)
57
+ File.stub!(:directory?).with(normalized_path).and_return(false)
58
+ File.stub!(:directory?).with(enclosing_directory).and_return(true)
59
+ File.stub!(:writable?).with(resource_path).and_return(true)
60
+ file_symlink_class.stub!(:symlink?).with(resource_path).and_return(true)
61
+ file_symlink_class.stub!(:symlink?).with(normalized_path).and_return(true)
62
+ end
63
+
64
+ def setup_unwritable_file
65
+ File.stub!(:exists?).with(resource_path).and_return(true)
66
+ File.stub!(:directory?).with(resource_path).and_return(false)
67
+ File.stub!(:directory?).with(enclosing_directory).and_return(true)
68
+ File.stub!(:writable?).with(resource_path).and_return(false)
69
+ file_symlink_class.stub!(:symlink?).with(resource_path).and_return(false)
70
+ end
71
+
72
+ def setup_missing_enclosing_directory
73
+ File.stub!(:exists?).with(resource_path).and_return(false)
74
+ File.stub!(:directory?).with(resource_path).and_return(false)
75
+ File.stub!(:directory?).with(enclosing_directory).and_return(false)
76
+ File.stub!(:writable?).with(resource_path).and_return(false)
77
+ file_symlink_class.stub!(:symlink?).with(resource_path).and_return(false)
78
+ end
79
+
80
+ shared_examples_for Chef::Provider::File do
81
+
82
+ it "should return a #{described_class}" do
83
+ provider.should be_a_kind_of(described_class)
84
+ end
85
+
86
+ it "should store the resource passed to new as new_resource" do
87
+ provider.new_resource.should eql(resource)
88
+ end
89
+
90
+ it "should store the node passed to new as node" do
91
+ provider.node.should eql(node)
92
+ end
93
+
94
+ context "when loading the current resource" do
95
+
96
+ context "when running load_current_resource and the file exists" do
97
+ before do
98
+ setup_normal_file
99
+ provider.load_current_resource
100
+ end
101
+
102
+ it "should load a current resource based on the one specified at construction" do
103
+ provider.current_resource.should be_a_kind_of(Chef::Resource::File)
104
+ end
105
+
106
+ it "the loaded current_resource name should be the same as the resource name" do
107
+ provider.current_resource.name.should eql(resource.name)
108
+ end
109
+
110
+ it "the loaded current_resource path should be the same as the resoure path" do
111
+ provider.current_resource.path.should eql(resource.path)
112
+ end
113
+
114
+ it "the loaded current_resource content should be nil" do
115
+ provider.current_resource.content.should eql(nil)
116
+ end
117
+ end
118
+
119
+ context "when running load_current_resource and the file does not exist" do
120
+ before do
121
+ setup_missing_file
122
+ provider.load_current_resource
123
+ end
124
+
125
+ it "the current_resource should be a Chef::Resource::File" do
126
+ provider.current_resource.should be_a_kind_of(Chef::Resource::File)
127
+ end
128
+
129
+ it "the current_resource name should be the same as the resource name" do
130
+ provider.current_resource.name.should eql(resource.name)
131
+ end
132
+
133
+ it "the current_resource path should be the same as the resource path" do
134
+ provider.current_resource.path.should eql(resource.path)
135
+ end
136
+
137
+ it "the loaded current_resource content should be nil" do
138
+ provider.current_resource.content.should eql(nil)
139
+ end
140
+ end
141
+
142
+ context "examining file security metadata on Unix with a file that exists" do
143
+ before do
144
+ # fake that we're on unix even if we're on windows
145
+ Chef::Platform.stub!(:windows?).and_return(false)
146
+ # mock up the filesystem to behave like unix
147
+ setup_normal_file
148
+ stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
149
+ resource_real_path = File.realpath(resource.path)
150
+ File.should_receive(:stat).with(resource_real_path).at_least(:once).and_return(stat_struct)
151
+ Etc.stub!(:getgrgid).with(0).and_return(mock("Group Ent", :name => "wheel"))
152
+ Etc.stub!(:getpwuid).with(0).and_return(mock("User Ent", :name => "root"))
153
+ end
154
+
155
+ context "when the new_resource does not specify any state" do
156
+ before do
157
+ provider.load_current_resource
158
+ end
159
+
160
+ it "should load the permissions into the current_resource" do
161
+ provider.current_resource.mode.should == "0600"
162
+ provider.current_resource.owner.should == "root"
163
+ provider.current_resource.group.should == "wheel"
164
+ end
165
+
166
+ it "should not set the new_resource permissions" do
167
+ provider.new_resource.group.should be_nil
168
+ provider.new_resource.owner.should be_nil
169
+ provider.new_resource.mode.should be_nil
170
+ end
171
+ end
172
+
173
+ context "when the new_resource explicitly specifies resource state as numbers" do
174
+ before do
175
+ resource.owner(1)
176
+ resource.group(1)
177
+ resource.mode(0644)
178
+ provider.load_current_resource
179
+ end
180
+
181
+ it "should load the permissions into the current_resource as numbers" do
182
+ # Mode is always loaded as string for reporting purposes.
183
+ provider.current_resource.mode.should == "0600"
184
+ provider.current_resource.owner.should == 0
185
+ provider.current_resource.group.should == 0
186
+ end
187
+
188
+ it "should not set the new_resource permissions" do
189
+ provider.new_resource.group.should == 1
190
+ provider.new_resource.owner.should == 1
191
+ provider.new_resource.mode.should == 0644
192
+ end
193
+ end
194
+
195
+ context "when the new_resource explicitly specifies resource state as symbols" do
196
+ before do
197
+ resource.owner("macklemore")
198
+ resource.group("seattlehiphop")
199
+ resource.mode("0321")
200
+ provider.load_current_resource
201
+ end
202
+
203
+ it "should load the permissions into the current_resource as symbols" do
204
+ provider.current_resource.mode.should == "0600"
205
+ provider.current_resource.owner.should == "root"
206
+ provider.current_resource.group.should == "wheel"
207
+ end
208
+
209
+ it "should not set the new_resource permissions" do
210
+ provider.new_resource.group.should == "seattlehiphop"
211
+ provider.new_resource.owner.should == "macklemore"
212
+ provider.new_resource.mode.should == "0321"
213
+ end
214
+ end
215
+
216
+ end
217
+
218
+ context "examining file security metadata on Unix with a file that does not exist" do
219
+ before do
220
+ # fake that we're on unix even if we're on windows
221
+ Chef::Platform.stub!(:windows?).and_return(false)
222
+ setup_missing_file
223
+ end
224
+
225
+ context "when the new_resource does not specify any state" do
226
+ before do
227
+ provider.load_current_resource
228
+ end
229
+
230
+ it "the current_resource permissions should be nil" do
231
+ provider.current_resource.mode.should be_nil
232
+ provider.current_resource.owner.should be_nil
233
+ provider.current_resource.group.should be_nil
234
+ end
235
+
236
+ it "should not set the new_resource permissions" do
237
+ provider.new_resource.group.should be_nil
238
+ provider.new_resource.owner.should be_nil
239
+ provider.new_resource.mode.should be_nil
240
+ end
241
+ end
242
+
243
+ context "when the new_resource explicitly specifies resource state" do
244
+ before do
245
+ resource.owner(63945)
246
+ resource.group(51948)
247
+ resource.mode(0123)
248
+ provider.load_current_resource
249
+ end
250
+
251
+ it "the current_resource permissions should be nil" do
252
+ provider.current_resource.mode.should be_nil
253
+ provider.current_resource.owner.should be_nil
254
+ provider.current_resource.group.should be_nil
255
+ end
256
+
257
+ it "should not set the new_resource permissions" do
258
+ provider.new_resource.group.should == 51948
259
+ provider.new_resource.owner.should == 63945
260
+ provider.new_resource.mode.should == 0123
261
+ end
262
+ end
263
+ end
264
+ end
265
+
266
+ context "when loading the new_resource after the run" do
267
+
268
+ before do
269
+ # fake that we're on unix even if we're on windows
270
+ Chef::Platform.stub!(:windows?).and_return(false)
271
+ # mock up the filesystem to behave like unix
272
+ setup_normal_file
273
+ stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
274
+ resource_real_path = File.realpath(resource.path)
275
+ File.stub!(:stat).with(resource_real_path).and_return(stat_struct)
276
+ Etc.stub!(:getgrgid).with(0).and_return(mock("Group Ent", :name => "wheel"))
277
+ Etc.stub!(:getpwuid).with(0).and_return(mock("User Ent", :name => "root"))
278
+ provider.send(:load_resource_attributes_from_file, resource)
279
+ end
280
+
281
+ it "new_resource should record the new permission information" do
282
+ provider.new_resource.group.should == "wheel"
283
+ provider.new_resource.owner.should == "root"
284
+ provider.new_resource.mode.should == "0600"
285
+ end
286
+ end
287
+
288
+ context "when reporting security metadata on windows" do
289
+ it "records the file owner" do
290
+ pending
291
+ end
292
+
293
+ it "records rights for each user in the ACL" do
294
+ pending
295
+ end
296
+
297
+ it "records deny_rights for each user in the ACL" do
298
+ pending
299
+ end
300
+ end
301
+
302
+ context "define_resource_requirements" do
303
+ context "when the enclosing directory does not exist" do
304
+ before { setup_missing_enclosing_directory }
305
+
306
+ [:create, :create_if_missing, :touch].each do |action|
307
+ context "action #{action}" do
308
+ it "raises EnclosingDirectoryDoesNotExist" do
309
+ lambda {provider.run_action(action)}.should raise_error(Chef::Exceptions::EnclosingDirectoryDoesNotExist)
310
+ end
311
+
312
+ it "does not raise an exception in why-run mode" do
313
+ Chef::Config[:why_run] = true
314
+ lambda {provider.run_action(action)}.should_not raise_error(Chef::Exceptions::EnclosingDirectoryDoesNotExist)
315
+ Chef::Config[:why_run] = false
316
+ end
317
+ end
318
+ end
319
+ end
320
+
321
+ context "when the file exists but is not deletable" do
322
+ before { setup_unwritable_file }
323
+
324
+ it "action delete raises InsufficientPermissions" do
325
+ lambda {provider.run_action(:delete)}.should raise_error(Chef::Exceptions::InsufficientPermissions)
326
+ end
327
+
328
+ it "action delete also raises InsufficientPermissions in why-run mode" do
329
+ Chef::Config[:why_run] = true
330
+ lambda {provider.run_action(:delete)}.should raise_error(Chef::Exceptions::InsufficientPermissions)
331
+ Chef::Config[:why_run] = false
332
+ end
333
+ end
334
+ end
335
+
336
+ context "action create" do
337
+ it "should create the file, update its contents and then set the acls on the file" do
338
+ setup_missing_file
339
+ provider.should_receive(:do_create_file)
340
+ provider.should_receive(:do_contents_changes)
341
+ provider.should_receive(:do_acl_changes)
342
+ provider.should_receive(:load_resource_attributes_from_file)
343
+ provider.run_action(:create)
344
+ end
345
+
346
+ context "do_create_file" do
347
+ context "when the file exists" do
348
+ before { setup_normal_file }
349
+ it "should not create the file" do
350
+ provider.deployment_strategy.should_not_receive(:create).with(resource_path)
351
+ provider.send(:do_create_file)
352
+ provider.send(:file_created?).should == false
353
+ end
354
+ end
355
+ context "when the file does not exist" do
356
+ before { setup_missing_file }
357
+ it "should create the file" do
358
+ provider.deployment_strategy.should_receive(:create).with(resource_path)
359
+ provider.send(:do_create_file)
360
+ provider.send(:file_created?).should == true
361
+ end
362
+ end
363
+ end
364
+
365
+ context "do_contents_changes" do
366
+ context "when there is content to deploy" do
367
+ before do
368
+ setup_normal_file
369
+ provider.load_current_resource
370
+ tempfile = double('Tempfile', :path => "/tmp/foo-bar-baz")
371
+ content.stub!(:tempfile).and_return(tempfile)
372
+ File.should_receive(:exists?).with("/tmp/foo-bar-baz").and_return(true)
373
+ tempfile.should_receive(:unlink).once
374
+ end
375
+
376
+ context "when the contents have changed" do
377
+ let(:tempfile_path) { "/tmp/foo-bar-baz" }
378
+ let(:tempfile_sha256) { "42971f0ddce0cb20cf7660a123ffa1a1543beb2f1e7cd9d65858764a27f3201d" }
379
+ let(:diff_for_reporting) { "+++\n---\n+foo\n-bar\n" }
380
+ before do
381
+ provider.stub!(:contents_changed?).and_return(true)
382
+ diff = double('Diff', :for_output => ['+++','---','+foo','-bar'],
383
+ :for_reporting => diff_for_reporting )
384
+ diff.stub!(:diff).with(resource_path, tempfile_path).and_return(true)
385
+ provider.should_receive(:diff).at_least(:once).and_return(diff)
386
+ provider.should_receive(:checksum).with(tempfile_path).and_return(tempfile_sha256)
387
+ provider.should_receive(:checksum).with(resource_path).and_return(tempfile_sha256)
388
+ provider.deployment_strategy.should_receive(:deploy).with(tempfile_path, normalized_path)
389
+ end
390
+ context "when the file was created" do
391
+ before { provider.should_receive(:file_created?).at_least(:once).and_return(true) }
392
+ it "does not backup the file and does not produce a diff for reporting" do
393
+ provider.should_not_receive(:do_backup)
394
+ provider.send(:do_contents_changes)
395
+ resource.diff.should be_nil
396
+ end
397
+ end
398
+ context "when the file was not created" do
399
+ before { provider.should_receive(:file_created?).at_least(:once).and_return(false) }
400
+ it "backs up the file and produces a diff for reporting" do
401
+ provider.should_receive(:do_backup)
402
+ provider.send(:do_contents_changes)
403
+ resource.diff.should == diff_for_reporting
404
+ end
405
+ end
406
+ end
407
+
408
+ it "does nothing when the contents have not changed" do
409
+ provider.stub!(:contents_changed?).and_return(false)
410
+ provider.should_not_receive(:diff)
411
+ provider.send(:do_contents_changes)
412
+ end
413
+ end
414
+
415
+ it "does nothing when there is no content to deploy (tempfile returned from contents is nil)" do
416
+ provider.send(:content).should_receive(:tempfile).at_least(:once).and_return(nil)
417
+ provider.should_not_receive(:diff)
418
+ lambda{ provider.send(:do_contents_changes) }.should_not raise_error
419
+ end
420
+
421
+ it "raises an exception when the content object returns a tempfile with a nil path" do
422
+ tempfile = double('Tempfile', :path => nil)
423
+ provider.send(:content).should_receive(:tempfile).at_least(:once).and_return(tempfile)
424
+ lambda{ provider.send(:do_contents_changes) }.should raise_error
425
+ end
426
+
427
+ it "raises an exception when the content object returns a tempfile that does not exist" do
428
+ tempfile = double('Tempfile', :path => "/tmp/foo-bar-baz")
429
+ provider.send(:content).should_receive(:tempfile).at_least(:once).and_return(tempfile)
430
+ File.should_receive(:exists?).with("/tmp/foo-bar-baz").and_return(false)
431
+ lambda{ provider.send(:do_contents_changes) }.should raise_error
432
+ end
433
+ end
434
+
435
+ context "do_acl_changes" do
436
+ it "needs tests" do
437
+ pending
438
+ end
439
+ end
440
+
441
+ context "do_selinux" do
442
+ context "when resource is updated" do
443
+ before do
444
+ setup_normal_file
445
+ provider.load_current_resource
446
+ provider.stub!(:resource_updated?).and_return(true)
447
+ end
448
+
449
+ it "should check for selinux_enabled? by default" do
450
+ provider.should_receive(:selinux_enabled?)
451
+ provider.send(:do_selinux)
452
+ end
453
+
454
+ context "when selinux fixup is enabled in the config" do
455
+ before do
456
+ @original_selinux_fixup = Chef::Config[:enable_selinux_file_permission_fixup]
457
+ Chef::Config[:enable_selinux_file_permission_fixup] = true
458
+ end
459
+
460
+ after do
461
+ Chef::Config[:enable_selinux_file_permission_fixup] = @original_selinux_fixup
462
+ end
463
+
464
+ context "when selinux is enabled on the system" do
465
+ before do
466
+ provider.should_receive(:selinux_enabled?).and_return(true)
467
+ end
468
+
469
+ it "restores security context on the file" do
470
+ provider.should_receive(:restore_security_context).with(normalized_path, false)
471
+ provider.send(:do_selinux)
472
+ end
473
+
474
+ it "restores security context recursively when told so" do
475
+ provider.should_receive(:restore_security_context).with(normalized_path, true)
476
+ provider.send(:do_selinux, true)
477
+ end
478
+ end
479
+
480
+ context "when selinux is disabled on the system" do
481
+ before do
482
+ provider.should_receive(:selinux_enabled?).and_return(false)
483
+ end
484
+
485
+ it "should not restore security context" do
486
+ provider.should_not_receive(:restore_security_context)
487
+ provider.send(:do_selinux)
488
+ end
489
+ end
490
+ end
491
+
492
+ context "when selinux fixup is disabled in the config" do
493
+ before do
494
+ @original_selinux_fixup = Chef::Config[:enable_selinux_file_permission_fixup]
495
+ Chef::Config[:enable_selinux_file_permission_fixup] = false
496
+ end
497
+
498
+ after do
499
+ Chef::Config[:enable_selinux_file_permission_fixup] = @original_selinux_fixup
500
+ end
501
+
502
+ it "should not check for selinux_enabled?" do
503
+ provider.should_not_receive(:selinux_enabled?)
504
+ provider.send(:do_selinux)
505
+ end
506
+ end
507
+ end
508
+
509
+ context "when resource is not updated" do
510
+ before do
511
+ provider.stub!(:resource_updated?).and_return(false)
512
+ end
513
+
514
+ it "should not check for selinux_enabled?" do
515
+ provider.should_not_receive(:selinux_enabled?)
516
+ provider.send(:do_selinux)
517
+ end
518
+ end
519
+ end
520
+
521
+ end
522
+
523
+ context "action delete" do
524
+ context "when the file exists" do
525
+ context "when the file is writable" do
526
+ context "when the file is not a symlink" do
527
+ before { setup_normal_file }
528
+ it "should backup and delete the file and be updated by the last action" do
529
+ provider.should_receive(:do_backup).at_least(:once).and_return(true)
530
+ File.should_receive(:delete).with(resource_path).and_return(true)
531
+ provider.run_action(:delete)
532
+ resource.should be_updated_by_last_action
533
+ end
534
+ end
535
+ context "when the file is a symlink" do
536
+ before { setup_symlink }
537
+ it "should not backup the symlink" do
538
+ provider.should_not_receive(:do_backup)
539
+ File.should_receive(:delete).with(resource_path).and_return(true)
540
+ provider.run_action(:delete)
541
+ resource.should be_updated_by_last_action
542
+ end
543
+ end
544
+ end
545
+ context "when the file is not writable" do
546
+ before { setup_unwritable_file }
547
+ it "should not try to backup or delete the file, and should not be updated by last action" do
548
+ provider.should_not_receive(:do_backup)
549
+ File.should_not_receive(:delete)
550
+ lambda { provider.run_action(:delete) }.should raise_error()
551
+ resource.should_not be_updated_by_last_action
552
+ end
553
+ end
554
+ end
555
+
556
+ context "when the file does not exist" do
557
+ before { setup_missing_file }
558
+
559
+ it "should not try to backup or delete the file, and should not be updated by last action" do
560
+ provider.should_not_receive(:do_backup)
561
+ File.should_not_receive(:delete)
562
+ lambda { provider.run_action(:delete) }.should_not raise_error()
563
+ resource.should_not be_updated_by_last_action
564
+ end
565
+ end
566
+ end
567
+
568
+ context "action touch" do
569
+ context "when the file does not exist" do
570
+ before { setup_missing_file }
571
+ it "should update the atime/mtime on action_touch" do
572
+ File.should_receive(:utime).once
573
+ provider.should_receive(:action_create)
574
+ provider.run_action(:touch)
575
+ resource.should be_updated_by_last_action
576
+ end
577
+ end
578
+ context "when the file exists" do
579
+ before { setup_normal_file }
580
+ it "should update the atime/mtime on action_touch" do
581
+ File.should_receive(:utime).once
582
+ provider.should_receive(:action_create)
583
+ provider.run_action(:touch)
584
+ resource.should be_updated_by_last_action
585
+ end
586
+ end
587
+ end
588
+
589
+ context "action create_if_missing" do
590
+ context "when the file does not exist" do
591
+ before { setup_missing_file }
592
+ it "should call action_create" do
593
+ provider.should_receive(:action_create)
594
+ provider.run_action(:create_if_missing)
595
+ end
596
+ end
597
+
598
+ context "when the file exists" do
599
+ before { setup_normal_file }
600
+ it "should not call action_create" do
601
+ provider.should_not_receive(:action_create)
602
+ provider.run_action(:create_if_missing)
603
+ end
604
+ end
605
+
606
+ end
607
+
608
+ end
609
+