chef 11.4.4 → 11.6.0.hotfix.1

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 (504) hide show
  1. data/README.md +1 -1
  2. data/Rakefile +18 -1
  3. data/bin/chef-service-manager +37 -0
  4. data/distro/common/html/chef-client.8.html +4 -4
  5. data/distro/common/html/chef-expander.8.html +4 -4
  6. data/distro/common/html/chef-expanderctl.8.html +4 -4
  7. data/distro/common/html/chef-server-webui.8.html +4 -4
  8. data/distro/common/html/chef-server.8.html +4 -4
  9. data/distro/common/html/chef-shell.1.html +4 -4
  10. data/distro/common/html/chef-solo.8.html +12 -18
  11. data/distro/common/html/chef-solr.8.html +4 -4
  12. data/distro/common/html/knife-bootstrap.1.html +4 -4
  13. data/distro/common/html/knife-client.1.html +4 -4
  14. data/distro/common/html/knife-configure.1.html +4 -4
  15. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  16. data/distro/common/html/knife-cookbook.1.html +7 -10
  17. data/distro/common/html/knife-data-bag.1.html +7 -10
  18. data/distro/common/html/knife-environment.1.html +6 -8
  19. data/distro/common/html/knife-exec.1.html +4 -4
  20. data/distro/common/html/knife-index.1.html +4 -4
  21. data/distro/common/html/knife-node.1.html +4 -4
  22. data/distro/common/html/knife-role.1.html +4 -4
  23. data/distro/common/html/knife-search.1.html +4 -4
  24. data/distro/common/html/knife-ssh.1.html +4 -4
  25. data/distro/common/html/knife-status.1.html +4 -4
  26. data/distro/common/html/knife-tag.1.html +4 -4
  27. data/distro/common/html/knife.1.html +4 -4
  28. data/distro/common/man/man1/chef-shell.1 +1 -1
  29. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  30. data/distro/common/man/man1/knife-client.1 +1 -1
  31. data/distro/common/man/man1/knife-configure.1 +1 -1
  32. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  33. data/distro/common/man/man1/knife-cookbook.1 +2 -15
  34. data/distro/common/man/man1/knife-data-bag.1 +2 -15
  35. data/distro/common/man/man1/knife-environment.1 +2 -12
  36. data/distro/common/man/man1/knife-exec.1 +1 -1
  37. data/distro/common/man/man1/knife-index.1 +1 -1
  38. data/distro/common/man/man1/knife-node.1 +1 -1
  39. data/distro/common/man/man1/knife-role.1 +1 -1
  40. data/distro/common/man/man1/knife-search.1 +1 -1
  41. data/distro/common/man/man1/knife-ssh.1 +1 -1
  42. data/distro/common/man/man1/knife-status.1 +1 -1
  43. data/distro/common/man/man1/knife-tag.1 +1 -1
  44. data/distro/common/man/man1/knife.1 +1 -1
  45. data/distro/common/man/man8/chef-client.8 +1 -1
  46. data/distro/common/man/man8/chef-expander.8 +1 -1
  47. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  48. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  49. data/distro/common/man/man8/chef-server.8 +1 -1
  50. data/distro/common/man/man8/chef-solo.8 +4 -36
  51. data/distro/common/man/man8/chef-solr.8 +1 -1
  52. data/distro/debian/etc/init.d/chef-client +4 -2
  53. data/distro/windows/service_manager.rb +2 -146
  54. data/lib/chef.rb +1 -1
  55. data/lib/chef/application.rb +5 -12
  56. data/lib/chef/application/apply.rb +2 -0
  57. data/lib/chef/application/client.rb +12 -12
  58. data/lib/chef/application/knife.rb +2 -2
  59. data/lib/chef/application/solo.rb +4 -5
  60. data/lib/chef/application/windows_service.rb +113 -56
  61. data/lib/chef/application/windows_service_manager.rb +179 -0
  62. data/lib/chef/chef_fs.rb +2 -4
  63. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  64. data/lib/chef/chef_fs/command_line.rb +145 -93
  65. data/lib/chef/chef_fs/config.rb +205 -0
  66. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  67. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  68. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  69. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  70. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  71. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  72. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  73. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  74. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  75. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  76. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  77. data/lib/chef/chef_fs/file_system.rb +195 -127
  78. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  79. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  80. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  81. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  82. data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
  83. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  84. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  85. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  86. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  87. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
  88. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
  89. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
  90. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
  91. data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
  92. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  94. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
  95. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
  96. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
  97. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  98. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  99. data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
  100. data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
  101. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  102. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  103. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  104. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  105. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
  106. data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
  107. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
  108. data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
  109. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  110. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  111. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
  112. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
  113. data/lib/chef/chef_fs/knife.rb +68 -29
  114. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  115. data/lib/chef/chef_fs/path_utils.rb +29 -3
  116. data/lib/chef/chef_fs/raw_request.rb +79 -0
  117. data/lib/chef/client.rb +46 -20
  118. data/lib/chef/config.rb +59 -61
  119. data/lib/chef/cookbook/chefignore.rb +2 -1
  120. data/lib/chef/cookbook/synchronizer.rb +8 -6
  121. data/lib/chef/cookbook/syntax_check.rb +17 -2
  122. data/lib/chef/cookbook_uploader.rb +10 -1
  123. data/lib/chef/cookbook_version.rb +0 -109
  124. data/lib/chef/data_bag.rb +15 -6
  125. data/lib/chef/deprecation/mixin/template.rb +49 -0
  126. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  127. data/lib/chef/deprecation/provider/file.rb +197 -0
  128. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  129. data/lib/chef/deprecation/provider/template.rb +63 -0
  130. data/lib/chef/deprecation/warnings.rb +38 -0
  131. data/lib/chef/encrypted_data_bag_item.rb +153 -61
  132. data/lib/chef/environment.rb +34 -3
  133. data/lib/chef/event_dispatch/base.rb +3 -0
  134. data/lib/chef/exceptions.rb +27 -2
  135. data/lib/chef/file_access_control/unix.rb +64 -7
  136. data/lib/chef/file_access_control/windows.rb +22 -11
  137. data/lib/chef/file_content_management/content_base.rb +56 -0
  138. data/lib/chef/file_content_management/deploy.rb +38 -0
  139. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  140. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  141. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  142. data/lib/chef/file_content_management/tempfile.rb +61 -0
  143. data/lib/chef/formatters/doc.rb +1 -1
  144. data/lib/chef/formatters/error_descriptor.rb +5 -4
  145. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  146. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
  147. data/lib/chef/json_compat.rb +3 -0
  148. data/lib/chef/knife.rb +12 -3
  149. data/lib/chef/knife/bootstrap.rb +46 -2
  150. data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
  151. data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
  152. data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
  153. data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
  154. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
  155. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
  156. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
  157. data/lib/chef/knife/client_show.rb +2 -5
  158. data/lib/chef/knife/configure.rb +3 -3
  159. data/lib/chef/knife/cookbook_create.rb +6 -5
  160. data/lib/chef/knife/cookbook_download.rb +13 -5
  161. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  162. data/lib/chef/knife/cookbook_test.rb +1 -0
  163. data/lib/chef/knife/cookbook_upload.rb +4 -9
  164. data/lib/chef/knife/core/bootstrap_context.rb +10 -4
  165. data/lib/chef/knife/core/generic_presenter.rb +16 -0
  166. data/lib/chef/knife/core/node_editor.rb +1 -1
  167. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  168. data/lib/chef/knife/core/ui.rb +19 -4
  169. data/lib/chef/knife/delete.rb +76 -9
  170. data/lib/chef/knife/deps.rb +139 -0
  171. data/lib/chef/knife/diff.rb +22 -5
  172. data/lib/chef/knife/download.rb +16 -3
  173. data/lib/chef/knife/edit.rb +76 -0
  174. data/lib/chef/knife/environment_show.rb +2 -7
  175. data/lib/chef/knife/list.rb +91 -47
  176. data/lib/chef/knife/node_run_list_set.rb +66 -0
  177. data/lib/chef/knife/node_show.rb +1 -7
  178. data/lib/chef/knife/raw.rb +20 -64
  179. data/lib/chef/knife/role_show.rb +2 -4
  180. data/lib/chef/knife/search.rb +5 -6
  181. data/lib/chef/knife/show.rb +34 -11
  182. data/lib/chef/knife/ssh.rb +8 -0
  183. data/lib/chef/knife/upload.rb +23 -4
  184. data/lib/chef/knife/user_show.rb +2 -5
  185. data/lib/chef/knife/xargs.rb +265 -0
  186. data/lib/chef/log.rb +2 -2
  187. data/lib/chef/mixin/file_class.rb +0 -9
  188. data/lib/chef/mixin/language_include_recipe.rb +1 -1
  189. data/lib/chef/mixin/params_validate.rb +19 -9
  190. data/lib/chef/mixin/template.rb +126 -36
  191. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  192. data/lib/chef/monkey_patches/file.rb +26 -0
  193. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  194. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  195. data/lib/chef/monologger.rb +93 -0
  196. data/lib/chef/node.rb +4 -0
  197. data/lib/chef/platform.rb +4 -490
  198. data/lib/chef/platform/provider_mapping.rb +529 -0
  199. data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
  200. data/lib/chef/provider.rb +12 -9
  201. data/lib/chef/provider/batch.rb +35 -0
  202. data/lib/chef/provider/cookbook_file.rb +9 -78
  203. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  204. data/lib/chef/provider/deploy.rb +24 -20
  205. data/lib/chef/provider/deploy/revision.rb +27 -0
  206. data/lib/chef/provider/directory.rb +19 -22
  207. data/lib/chef/provider/execute.rb +22 -5
  208. data/lib/chef/provider/file.rb +299 -217
  209. data/lib/chef/provider/file/content.rb +39 -0
  210. data/lib/chef/provider/git.rb +76 -43
  211. data/lib/chef/provider/group/usermod.rb +2 -2
  212. data/lib/chef/provider/ifconfig.rb +25 -35
  213. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  214. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  215. data/lib/chef/provider/link.rb +10 -3
  216. data/lib/chef/provider/mount.rb +1 -1
  217. data/lib/chef/provider/mount/mount.rb +8 -3
  218. data/lib/chef/provider/mount/windows.rb +4 -1
  219. data/lib/chef/provider/package/portage.rb +9 -4
  220. data/lib/chef/provider/package/rubygems.rb +45 -10
  221. data/lib/chef/provider/package/smartos.rb +47 -36
  222. data/lib/chef/provider/package/yum.rb +19 -12
  223. data/lib/chef/provider/package/zypper.rb +45 -55
  224. data/lib/chef/provider/powershell_script.rb +77 -0
  225. data/lib/chef/provider/remote_directory.rb +5 -6
  226. data/lib/chef/provider/remote_file.rb +12 -108
  227. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  228. data/lib/chef/provider/remote_file/content.rb +75 -0
  229. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  230. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  231. data/lib/chef/provider/remote_file/http.rb +124 -0
  232. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  233. data/lib/chef/provider/route.rb +6 -2
  234. data/lib/chef/provider/script.rb +14 -2
  235. data/lib/chef/provider/service/macosx.rb +16 -10
  236. data/lib/chef/provider/service/solaris.rb +6 -5
  237. data/lib/chef/provider/template.rb +16 -78
  238. data/lib/chef/provider/template/content.rb +61 -0
  239. data/lib/chef/provider/user/solaris.rb +90 -0
  240. data/lib/chef/provider/user/useradd.rb +76 -63
  241. data/lib/chef/provider/windows_script.rb +73 -0
  242. data/lib/chef/providers.rb +16 -0
  243. data/lib/chef/resource.rb +23 -2
  244. data/lib/chef/resource/batch.rb +31 -0
  245. data/lib/chef/resource/conditional.rb +4 -0
  246. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  247. data/lib/chef/resource/file.rb +31 -3
  248. data/lib/chef/resource/link.rb +17 -0
  249. data/lib/chef/resource/lwrp_base.rb +1 -1
  250. data/lib/chef/resource/mount.rb +29 -2
  251. data/lib/chef/resource/powershell_script.rb +31 -0
  252. data/lib/chef/resource/remote_file.rb +47 -1
  253. data/lib/chef/resource/route.rb +1 -1
  254. data/lib/chef/resource/template.rb +145 -0
  255. data/lib/chef/resource/windows_script.rb +62 -0
  256. data/lib/chef/resource_collection.rb +45 -11
  257. data/lib/chef/resource_reporter.rb +81 -52
  258. data/lib/chef/resources.rb +2 -0
  259. data/lib/chef/rest.rb +13 -4
  260. data/lib/chef/rest/rest_request.rb +5 -1
  261. data/lib/chef/run_context/cookbook_compiler.rb +3 -3
  262. data/lib/chef/run_list/run_list_expansion.rb +1 -1
  263. data/lib/chef/run_lock.rb +7 -1
  264. data/lib/chef/runner.rb +0 -1
  265. data/lib/chef/scan_access_control.rb +6 -1
  266. data/lib/chef/search/query.rb +2 -2
  267. data/lib/chef/shell/shell_session.rb +2 -2
  268. data/lib/chef/util/backup.rb +84 -0
  269. data/lib/chef/util/diff.rb +145 -0
  270. data/lib/chef/util/file_edit.rb +1 -1
  271. data/lib/chef/util/selinux.rb +100 -0
  272. data/lib/chef/util/windows/net_user.rb +14 -1
  273. data/lib/chef/util/windows/volume.rb +2 -2
  274. data/lib/chef/version.rb +1 -1
  275. data/lib/chef/version/platform.rb +42 -0
  276. data/lib/chef/version_class.rb +1 -1
  277. data/lib/chef/version_constraint.rb +6 -5
  278. data/lib/chef/version_constraint/platform.rb +26 -0
  279. data/lib/chef/win32/api/file.rb +8 -2
  280. data/lib/chef/win32/version.rb +25 -8
  281. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  282. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  283. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  284. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  285. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  286. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  287. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  288. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  289. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  290. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  291. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  292. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  293. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  294. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  295. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  296. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  297. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  298. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  299. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  300. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  301. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  302. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  303. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  304. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  305. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  306. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  307. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  308. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  309. data/spec/data/apt/var/www/apt/db/version +4 -0
  310. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  311. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  312. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  313. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  314. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  315. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  316. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  317. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  318. data/spec/data/bootstrap/secret.erb +9 -0
  319. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  320. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  321. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
  322. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
  323. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
  324. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
  325. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  326. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  327. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  328. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  329. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  330. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  331. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  332. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  333. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  334. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  335. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  336. data/spec/data/null_config.rb +1 -0
  337. data/spec/data/partial_one.erb +1 -1
  338. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  339. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  340. data/spec/functional/knife/exec_spec.rb +2 -2
  341. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  342. data/spec/functional/resource/batch_spec.rb +64 -0
  343. data/spec/functional/resource/cookbook_file_spec.rb +2 -3
  344. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  345. data/spec/functional/resource/directory_spec.rb +2 -2
  346. data/spec/functional/resource/file_spec.rb +17 -1
  347. data/spec/functional/resource/git_spec.rb +259 -0
  348. data/spec/functional/resource/link_spec.rb +422 -388
  349. data/spec/functional/resource/package_spec.rb +297 -0
  350. data/spec/functional/resource/powershell_spec.rb +188 -0
  351. data/spec/functional/resource/registry_spec.rb +8 -4
  352. data/spec/functional/resource/remote_directory_spec.rb +2 -2
  353. data/spec/functional/resource/remote_file_spec.rb +97 -29
  354. data/spec/functional/resource/template_spec.rb +173 -17
  355. data/spec/functional/resource/user_spec.rb +547 -0
  356. data/spec/functional/run_lock_spec.rb +5 -0
  357. data/spec/functional/shell_spec.rb +2 -1
  358. data/spec/functional/win32/service_manager_spec.rb +269 -0
  359. data/spec/functional/win32/versions_spec.rb +78 -0
  360. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  361. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  362. data/spec/integration/knife/chefignore_spec.rb +271 -0
  363. data/spec/integration/knife/delete_spec.rb +944 -0
  364. data/spec/integration/knife/deps_spec.rb +648 -0
  365. data/spec/integration/knife/diff_spec.rb +536 -0
  366. data/spec/integration/knife/download_spec.rb +962 -0
  367. data/spec/integration/knife/list_spec.rb +633 -0
  368. data/spec/integration/knife/raw_spec.rb +166 -0
  369. data/spec/integration/knife/redirection_spec.rb +57 -0
  370. data/spec/integration/knife/show_spec.rb +158 -0
  371. data/spec/integration/knife/upload_spec.rb +1060 -0
  372. data/spec/integration/solo/solo_spec.rb +41 -0
  373. data/spec/spec_helper.rb +55 -1
  374. data/spec/support/chef_helpers.rb +32 -0
  375. data/spec/support/platform_helpers.rb +40 -0
  376. data/spec/support/platforms/win32/spec_service.rb +59 -0
  377. data/spec/support/shared/functional/directory_resource.rb +43 -16
  378. data/spec/support/shared/functional/file_resource.rb +661 -20
  379. data/spec/support/shared/functional/securable_resource.rb +109 -8
  380. data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
  381. data/spec/support/shared/integration/integration_helper.rb +166 -0
  382. data/spec/support/shared/integration/knife_support.rb +171 -0
  383. data/spec/support/shared/unit/execute_resource.rb +125 -0
  384. data/spec/support/shared/unit/file_system_support.rb +8 -48
  385. data/spec/support/shared/unit/provider/file.rb +609 -0
  386. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  387. data/spec/support/shared/unit/script_resource.rb +52 -0
  388. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  389. data/spec/tiny_server.rb +13 -11
  390. data/spec/unit/application/client_spec.rb +39 -1
  391. data/spec/unit/application/knife_spec.rb +12 -0
  392. data/spec/unit/application/solo_spec.rb +1 -1
  393. data/spec/unit/application_spec.rb +57 -2
  394. data/spec/unit/chef_fs/diff_spec.rb +30 -31
  395. data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
  396. data/spec/unit/chef_fs/file_system_spec.rb +2 -3
  397. data/spec/unit/client_spec.rb +20 -1
  398. data/spec/unit/config_spec.rb +70 -52
  399. data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
  400. data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
  401. data/spec/unit/cookbook_loader_spec.rb +3 -2
  402. data/spec/unit/daemon_spec.rb +7 -7
  403. data/spec/unit/data_bag_spec.rb +7 -0
  404. data/spec/unit/deprecation_spec.rb +86 -0
  405. data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
  406. data/spec/unit/environment_spec.rb +98 -0
  407. data/spec/unit/exceptions_spec.rb +6 -1
  408. data/spec/unit/file_access_control_spec.rb +21 -1
  409. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  410. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  411. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  412. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  413. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
  414. data/spec/unit/knife/bootstrap_spec.rb +128 -29
  415. data/spec/unit/knife/configure_spec.rb +42 -26
  416. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  417. data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
  418. data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
  419. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  420. data/spec/unit/knife/core/ui_spec.rb +41 -0
  421. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  422. data/spec/unit/knife_spec.rb +21 -0
  423. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
  424. data/spec/unit/mixin/params_validate_spec.rb +35 -0
  425. data/spec/unit/mixin/template_spec.rb +69 -57
  426. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  427. data/spec/unit/node_spec.rb +7 -0
  428. data/spec/unit/platform_spec.rb +15 -1
  429. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  430. data/spec/unit/provider/cookbook_file_spec.rb +26 -183
  431. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  432. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  433. data/spec/unit/provider/deploy_spec.rb +2 -2
  434. data/spec/unit/provider/directory_spec.rb +23 -23
  435. data/spec/unit/provider/execute_spec.rb +27 -1
  436. data/spec/unit/provider/file/content_spec.rb +101 -0
  437. data/spec/unit/provider/file_spec.rb +25 -484
  438. data/spec/unit/provider/git_spec.rb +224 -28
  439. data/spec/unit/provider/group/usermod_spec.rb +3 -1
  440. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  441. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  442. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  443. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  444. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  445. data/spec/unit/provider/mount_spec.rb +16 -6
  446. data/spec/unit/provider/package/portage_spec.rb +44 -0
  447. data/spec/unit/provider/package/rubygems_spec.rb +44 -1
  448. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  449. data/spec/unit/provider/package/yum_spec.rb +36 -39
  450. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  451. data/spec/unit/provider/package_spec.rb +0 -4
  452. data/spec/unit/provider/powershell_spec.rb +38 -0
  453. data/spec/unit/provider/remote_directory_spec.rb +0 -4
  454. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  455. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  456. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  457. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  458. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  459. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  460. data/spec/unit/provider/remote_file_spec.rb +33 -295
  461. data/spec/unit/provider/route_spec.rb +25 -9
  462. data/spec/unit/provider/service/macosx_spec.rb +176 -152
  463. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  464. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  465. data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
  466. data/spec/unit/provider/service_spec.rb +3 -3
  467. data/spec/unit/provider/template/content_spec.rb +78 -0
  468. data/spec/unit/provider/template_spec.rb +52 -184
  469. data/spec/unit/provider/user/solaris_spec.rb +80 -0
  470. data/spec/unit/provider/user/useradd_spec.rb +12 -358
  471. data/spec/unit/resource/batch_spec.rb +48 -0
  472. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  473. data/spec/unit/resource/execute_spec.rb +3 -101
  474. data/spec/unit/resource/file_spec.rb +0 -5
  475. data/spec/unit/resource/group_spec.rb +9 -0
  476. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  477. data/spec/unit/resource/link_spec.rb +1 -0
  478. data/spec/unit/resource/mount_spec.rb +37 -0
  479. data/spec/unit/resource/powershell_spec.rb +48 -0
  480. data/spec/unit/resource/remote_file_spec.rb +44 -4
  481. data/spec/unit/resource/route_spec.rb +1 -1
  482. data/spec/unit/resource/script_spec.rb +13 -36
  483. data/spec/unit/resource/template_spec.rb +111 -8
  484. data/spec/unit/resource/user_spec.rb +7 -0
  485. data/spec/unit/resource_collection_spec.rb +61 -32
  486. data/spec/unit/resource_reporter_spec.rb +115 -102
  487. data/spec/unit/resource_spec.rb +170 -1
  488. data/spec/unit/rest/auth_credentials_spec.rb +2 -2
  489. data/spec/unit/rest_spec.rb +6 -2
  490. data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
  491. data/spec/unit/runner_spec.rb +1 -1
  492. data/spec/unit/scan_access_control_spec.rb +4 -2
  493. data/spec/unit/shell/shell_session_spec.rb +15 -2
  494. data/spec/unit/util/backup_spec.rb +149 -0
  495. data/spec/unit/util/diff_spec.rb +596 -0
  496. data/spec/unit/util/selinux_spec.rb +172 -0
  497. data/spec/unit/version/platform_spec.rb +61 -0
  498. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  499. data/spec/unit/version_constraint_spec.rb +5 -0
  500. metadata +233 -10
  501. data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
  502. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
  503. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
  504. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
