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
@@ -0,0 +1,75 @@
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::RemoteFile::Fetcher do
22
+
23
+ let(:current_resource) { mock("current resource") }
24
+ let(:new_resource) { mock("new resource") }
25
+ let(:fetcher_instance) { mock("fetcher") }
26
+
27
+ describe "when passed an http url" do
28
+ let(:uri) { mock("uri", :scheme => "http" ) }
29
+ before do
30
+ Chef::Provider::RemoteFile::HTTP.should_receive(:new).and_return(fetcher_instance)
31
+ end
32
+ it "returns an http fetcher" do
33
+ described_class.for_resource(uri, new_resource, current_resource).should == fetcher_instance
34
+ end
35
+ end
36
+
37
+ describe "when passed an https url" do
38
+ let(:uri) { mock("uri", :scheme => "https" ) }
39
+ before do
40
+ Chef::Provider::RemoteFile::HTTP.should_receive(:new).and_return(fetcher_instance)
41
+ end
42
+ it "returns an http fetcher" do
43
+ described_class.for_resource(uri, new_resource, current_resource).should == fetcher_instance
44
+ end
45
+ end
46
+
47
+ describe "when passed an ftp url" do
48
+ let(:uri) { mock("uri", :scheme => "ftp" ) }
49
+ before do
50
+ Chef::Provider::RemoteFile::FTP.should_receive(:new).and_return(fetcher_instance)
51
+ end
52
+ it "returns an ftp fetcher" do
53
+ described_class.for_resource(uri, new_resource, current_resource).should == fetcher_instance
54
+ end
55
+ end
56
+
57
+ describe "when passed a file url" do
58
+ let(:uri) { mock("uri", :scheme => "file" ) }
59
+ before do
60
+ Chef::Provider::RemoteFile::LocalFile.should_receive(:new).and_return(fetcher_instance)
61
+ end
62
+ it "returns a localfile fetcher" do
63
+ described_class.for_resource(uri, new_resource, current_resource).should == fetcher_instance
64
+ end
65
+ end
66
+
67
+ describe "when passed a url we do not recognize" do
68
+ let(:uri) { mock("uri", :scheme => "xyzzy" ) }
69
+ it "throws an ArgumentError exception" do
70
+ lambda { described_class.for_resource(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
71
+ end
72
+ end
73
+
74
+ end
75
+
@@ -0,0 +1,224 @@
1
+ #
2
+ # Author:: Jesse Campbell (<hikeit@gmail.com>)
3
+ # Copyright:: Copyright (c) 2013 Jesse Campbell
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::RemoteFile::FTP do
22
+ let(:enclosing_directory) {
23
+ canonicalize_path(File.expand_path(File.join(CHEF_SPEC_DATA, "templates")))
24
+ }
25
+ let(:resource_path) {
26
+ canonicalize_path(File.expand_path(File.join(enclosing_directory, "seattle.txt")))
27
+ }
28
+
29
+ let(:new_resource) do
30
+ r = Chef::Resource::RemoteFile.new("remote file ftp backend test (new resource)")
31
+ r.ftp_active_mode(false)
32
+ r.path(resource_path)
33
+ r
34
+ end
35
+
36
+ let(:current_resource) do
37
+ Chef::Resource::RemoteFile.new("remote file ftp backend test (current resource)'")
38
+ end
39
+
40
+ let(:ftp) do
41
+ ftp = mock(Net::FTP, { })
42
+ ftp.stub!(:connect)
43
+ ftp.stub!(:login)
44
+ ftp.stub!(:voidcmd)
45
+ ftp.stub!(:mtime).and_return(Time.now)
46
+ ftp.stub!(:getbinaryfile)
47
+ ftp.stub!(:close)
48
+ ftp.stub!(:passive=)
49
+ ftp
50
+ end
51
+
52
+ let(:tempfile_path) { "/tmp/somedir/remote-file-ftp-backend-spec-test" }
53
+
54
+ let(:tempfile) do
55
+ t = StringIO.new
56
+ t.stub(:path).and_return(tempfile_path)
57
+ t
58
+ end
59
+
60
+ let(:uri) { URI.parse("ftp://opscode.com/seattle.txt") }
61
+
62
+ before(:each) do
63
+ Net::FTP.stub!(:new).with().and_return(ftp)
64
+ Tempfile.stub!(:new).and_return(tempfile)
65
+ end
66
+
67
+ describe "when first created" do
68
+
69
+ it "throws an argument exception when no path is given" do
70
+ uri.path = ""
71
+ lambda { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
72
+ end
73
+
74
+ it "throws an argument exception when only a / is given" do
75
+ uri.path = "/"
76
+ lambda { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
77
+ end
78
+
79
+ it "throws an argument exception when no filename is given" do
80
+ uri.path = "/the/whole/path/"
81
+ lambda { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
82
+ end
83
+
84
+ it "throws an argument exception when the typecode is invalid" do
85
+ uri.typecode = "d"
86
+ lambda { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }.should raise_error(ArgumentError)
87
+ end
88
+
89
+ it "does not use passive mode when new_resource sets ftp_active_mode to true" do
90
+ new_resource.ftp_active_mode(true)
91
+ fetcher = Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource)
92
+ fetcher.use_passive_mode?.should be_false
93
+ end
94
+
95
+ it "uses passive mode when new_resource sets ftp_active_mode to false" do
96
+ new_resource.ftp_active_mode(false)
97
+ fetcher = Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource)
98
+ fetcher.use_passive_mode?.should be_true
99
+ end
100
+ end
101
+
102
+ describe "when fetching the object" do
103
+
104
+ let(:cache_control_data) { Chef::Provider::RemoteFile::CacheControlData.new(uri) }
105
+ let(:current_resource_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
106
+
107
+ subject(:fetcher) { Chef::Provider::RemoteFile::FTP.new(uri, new_resource, current_resource) }
108
+
109
+ before do
110
+ current_resource.checksum(current_resource_checksum)
111
+ #Chef::Provider::RemoteFile::CacheControlData.should_receive(:load_and_validate).with(uri, current_resource_checksum).and_return(cache_control_data)
112
+ end
113
+
114
+ it "should connect to the host from the uri on the default port 21" do
115
+ ftp.should_receive(:connect).with("opscode.com", 21)
116
+ fetcher.fetch
117
+ end
118
+
119
+ it "should set passive true when ftp_active_mode is false" do
120
+ new_resource.ftp_active_mode(false)
121
+ ftp.should_receive(:passive=).with(true)
122
+ fetcher.fetch
123
+ end
124
+
125
+ it "should set passive false when ftp_active_mode is false" do
126
+ new_resource.ftp_active_mode(true)
127
+ ftp.should_receive(:passive=).with(false)
128
+ fetcher.fetch
129
+ end
130
+
131
+ it "should use anonymous ftp when no userinfo is provided" do
132
+ ftp.should_receive(:login).with("anonymous", nil)
133
+ fetcher.fetch
134
+ end
135
+
136
+ context "and the URI specifies an alternate port" do
137
+ let(:uri) { URI.parse("ftp://opscode.com:8021/seattle.txt") }
138
+
139
+ it "should connect on an alternate port when one is provided" do
140
+ uri = URI.parse("ftp://opscode.com:8021/seattle.txt")
141
+ ftp.should_receive(:connect).with("opscode.com", 8021)
142
+ fetcher.fetch
143
+ end
144
+
145
+ end
146
+
147
+ context "and the URI contains a username and password" do
148
+ let(:uri) { URI.parse("ftp://the_user:the_password@opscode.com/seattle.txt") }
149
+
150
+ it "should use authenticated ftp when userinfo is provided" do
151
+ ftp.should_receive(:login).with("the_user", "the_password")
152
+ fetcher.fetch
153
+ end
154
+ end
155
+
156
+ context "and the uri sets the typecode to ascii" do
157
+ let(:uri) { URI.parse("ftp://the_user:the_password@opscode.com/seattle.txt;type=a") }
158
+
159
+ it "fetches the file with ascii typecode set" do
160
+ ftp.should_receive(:voidcmd).with("TYPE A").once
161
+ fetcher.fetch
162
+ end
163
+
164
+ end
165
+
166
+ context "and the uri sets the typecode to image" do
167
+ let(:uri) { URI.parse("ftp://the_user:the_password@opscode.com/seattle.txt;type=i") }
168
+
169
+ it "should accept image for the typecode" do
170
+ ftp.should_receive(:voidcmd).with("TYPE I").once
171
+ fetcher.fetch
172
+ end
173
+
174
+ end
175
+
176
+ context "and the uri specifies a nested path" do
177
+ let(:uri) { URI.parse("ftp://opscode.com/the/whole/path/seattle.txt") }
178
+
179
+ it "should fetch the file from the correct path" do
180
+ ftp.should_receive(:voidcmd).with("CWD the").once
181
+ ftp.should_receive(:voidcmd).with("CWD whole").once
182
+ ftp.should_receive(:voidcmd).with("CWD path").once
183
+ ftp.should_receive(:getbinaryfile).with("seattle.txt", tempfile.path)
184
+ fetcher.fetch
185
+ end
186
+
187
+ end
188
+
189
+ context "when not using last modified based conditional fetching" do
190
+ before do
191
+ new_resource.use_last_modified(false)
192
+ end
193
+
194
+ it "should return a tempfile in the result" do
195
+ result = fetcher.fetch
196
+ result.should equal(tempfile)
197
+ end
198
+
199
+ end
200
+
201
+ context "and proxying is enabled" do
202
+ before do
203
+ @original_config = Chef::Config.hash_dup
204
+ Chef::Config[:ftp_proxy] = "socks5://socks.example.com:5000"
205
+ Chef::Config[:ftp_proxy_user] = "bill"
206
+ Chef::Config[:ftp_proxy_pass] = "ted"
207
+ end
208
+
209
+ after do
210
+ Chef::Config.configuration = @original_config
211
+ end
212
+
213
+ it "fetches the file via the proxy" do
214
+ current_socks_server = ENV["SOCKS_SERVER"]
215
+ ENV.should_receive(:[]=).with("SOCKS_SERVER", "socks5://bill:ted@socks.example.com:5000").ordered
216
+ ENV.should_receive(:[]=).with("SOCKS_SERVER", current_socks_server).ordered
217
+ result = fetcher.fetch
218
+ result.should equal(tempfile)
219
+ end
220
+
221
+ end
222
+
223
+ end
224
+ end
@@ -0,0 +1,319 @@
1
+ #
2
+ # Author:: Lamont Granquist (<lamont@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Lamont Granquist
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::RemoteFile::HTTP do
22
+
23
+ let(:uri) { URI.parse("http://opscode.com/seattle.txt") }
24
+
25
+ let(:existing_file_source) { nil }
26
+
27
+ let(:current_resource_checksum) { "41e78735319af11327e9d2ca8535ea1c191e5ac1f76bb08d88fe6c3f93a8c8e5" }
28
+
29
+ let(:current_resource) do
30
+ current_resource = Chef::Resource::RemoteFile.new("/tmp/foo.txt")
31
+ current_resource.source(existing_file_source) if existing_file_source
32
+ current_resource.checksum(current_resource_checksum)
33
+ current_resource
34
+ end
35
+
36
+ let(:new_resource) do
37
+ Chef::Resource::RemoteFile.new("/tmp/foo.txt")
38
+ end
39
+
40
+ subject(:fetcher) do
41
+ Chef::Provider::RemoteFile::HTTP.new(uri, new_resource, current_resource)
42
+ end
43
+
44
+ let(:cache_control_data) { Chef::Provider::RemoteFile::CacheControlData.new(uri) }
45
+
46
+ describe "generating cache control headers" do
47
+
48
+ context "and there is no valid cache control data for this URI on disk" do
49
+
50
+ before do
51
+ Chef::Provider::RemoteFile::CacheControlData.should_receive(:load_and_validate).with(uri, current_resource_checksum).and_return(cache_control_data)
52
+ end
53
+
54
+ it "does not add conditional GET headers" do
55
+ fetcher.conditional_get_headers.should == {}
56
+ end
57
+
58
+ context "and the resource specifies custom headers" do
59
+ before do
60
+ new_resource.headers("x-myapp-header" => "custom-header-value")
61
+ end
62
+
63
+ it "has the user-specified custom headers" do
64
+ fetcher.headers.should == {"x-myapp-header" => "custom-header-value"}
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ context "and the cache control data matches the existing file" do
71
+
72
+ # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26
73
+ let(:etag) { "\"a-strong-unique-identifier\"" }
74
+
75
+ # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3
76
+ let(:mtime) { "Tue, 21 May 2013 19:19:23 GMT" }
77
+
78
+ before do
79
+ cache_control_data.etag = etag
80
+ cache_control_data.mtime = mtime
81
+
82
+ Chef::Provider::RemoteFile::CacheControlData.should_receive(:load_and_validate).with(uri, current_resource_checksum).and_return(cache_control_data)
83
+ end
84
+
85
+ context "and no conditional get features are enabled" do
86
+ before do
87
+ new_resource.use_conditional_get(false)
88
+ end
89
+
90
+ it "does not add headers to the request" do
91
+ fetcher.headers.should == {}
92
+ end
93
+ end
94
+
95
+ context "and conditional get is enabled" do
96
+ before do
97
+ new_resource.use_conditional_get(true)
98
+ end
99
+
100
+ it "adds If-None-Match and If-Modified-Since headers to the request" do
101
+ headers = fetcher.headers
102
+ headers["if-none-match"].should == etag
103
+ headers["if-modified-since"].should == mtime
104
+ end
105
+
106
+ context "and custom headers are provided" do
107
+ before do
108
+ new_resource.headers("x-myapp-header" => "app-specific-header",
109
+ "if-none-match" => "custom-etag",
110
+ "if-modified-since" => "custom-last-modified")
111
+ end
112
+
113
+ it "preserves non-conflicting headers" do
114
+ fetcher.headers["x-myapp-header"].should == "app-specific-header"
115
+ end
116
+
117
+ it "prefers user-supplied cache control headers" do
118
+ headers = fetcher.headers
119
+ headers["if-none-match"].should == "custom-etag"
120
+ headers["if-modified-since"].should == "custom-last-modified"
121
+ end
122
+ end
123
+
124
+ end
125
+
126
+ context "and etag support is enabled" do
127
+ before do
128
+ new_resource.use_conditional_get(false)
129
+ new_resource.use_etags(true)
130
+ end
131
+
132
+ it "only adds If-None-Match headers to the request" do
133
+ headers = fetcher.headers
134
+ headers["if-none-match"].should == etag
135
+ headers.should_not have_key("if-modified-since")
136
+ end
137
+ end
138
+
139
+ context "and mtime support is enabled" do
140
+ before do
141
+ new_resource.use_conditional_get(false)
142
+ new_resource.use_last_modified(true)
143
+ end
144
+
145
+ it "only adds If-Modified-Since headers to the request" do
146
+ headers = fetcher.headers
147
+ headers["if-modified-since"].should == mtime
148
+ headers.should_not have_key("if-none-match")
149
+ end
150
+ end
151
+ end
152
+
153
+ end
154
+
155
+ describe "when fetching the uri" do
156
+
157
+ let(:expected_http_opts) { {} }
158
+ let(:expected_http_args) { [uri, nil, nil, expected_http_opts] }
159
+
160
+ let(:tempfile_path) { "/tmp/chef-mock-tempfile-abc123" }
161
+
162
+ let(:tempfile) { mock(Tempfile, :path => tempfile_path) }
163
+
164
+ let(:last_response) { {} }
165
+
166
+ let(:rest) do
167
+ rest = mock(Chef::REST)
168
+ rest.stub!(:streaming_request).and_return(tempfile)
169
+ rest.stub!(:last_response).and_return(last_response)
170
+ rest
171
+ end
172
+
173
+ before do
174
+ new_resource.headers({})
175
+ new_resource.use_last_modified(false)
176
+ Chef::Provider::RemoteFile::CacheControlData.should_receive(:load_and_validate).with(uri, current_resource_checksum).and_return(cache_control_data)
177
+
178
+ Chef::REST.should_receive(:new).with(*expected_http_args).and_return(rest)
179
+ end
180
+
181
+
182
+ describe "and the request does not return new content" do
183
+
184
+ it "should propagate non-304 exceptions to the caller" do
185
+ r = Net::HTTPBadRequest.new("one", "two", "three")
186
+ e = Net::HTTPServerException.new("fake exception", r)
187
+ rest.stub!(:streaming_request).and_raise(e)
188
+ lambda { fetcher.fetch }.should raise_error(Net::HTTPServerException)
189
+ end
190
+
191
+ it "should return HTTPRetriableError when Chef::REST returns a 301" do
192
+ r = Net::HTTPMovedPermanently.new("one", "two", "three")
193
+ e = Net::HTTPRetriableError.new("301", r)
194
+ rest.stub!(:streaming_request).and_raise(e)
195
+ lambda { fetcher.fetch }.should raise_error(Net::HTTPRetriableError)
196
+ end
197
+
198
+ it "should return a nil tempfile for a 304 HTTPNotModifed" do
199
+ r = Net::HTTPNotModified.new("one", "two", "three")
200
+ e = Net::HTTPRetriableError.new("304", r)
201
+ rest.stub!(:streaming_request).and_raise(e)
202
+ result = fetcher.fetch
203
+ result.should be_nil
204
+ end
205
+
206
+ end
207
+
208
+ describe "and the request returns new content" do
209
+
210
+ let(:fetched_content_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
211
+
212
+ before do
213
+ cache_control_data.should_receive(:save)
214
+ Chef::Digester.should_receive(:checksum_for_file).with(tempfile_path).and_return(fetched_content_checksum)
215
+ end
216
+
217
+ it "should return a tempfile" do
218
+ result = fetcher.fetch
219
+ result.should == tempfile
220
+ cache_control_data.etag.should be_nil
221
+ cache_control_data.mtime.should be_nil
222
+ cache_control_data.checksum.should == fetched_content_checksum
223
+ end
224
+
225
+ context "and the response does not contain an etag" do
226
+ let(:last_response) { {"etag" => nil} }
227
+ it "does not include an etag in the result" do
228
+ fetcher.fetch
229
+ cache_control_data.etag.should be_nil
230
+ cache_control_data.mtime.should be_nil
231
+ cache_control_data.checksum.should == fetched_content_checksum
232
+ end
233
+ end
234
+
235
+ context "and the response has an etag header" do
236
+ let(:last_response) { {"etag" => "abc123"} }
237
+
238
+ it "includes the etag value in the response" do
239
+ fetcher.fetch
240
+ cache_control_data.etag.should == "abc123"
241
+ cache_control_data.mtime.should be_nil
242
+ cache_control_data.checksum.should == fetched_content_checksum
243
+ end
244
+
245
+ end
246
+
247
+ context "and the response has no Date or Last-Modified header" do
248
+ let(:last_response) { {"date" => nil, "last_modified" => nil} }
249
+ it "does not set an mtime in the result" do
250
+ # RFC 2616 suggests that servers that do not set a Date header do not
251
+ # have a reliable clock, so no use in making them deal with dates.
252
+ fetcher.fetch
253
+ cache_control_data.etag.should be_nil
254
+ cache_control_data.mtime.should be_nil
255
+ cache_control_data.checksum.should == fetched_content_checksum
256
+ end
257
+ end
258
+
259
+ context "and the response has a Last-Modified header" do
260
+ let(:last_response) do
261
+ # Last-Modified should be preferred to Date if both are set
262
+ {"date" => "Fri, 17 May 2013 23:23:23 GMT", "last_modified" => "Fri, 17 May 2013 11:11:11 GMT"}
263
+ end
264
+
265
+ it "sets the mtime to the Last-Modified time in the response" do
266
+ fetcher.fetch
267
+ cache_control_data.etag.should be_nil
268
+ cache_control_data.mtime.should == last_response["last_modified"]
269
+ end
270
+ end
271
+
272
+ context "and the response has a Date header but no Last-Modified header" do
273
+ let(:last_response) do
274
+ {"date" => "Fri, 17 May 2013 23:23:23 GMT", "last_modified" => nil}
275
+ end
276
+
277
+ it "sets the mtime to the Date in the response" do
278
+ fetcher.fetch
279
+ cache_control_data.etag.should be_nil
280
+ cache_control_data.mtime.should == last_response["date"]
281
+ cache_control_data.checksum.should == fetched_content_checksum
282
+ end
283
+
284
+ end
285
+
286
+ context "and the target file is a tarball [CHEF-3140]" do
287
+
288
+ let(:uri) { URI.parse("http://opscode.com/tarball.tgz") }
289
+ let(:expected_http_opts) { {:disable_gzip => true} }
290
+
291
+ # CHEF-3140
292
+ # Some servers return tarballs as content type tar and encoding gzip, which
293
+ # is totally wrong. When this happens and gzip isn't disabled, Chef::REST
294
+ # will decompress the file for you, which is not at all what you expected
295
+ # to happen (you end up with an uncomressed tar archive instead of the
296
+ # gzipped tar archive you expected). To work around this behavior, we
297
+ # detect when users are fetching gzipped files and turn off gzip in
298
+ # Chef::REST.
299
+
300
+ it "should disable gzip compression in the client" do
301
+ # Before block in the parent context has set an expectation on
302
+ # Chef::REST.new() being called with expected arguments. Here we fufil
303
+ # that expectation, so that we can explicitly set it for this test.
304
+ # This is intended to provide insurance that refactoring of the parent
305
+ # context does not negate the value of this particular example.
306
+ Chef::REST.new(*expected_http_args)
307
+ Chef::REST.should_receive(:new).once.with(*expected_http_args).and_return(rest)
308
+ fetcher.fetch
309
+ cache_control_data.etag.should be_nil
310
+ cache_control_data.mtime.should be_nil
311
+ cache_control_data.checksum.should == fetched_content_checksum
312
+ end
313
+ end
314
+ end
315
+
316
+ end
317
+
318
+ end
319
+