@@ -27,7 +27,7 @@ describe Chef::Provider::Execute do
27
27
  @new_resource = Chef::Resource::Execute.new("foo_resource", @run_context)
28
28
  @new_resource.timeout 3600
29
29
  @new_resource.returns 0
30
- @new_resource.creates "foo_resource"
30
+ @new_resource.creates "/foo_resource"
31
31
  @provider = Chef::Provider::Execute.new(@new_resource, @run_context)
32
32
  @current_resource = Chef::Resource::Ifconfig.new("foo_resource", @run_context)
33
33
  @provider.current_resource = @current_resource
@@ -46,6 +46,7 @@ describe Chef::Provider::Execute do
46
46
  opts[:log_tag] = @new_resource.to_s
47
47
  opts[:live_stream] = STDOUT
48
48
  @provider.should_receive(:shell_out!).with(@new_resource.command, opts)
49
+ Chef::Log.should_not_receive(:warn)
49
50
 
50
51
  @provider.run_action(:run)
51
52
  @new_resource.should be_updated
@@ -55,6 +56,31 @@ describe Chef::Provider::Execute do
55
56
  @provider.stub!(:load_current_resource)
56
57
  File.should_receive(:exists?).with(@new_resource.creates).and_return(true)
57
58
  @provider.should_not_receive(:shell_out!)
59
+ Chef::Log.should_not_receive(:warn)
60
+
61
+ @provider.run_action(:run)
62
+ @new_resource.should_not be_updated
63
+ end
64
+
65
+ it "should respect cwd options for 'creates'" do
66
+ @new_resource.cwd "/tmp"
67
+ @new_resource.creates "foo_resource"
68
+ @provider.stub!(:load_current_resource)
69
+ File.should_receive(:exists?).with(@new_resource.creates).and_return(false)
70
+ File.should_receive(:exists?).with(File.join("/tmp", @new_resource.creates)).and_return(true)
71
+ Chef::Log.should_not_receive(:warn)
72
+ @provider.should_not_receive(:shell_out!)
73
+
74
+ @provider.run_action(:run)
75
+ @new_resource.should_not be_updated
76
+ end
77
+
78
+ it "should warn if user specified relative path without cwd" do
79
+ @new_resource.creates "foo_resource"
80
+ @provider.stub!(:load_current_resource)
81
+ Chef::Log.should_receive(:warn).with(/relative path/)
82
+ File.should_receive(:exists?).with(@new_resource.creates).and_return(true)
83
+ @provider.should_not_receive(:shell_out!)
58
84
 
59
85
  @provider.run_action(:run)
60
86
  @new_resource.should_not be_updated
@@ -0,0 +1,101 @@
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
+
21
+ describe Chef::Provider::File::Content do
22
+
23
+ before(:all) do
24
+ @original_config = Chef::Config.configuration
25
+ end
26
+
27
+ after(:all) do
28
+ Chef::Config.configuration.replace(@original_config)
29
+ end
30
+
31
+ #
32
+ # mock setup
33
+ #
34
+
35
+ let(:current_resource) do
36
+ mock("Chef::Provider::File::Resource (current)")
37
+ end
38
+
39
+ let(:enclosing_directory) {
40
+ canonicalize_path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates")))
41
+ }
42
+ let(:resource_path) {
43
+ canonicalize_path(File.expand_path(File.join(enclosing_directory, "seattle.txt")))
44
+ }
45
+
46
+ let(:new_resource) do
47
+ mock("Chef::Provider::File::Resource (new)", :name => "seattle.txt", :path => resource_path)
48
+ end
49
+
50
+ let(:run_context) do
51
+ mock("Chef::RunContext")
52
+ end
53
+
54
+ #
55
+ # subject
56
+ #
57
+ let(:content) do
58
+ Chef::Provider::File::Content.new(new_resource, current_resource, run_context)
59
+ end
60
+
61
+ describe "when the resource has a content attribute set" do
62
+
63
+ before do
64
+ new_resource.stub!(:content).and_return("Do do do do, do do do do, do do do do, do do do do")
65
+ end
66
+
67
+ it "returns a tempfile" do
68
+ content.tempfile.should be_a_kind_of(Tempfile)
69
+ end
70
+
71
+ it "the tempfile contents should match the resource contents" do
72
+ IO.read(content.tempfile.path).should == new_resource.content
73
+ end
74
+
75
+ it "returns a tempfile in the tempdir when :file_staging_uses_destdir is not set" do
76
+ Chef::Config[:file_staging_uses_destdir] = false
77
+ content.tempfile.path.start_with?(Dir::tmpdir).should be_true
78
+ canonicalize_path(content.tempfile.path).start_with?(enclosing_directory).should be_false
79
+ end
80
+
81
+ it "returns a tempfile in the destdir when :file_desployment_uses_destdir is not set" do
82
+ Chef::Config[:file_staging_uses_destdir] = true
83
+ content.tempfile.path.start_with?(Dir::tmpdir).should be_false
84
+ canonicalize_path(content.tempfile.path).start_with?(enclosing_directory).should be_true
85
+ end
86
+
87
+ end
88
+
89
+ describe "when the resource does not have a content attribute set" do
90
+
91
+ before do
92
+ new_resource.stub!(:content).and_return(nil)
93
+ end
94
+
95
+ it "should return nil instead of a tempfile" do
96
+ content.tempfile.should be_nil
97
+ end
98
+
99
+ end
100
+ end
101
+
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
- # Copyright:: Copyright (c) 2008 Opscode, Inc.
3
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008-2013 Opscode, Inc.
4
5
  # License:: Apache License, Version 2.0
5
6
  #
6
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,499 +17,39 @@
16
17
  # limitations under the License.
17
18
  #
18
19
 
19
-
20
- require 'spec_helper'
21
- require 'tmpdir'
20
+ require 'support/shared/unit/provider/file'
22
21
 
23
22
  describe Chef::Provider::File do
24
- before(:each) do
25
- @node = Chef::Node.new
26
- @node.name "latte"
27
- @events = Chef::EventDispatch::Dispatcher.new
28
- @run_context = Chef::RunContext.new(@node, {}, @events)
29
-
30
- @resource = Chef::Resource::File.new("seattle")
31
- @resource.path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates", "seattle.txt")))
32
-
33
- @provider = Chef::Provider::File.new(@resource, @run_context)
34
- end
35
-
36
- it "should return a Chef::Provider::File" do
37
- @provider.should be_a_kind_of(Chef::Provider::File)
38
- end
39
-
40
- it "should store the resource passed to new as new_resource" do
41
- @provider.new_resource.should eql(@resource)
42
- end
43
-
44
- it "should store the node passed to new as node" do
45
- @provider.node.should eql(@node)
46
- end
47
-
48
- it "should load a current resource based on the one specified at construction" do
49
- @provider.load_current_resource
50
- @provider.current_resource.should be_a_kind_of(Chef::Resource::File)
51
- @provider.current_resource.name.should eql(@resource.name)
52
- @provider.current_resource.path.should eql(@resource.path)
53
- @provider.current_resource.content.should eql(nil)
54
- end
55
-
56
- describe "examining file security metadata on Unix" do
57
- before do
58
- Chef::Platform.stub!(:windows?).and_return(false)
59
- end
60
- it "should collect the current state of the file on the filesystem and populate current_resource" do
61
- # test setup
62
- stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
63
- ::File.should_receive(:stat).exactly(1).times.with(@resource.path).and_return(stat_struct)
64
-
65
- # test execution
66
-
67
- Etc.should_receive(:getgrgid).with(0).and_return(mock("Group Ent", :name => "wheel"))
68
- Etc.should_receive(:getpwuid).with(0).and_return(mock("User Ent", :name => "root"))
69
-
70
- # test execution
71
- @provider.load_current_resource
72
-
73
- # post-condition checks
74
- @provider.current_resource.mode.should == "0600"
75
- @provider.current_resource.owner.should == "root"
76
- @provider.current_resource.group.should == "wheel"
77
- end
78
-
79
- it "should NOT update the new_resource state with the current_resourse state if new_resource state is already specified" do
80
- # test setup
81
- stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
82
- ::File.should_receive(:stat).exactly(1).times.with(@resource.path).and_return(stat_struct)
83
-
84
- @provider.new_resource.group(1)
85
- @provider.new_resource.owner(1)
86
- @provider.new_resource.mode(0644)
87
-
88
- # test execution
89
- @provider.load_current_resource
90
-
91
- # post-condition checks
92
- @provider.new_resource.group.should == 1
93
- @provider.new_resource.owner.should == 1
94
- @provider.new_resource.mode.should == 0644
95
- end
96
23
 
97
- context "when the new_resource does not specify the desired access control" do
98
- it "records access control information in the new resource after modifying the file" do
99
- # test setup
100
- stat_struct = mock("::File.stat", :mode => 0600, :uid => 0, :gid => 0, :mtime => 10000)
101
- # called once in update_new_file_state and once in checksum
102
- ::File.should_receive(:stat).once.with(@provider.new_resource.path).and_return(stat_struct)
103
- ::File.should_receive(:directory?).once.with(@provider.new_resource.path).and_return(false)
104
-
105
- Etc.should_receive(:getpwuid).with(0).and_return(mock("User Ent", :name => "root"))
106
- Etc.should_receive(:getgrgid).with(0).and_return(mock("Group Ent", :name => "wheel"))
107
-
108
- @provider.new_resource.group(nil)
109
- @provider.new_resource.owner(nil)
110
- @provider.new_resource.mode(nil)
111
-
112
- # test exectution
113
- @provider.update_new_file_state
114
-
115
- # post-condition checks
116
- @provider.new_resource.group.should == "wheel"
117
- @provider.new_resource.owner.should == "root"
118
- @provider.new_resource.mode.should == "0600"
119
- end
120
- end
121
- end
122
-
123
- describe "when reporting security metadata on windows" do
124
-
125
- it "records the file owner" do
126
- pending
127
- end
128
-
129
- it "records rights for each user in the ACL" do
130
- pending
131
- end
132
-
133
- it "records deny_rights for each user in the ACL" do
134
- pending
135
- end
136
- end
137
-
138
- it "should load a mostly blank current resource if the file specified in new_resource doesn't exist/isn't readable" do
24
+ let(:resource) do
25
+ # need to check for/against mutating state within the new_resource, so don't mock
139
26
  resource = Chef::Resource::File.new("seattle")
140
- resource.path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates", "woot.txt")))
141
- node = Chef::Node.new
142
- node.name "latte"
143
- provider = Chef::Provider::File.new(resource, @run_context)
144
- provider.load_current_resource
145
- provider.current_resource.should be_a_kind_of(Chef::Resource::File)
146
- provider.current_resource.name.should eql(resource.name)
147
- provider.current_resource.path.should eql(resource.path)
148
- end
149
-
150
- it "should not backup symbolic links on delete" do
151
- path = File.expand_path(File.join(CHEF_SPEC_DATA, "detroit.txt"))
152
- ::File.open(path, "w") do |file|
153
- file.write("Detroit's not so nice, so you should come to Seattle instead and buy me a beer instead.")
154
- end
155
- @resource = Chef::Resource::File.new("detroit")
156
- @resource.path(path)
157
- @node = Chef::Node.new
158
- @node.name "latte"
159
- @provider = Chef::Provider::File.new(@resource, @run_context)
160
-
161
- ::File.stub!(:symlink?).and_return(true)
162
- @provider.should_not_receive(:backup)
163
- @provider.run_action(:delete)
164
- @resource.should be_updated_by_last_action
165
- end
166
-
167
- it "should compare the current content with the requested content" do
168
- @provider.load_current_resource
169
-
170
- @provider.new_resource.content "foobar"
171
- @provider.compare_content.should eql(false)
172
-
173
- @provider.new_resource.content IO.read(@resource.path)
174
- @provider.compare_content.should eql(true)
27
+ resource.path(resource_path)
28
+ resource
175
29
  end
176
30
 
177
- it "should set the content of the file to the requested content" do
178
- io = StringIO.new
179
- @provider.load_current_resource
180
- @provider.new_resource.content "foobar"
181
- @provider.should_receive(:diff_current_from_content).and_return("")
182
- @provider.should_receive(:backup)
183
- # checksum check
184
- File.should_receive(:open).with(@provider.new_resource.path, "rb").and_yield(io)
185
- File.should_receive(:open).with(@provider.new_resource.path, "w").and_yield(io)
186
- @provider.set_content
187
- io.string.should == "foobar"
31
+ let(:content) do
32
+ content = mock('Chef::Provider::File::Content')
188
33
  end
189
34
 
190
- it "should not set the content of the file if it already matches the requested content" do
191
- @provider.load_current_resource
192
- @provider.new_resource.content IO.read(@resource.path)
193
- # Checksum check:
194
- File.should_receive(:open).with(@resource.path, "rb").and_yield(StringIO.new(@resource.content))
195
- File.should_not_receive(:open).with(@provider.new_resource.path, "w")
196
- lambda { @provider.set_content }.should_not raise_error
197
- @resource.should_not be_updated_by_last_action
198
- end
35
+ let(:node) { double('Chef::Node') }
36
+ let(:events) { double('Chef::Events').as_null_object } # mock all the methods
37
+ let(:run_context) { double('Chef::RunContext', :node => node, :events => events) }
38
+ let(:enclosing_directory) {
39
+ canonicalize_path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates")))
40
+ }
41
+ let(:resource_path) {
42
+ canonicalize_path(File.expand_path(File.join(enclosing_directory, "seattle.txt")))
43
+ }
199
44
 
200
- it "should create the file if it is missing, then set the attributes on action_create" do
201
- @provider.load_current_resource
202
- @provider.stub!(:update_new_file_state)
203
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
204
- @provider.access_controls.should_receive(:set_all)
205
- @provider.should_receive(:diff_current_from_content).and_return("")
206
- File.stub!(:open).and_return(1)
207
- #File.should_receive(:directory?).with("/tmp").and_return(true)
208
- File.should_receive(:open).with(@provider.new_resource.path, "w+")
209
- @provider.run_action(:create)
210
- @resource.should be_updated_by_last_action
211
- end
45
+ # Subject
212
46
 
213
- it "should create the file with the proper content if it is missing, then set attributes on action_create" do
214
- io = StringIO.new
215
- @provider.load_current_resource
216
- @provider.new_resource.content "foobar"
217
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
218
- @provider.should_receive(:diff_current_from_content).and_return("")
219
- @provider.stub!(:update_new_file_state)
220
- File.should_receive(:open).with(@provider.new_resource.path, "w+").and_yield(io)
221
- @provider.access_controls.should_receive(:set_all)
222
- @provider.run_action(:create)
223
- io.string.should == "foobar"
224
- @resource.should be_updated_by_last_action
47
+ let(:provider) do
48
+ provider = described_class.new(resource, run_context)
49
+ provider.stub!(:content).and_return(content)
50
+ provider
225
51
  end
226
52
 
227
- it "should delete the file if it exists and is writable on action_delete" do
228
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
229
- @provider.stub!(:backup).and_return(true)
230
- File.should_receive("exists?").exactly(2).times.with(@provider.new_resource.path).and_return(true)
231
- File.should_receive("writable?").with(@provider.new_resource.path).and_return(true)
232
- File.should_receive(:delete).with(@provider.new_resource.path).and_return(true)
233
- @provider.run_action(:delete)
234
- @resource.should be_updated_by_last_action
235
- end
236
-
237
- it "should not raise an error if it cannot delete the file because it does not exist" do
238
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
239
- @provider.stub!(:backup).and_return(true)
240
- File.should_receive("exists?").exactly(2).times.with(@provider.new_resource.path).and_return(false)
241
- lambda { @provider.run_action(:delete) }.should_not raise_error()
242
- @resource.should_not be_updated_by_last_action
243
- end
244
-
245
- it "should update the atime/mtime on action_touch" do
246
- @provider.load_current_resource
247
- @provider.new_resource.stub!(:path).and_return(File.join(Dir.tmpdir, "monkeyfoo"))
248
- @provider.should_receive(:diff_current_from_content).and_return("")
249
- @provider.stub!(:update_new_file_state)
250
- File.should_receive(:utime).once.and_return(1)
251
- File.stub!(:open).and_return(1)
252
- @provider.access_controls.should_receive(:set_all).once
253
- @provider.run_action(:touch)
254
- @resource.should be_updated_by_last_action
255
- end
256
-
257
- it "should keep 1 backup copy if specified" do
258
- @provider.load_current_resource
259
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
260
- @provider.new_resource.stub!(:backup).and_return(1)
261
- Dir.stub!(:[]).and_return([ "/tmp/s-20080705111233", "/tmp/s-20080705111232", "/tmp/s-20080705111223"])
262
- FileUtils.should_receive(:rm).with("/tmp/s-20080705111223").once.and_return(true)
263
- FileUtils.should_receive(:rm).with("/tmp/s-20080705111232").once.and_return(true)
264
- FileUtils.stub!(:cp).and_return(true)
265
- FileUtils.stub!(:mkdir_p).and_return(true)
266
- File.stub!(:exist?).and_return(true)
267
- @provider.backup
268
- end
269
-
270
- it "should backup a file no more than :backup times" do
271
- @provider.load_current_resource
272
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
273
- @provider.new_resource.stub!(:backup).and_return(2)
274
- Dir.stub!(:[]).and_return([ "/tmp/s-20080705111233", "/tmp/s-20080705111232", "/tmp/s-20080705111223"])
275
- FileUtils.should_receive(:rm).with("/tmp/s-20080705111223").once.and_return(true)
276
- FileUtils.stub!(:cp).and_return(true)
277
- FileUtils.stub!(:mkdir_p).and_return(true)
278
- File.stub!(:exist?).and_return(true)
279
- @provider.backup
280
- end
281
-
282
- it "should not attempt to backup a file if :backup == 0" do
283
- @provider.load_current_resource
284
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
285
- @provider.new_resource.stub!(:backup).and_return(0)
286
- FileUtils.stub!(:cp).and_return(true)
287
- File.stub!(:exist?).and_return(true)
288
- FileUtils.should_not_receive(:cp)
289
- @provider.backup
290
- end
291
-
292
- it "should put the backup backup file in the directory specified by Chef::Config[:file_backup_path]" do
293
- @provider.load_current_resource
294
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
295
- @provider.new_resource.stub!(:backup).and_return(1)
296
- Chef::Config.stub!(:[]).with(:file_backup_path).and_return("/some_prefix")
297
- Dir.stub!(:[]).and_return([ "/some_prefix/tmp/s-20080705111233", "/some_prefix/tmp/s-20080705111232", "/some_prefix/tmp/s-20080705111223"])
298
- FileUtils.should_receive(:mkdir_p).with("/some_prefix/tmp").once
299
- FileUtils.should_receive(:rm).with("/some_prefix/tmp/s-20080705111232").once.and_return(true)
300
- FileUtils.should_receive(:rm).with("/some_prefix/tmp/s-20080705111223").once.and_return(true)
301
- FileUtils.stub!(:cp).and_return(true)
302
- File.stub!(:exist?).and_return(true)
303
- @provider.backup
304
- end
305
-
306
- it "should strip the drive letter from the backup resource path (for Windows platforms)" do
307
- @provider.load_current_resource
308
- @provider.new_resource.stub!(:path).and_return("C:/tmp/s-20080705111233")
309
- @provider.new_resource.stub!(:backup).and_return(1)
310
- Chef::Config.stub!(:[]).with(:file_backup_path).and_return("C:/some_prefix")
311
- Dir.stub!(:[]).and_return([ "C:/some_prefix/tmp/s-20080705111233", "C:/some_prefix/tmp/s-20080705111232", "C:/some_prefix/tmp/s-20080705111223"])
312
- FileUtils.should_receive(:mkdir_p).with("C:/some_prefix/tmp").once
313
- FileUtils.should_receive(:rm).with("C:/some_prefix/tmp/s-20080705111232").once.and_return(true)
314
- FileUtils.should_receive(:rm).with("C:/some_prefix/tmp/s-20080705111223").once.and_return(true)
315
- FileUtils.stub!(:cp).and_return(true)
316
- File.stub!(:exist?).and_return(true)
317
- @provider.backup
318
- end
319
-
320
- it "should keep the same ownership on backed up files" do
321
- @provider.load_current_resource
322
- @provider.new_resource.stub!(:path).and_return("/tmp/s-20080705111233")
323
- @provider.new_resource.stub!(:backup).and_return(1)
324
- Chef::Config.stub!(:[]).with(:file_backup_path).and_return("/some_prefix")
325
- Dir.stub!(:[]).and_return([ "/some_prefix/tmp/s-20080705111233", "/some_prefix/tmp/s-20080705111232", "/some_prefix/tmp/s-20080705111223"])
326
- FileUtils.stub!(:mkdir_p).and_return(true)
327
- FileUtils.stub!(:rm).and_return(true)
328
- File.stub!(:exist?).and_return(true)
329
- Time.stub!(:now).and_return(Time.at(1272147455).getgm)
330
- FileUtils.should_receive(:cp).with("/tmp/s-20080705111233", "/some_prefix/tmp/s-20080705111233.chef-20100424221735", {:preserve => true}).and_return(true)
331
- @provider.backup
332
- end
333
-
334
- describe "when the enclosing directory does not exist" do
335
- before do
336
- @resource.path("/tmp/no-such-path/file.txt")
337
- end
338
-
339
- it "raises a specific error describing the problem" do
340
- lambda {@provider.run_action(:create)}.should raise_error(Chef::Exceptions::EnclosingDirectoryDoesNotExist)
341
- end
342
- end
343
-
344
- describe "when creating a file which may be missing" do
345
- it "should not call action create if the file exists" do
346
- @resource.path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates", "seattle.txt")))
347
- @provider = Chef::Provider::File.new(@resource, @run_context)
348
- File.should_not_receive(:open)
349
- @provider.run_action(:create_if_missing)
350
- @resource.should_not be_updated_by_last_action
351
- end
352
-
353
- it "should call action create if the does not file exist" do
354
- @resource.path("/tmp/example-dir/non_existant_file")
355
- @provider = Chef::Provider::File.new(@resource, @run_context)
356
- @provider.should_receive(:diff_current_from_content).and_return("")
357
- ::File.stub!(:exists?).with(@resource.path).and_return(false)
358
- ::File.stub!(:directory?).with("/tmp/example-dir/non_existant_file").and_return(false)
359
- ::File.stub!(:directory?).with("/tmp/example-dir").and_return(true)
360
- @provider.stub!(:update_new_file_state)
361
- io = StringIO.new
362
- File.should_receive(:open).with(@provider.new_resource.path, "w+").and_yield(io)
363
- #@provider.should_receive(:action_create).and_return(true)
364
- @provider.run_action(:create_if_missing)
365
- @resource.should be_updated_by_last_action
366
- end
367
- end
368
-
369
- describe "when a diff is requested", :uses_diff => true do
370
-
371
- before(:each) do
372
- @original_config = Chef::Config.hash_dup
373
- end
374
-
375
- after(:each) do
376
- Chef::Config.configuration = @original_config if @original_config
377
- end
378
-
379
- describe "when identifying files as binary or text" do
380
-
381
- it "should identify zero-length files as text" do
382
- Tempfile.open("some-temp") do |file|
383
- @resource.path(file.path)
384
- @provider = Chef::Provider::File.new(@resource, @run_context)
385
- @provider.is_binary?(file.path).should be_false
386
- end
387
- end
388
-
389
- it "should correctly identify text files as being text" do
390
- Tempfile.open("some-temp") do |file|
391
- @resource.path(file.path)
392
- file.puts("This is a text file.")
393
- file.puts("That has a couple of lines in it.")
394
- file.puts("And lets make sure that other printable chars work too: ~!@\#$%^&*()`:\"<>?{}|_+,./;'[]\\-=")
395
- file.close
396
- @provider = Chef::Provider::File.new(@resource, @run_context)
397
- @provider.is_binary?(file.path).should be_false
398
- end
399
- end
400
-
401
- it "should identify a null-terminated string as binary" do
402
- Tempfile.open("some-temp") do |file|
403
- @resource.path(file.path)
404
- file.write("This is a binary file.\0")
405
- file.close
406
- @provider = Chef::Provider::File.new(@resource, @run_context)
407
- @provider.is_binary?(file.path).should be_true
408
- end
409
- end
410
-
411
- end
412
-
413
- it "should not return diff output when chef config has disabled it" do
414
- Chef::Config[:diff_disabled] = true
415
- Tempfile.open("some-temp") do |file|
416
- @resource.path(file.path)
417
- @provider = Chef::Provider::File.new(@resource, @run_context)
418
- @provider.load_current_resource
419
- result = @provider.diff_current_from_content "foo baz"
420
- result.should == [ "(diff output suppressed by config)" ]
421
- @resource.diff.should be_nil
422
- end
423
- end
424
-
425
- it "should not return diff output when there is no new file to compare it to" do
426
- Tempfile.open("some-temp") do |file|
427
- Tempfile.open("other-temp") do |missing_file|
428
- missing_path = missing_file.path
429
- missing_file.close
430
- missing_file.unlink
431
- @resource.path(file.path)
432
- @provider = Chef::Provider::File.new(@resource, @run_context)
433
- @provider.load_current_resource
434
- result = @provider.diff_current missing_path
435
- result.should == [ "(no temp file with new content, diff output suppressed)" ]
436
- @resource.diff.should be_nil
437
- end
438
- end
439
- end
440
-
441
- it "should produce diff output when the file does not exist yet, but suppress reporting it" do
442
- Tempfile.open("some-temp") do |file|
443
- @resource.path(file.path)
444
- file.close
445
- file.unlink
446
- @provider = Chef::Provider::File.new(@resource, @run_context)
447
- @provider.load_current_resource
448
- result = @provider.diff_current_from_content "foo baz"
449
- result.length.should == 4
450
- @resource.diff.should be_nil
451
- end
452
- end
453
-
454
- it "should not produce a diff when the current resource file is above the filesize threshold" do
455
- Chef::Config[:diff_filesize_threshold] = 5
456
- Tempfile.open("some-temp") do |file|
457
- @resource.path(file.path)
458
- file.puts("this is a line which is longer than 5 characters")
459
- file.flush
460
- @provider = Chef::Provider::File.new(@resource, @run_context)
461
- @provider.load_current_resource
462
- result = @provider.diff_current_from_content "foo" # not longer than 5
463
- result.should == [ "(file sizes exceed 5 bytes, diff output suppressed)" ]
464
- @resource.diff.should be_nil
465
- end
466
- end
467
-
468
- it "should not produce a diff when the new content is above the filesize threshold" do
469
- Chef::Config[:diff_filesize_threshold] = 5
470
- Tempfile.open("some-temp") do |file|
471
- @resource.path(file.path)
472
- file.puts("foo")
473
- file.flush
474
- @provider = Chef::Provider::File.new(@resource, @run_context)
475
- @provider.load_current_resource
476
- result = @provider.diff_current_from_content "this is a line that is longer than 5 characters"
477
- result.should == [ "(file sizes exceed 5 bytes, diff output suppressed)" ]
478
- @resource.diff.should be_nil
479
- end
480
- end
481
-
482
- it "should not produce a diff when the generated diff size is above the diff size threshold" do
483
- Chef::Config[:diff_output_threshold] = 5
484
- Tempfile.open("some-temp") do |file|
485
- @resource.path(file.path)
486
- file.puts("some text to increase the size of the diff")
487
- file.flush
488
- @provider = Chef::Provider::File.new(@resource, @run_context)
489
- @provider.load_current_resource
490
- result = @provider.diff_current_from_content "this is a line that is longer than 5 characters"
491
- result.should == [ "(long diff of over 5 characters, diff output suppressed)" ]
492
- @resource.diff.should be_nil
493
- end
494
- end
495
-
496
- it "should return valid diff output when content does not match the string content provided" do
497
- Tempfile.open("some-temp") do |file|
498
- @resource.path file.path
499
- @provider = Chef::Provider::File.new(@resource, @run_context)
500
- @provider.load_current_resource
501
- result = @provider.diff_current_from_content "foo baz"
502
- # remove the file name info which varies.
503
- result.shift(2)
504
- # Result appearance seems to vary slightly under solaris diff
505
- # So we'll compare the second line which is common to both.
506
- # Solaris: -1,1 +1,0 @@, "+foo baz"
507
- # Linux/Mac: -1,0, +1 @@, "+foo baz"
508
- result.length.should == 2
509
- result[1].should == "+foo baz"
510
- @resource.diff.should_not be_nil
511
- end
512
- end
513
- end
53
+ it_behaves_like Chef::Provider::File
514
54
  end
55
+