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
@@ -50,7 +50,7 @@ describe Chef::Provider::Package::Zypper do
50
50
  end
51
51
 
52
52
  it "should run zypper info with the package name" do
53
- @provider.should_receive(:popen4).with("zypper info #{@new_resource.package_name}").and_return(@status)
53
+ @provider.should_receive(:popen4).with("zypper --non-interactive info #{@new_resource.package_name}").and_return(@status)
54
54
  @provider.load_current_resource
55
55
  end
56
56
 
@@ -92,34 +92,99 @@ describe Chef::Provider::Package::Zypper do
92
92
 
93
93
  describe "install_package" do
94
94
  it "should run zypper install with the package name and version" do
95
- @provider.should_receive(:run_command).with({
96
- :command => "zypper -n --no-gpg-checks install -l emacs=1.0",
97
- })
95
+ Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(true)
96
+ @provider.should_receive(:shell_out!).with(
97
+ "zypper --non-interactive install --auto-agree-with-licenses emacs=1.0")
98
+ @provider.install_package("emacs", "1.0")
99
+ end
100
+ it "should run zypper install without gpg checks" do
101
+ Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(false)
102
+ @provider.should_receive(:shell_out!).with(
103
+ "zypper --non-interactive --no-gpg-checks install "+
104
+ "--auto-agree-with-licenses emacs=1.0")
105
+ @provider.install_package("emacs", "1.0")
106
+ end
107
+ it "should warn about gpg checks on zypper install" do
108
+ Chef::Log.should_receive(:warn).with(
109
+ /All packages will be installed without gpg signature checks/)
110
+ @provider.should_receive(:shell_out!).with(
111
+ "zypper --non-interactive --no-gpg-checks install "+
112
+ "--auto-agree-with-licenses emacs=1.0")
98
113
  @provider.install_package("emacs", "1.0")
99
114
  end
100
115
  end
101
116
 
102
117
  describe "upgrade_package" do
103
118
  it "should run zypper update with the package name and version" do
104
- @provider.should_receive(:run_command).with({
105
- :command => "zypper -n --no-gpg-checks install -l emacs=1.0",
106
- })
119
+ Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(true)
120
+ @provider.should_receive(:shell_out!).with(
121
+ "zypper --non-interactive install --auto-agree-with-licenses emacs=1.0")
122
+ @provider.upgrade_package("emacs", "1.0")
123
+ end
124
+ it "should run zypper update without gpg checks" do
125
+ Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(false)
126
+ @provider.should_receive(:shell_out!).with(
127
+ "zypper --non-interactive --no-gpg-checks install "+
128
+ "--auto-agree-with-licenses emacs=1.0")
129
+ @provider.upgrade_package("emacs", "1.0")
130
+ end
131
+ it "should warn about gpg checks on zypper upgrade" do
132
+ Chef::Log.should_receive(:warn).with(
133
+ /All packages will be installed without gpg signature checks/)
134
+ @provider.should_receive(:shell_out!).with(
135
+ "zypper --non-interactive --no-gpg-checks install "+
136
+ "--auto-agree-with-licenses emacs=1.0")
137
+ @provider.upgrade_package("emacs", "1.0")
138
+ end
139
+ it "should run zypper upgrade without gpg checks" do
140
+ @provider.should_receive(:shell_out!).with(
141
+ "zypper --non-interactive --no-gpg-checks install "+
142
+ "--auto-agree-with-licenses emacs=1.0")
143
+
107
144
  @provider.upgrade_package("emacs", "1.0")
108
145
  end
109
146
  end
110
147
 
111
148
  describe "remove_package" do
112
149
  it "should run zypper remove with the package name" do
113
- @provider.should_receive(:run_command).with({
114
- :command => "zypper -n --no-gpg-checks remove emacs=1.0",
115
- })
150
+ Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(true)
151
+ @provider.should_receive(:shell_out!).with(
152
+ "zypper --non-interactive remove emacs=1.0")
153
+ @provider.remove_package("emacs", "1.0")
154
+ end
155
+ it "should run zypper remove without gpg checks" do
156
+ Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(false)
157
+ @provider.should_receive(:shell_out!).with(
158
+ "zypper --non-interactive --no-gpg-checks remove emacs=1.0")
159
+ @provider.remove_package("emacs", "1.0")
160
+ end
161
+ it "should warn about gpg checks on zypper remove" do
162
+ Chef::Log.should_receive(:warn).with(
163
+ /All packages will be installed without gpg signature checks/)
164
+ @provider.should_receive(:shell_out!).with(
165
+ "zypper --non-interactive --no-gpg-checks remove emacs=1.0")
166
+
116
167
  @provider.remove_package("emacs", "1.0")
117
168
  end
118
169
  end
119
170
 
120
171
  describe "purge_package" do
121
172
  it "should run remove_package with the name and version" do
122
- @provider.should_receive(:remove_package).with("emacs", "1.0")
173
+ @provider.should_receive(:shell_out!).with(
174
+ "zypper --non-interactive --no-gpg-checks remove --clean-deps emacs=1.0")
175
+ @provider.purge_package("emacs", "1.0")
176
+ end
177
+ it "should run zypper purge without gpg checks" do
178
+ Chef::Config.stub(:[]).with(:zypper_check_gpg).and_return(false)
179
+ @provider.should_receive(:shell_out!).with(
180
+ "zypper --non-interactive --no-gpg-checks remove --clean-deps emacs=1.0")
181
+ @provider.purge_package("emacs", "1.0")
182
+ end
183
+ it "should warn about gpg checks on zypper purge" do
184
+ Chef::Log.should_receive(:warn).with(
185
+ /All packages will be installed without gpg signature checks/)
186
+ @provider.should_receive(:shell_out!).with(
187
+ "zypper --non-interactive --no-gpg-checks remove --clean-deps emacs=1.0")
123
188
  @provider.purge_package("emacs", "1.0")
124
189
  end
125
190
  end
@@ -131,27 +196,24 @@ describe Chef::Provider::Package::Zypper do
131
196
 
132
197
  describe "install_package" do
133
198
  it "should run zypper install with the package name and version" do
134
- @provider.should_receive(:run_command).with({
135
- :command => "zypper install -y emacs"
136
- })
199
+ @provider.should_receive(:shell_out!).with(
200
+ "zypper --no-gpg-checks install --auto-agree-with-licenses -y emacs")
137
201
  @provider.install_package("emacs", "1.0")
138
202
  end
139
203
  end
140
-
204
+
141
205
  describe "upgrade_package" do
142
206
  it "should run zypper update with the package name and version" do
143
- @provider.should_receive(:run_command).with({
144
- :command => "zypper install -y emacs"
145
- })
207
+ @provider.should_receive(:shell_out!).with(
208
+ "zypper --no-gpg-checks install --auto-agree-with-licenses -y emacs")
146
209
  @provider.upgrade_package("emacs", "1.0")
147
210
  end
148
211
  end
149
-
212
+
150
213
  describe "remove_package" do
151
214
  it "should run zypper remove with the package name" do
152
- @provider.should_receive(:run_command).with({
153
- :command => "zypper remove -y emacs"
154
- })
215
+ @provider.should_receive(:shell_out!).with(
216
+ "zypper --no-gpg-checks remove -y emacs")
155
217
  @provider.remove_package("emacs", "1.0")
156
218
  end
157
219
  end
@@ -20,10 +20,6 @@ require 'spec_helper'
20
20
 
21
21
  describe Chef::Provider::Package do
22
22
  before do
23
- #Terrible, but we need to implement a pseduo-filesystem for testing
24
- #to not have this line. Only affects updating state fields.
25
- Chef::Provider::CookbookFile.any_instance.stub(:update_new_file_state)
26
-
27
23
  @node = Chef::Node.new
28
24
  @events = Chef::EventDispatch::Dispatcher.new
29
25
  @run_context = Chef::RunContext.new(@node, {}, @events)
@@ -0,0 +1,38 @@
1
+ #
2
+ # Author:: Adam Edwards (<adamed@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
+ describe Chef::Provider::PowershellScript, "action_run" do
21
+
22
+ before(:each) do
23
+ @node = Chef::Node.new
24
+
25
+ @node.default["kernel"] = Hash.new
26
+ @node.default["kernel"][:machine] = :x86_64.to_s
27
+
28
+ @run_context = Chef::RunContext.new(@node, {}, @events)
29
+ @new_resource = Chef::Resource::PowershellScript.new('run some powershell code', @run_context)
30
+
31
+ @provider = Chef::Provider::PowershellScript.new(@new_resource, @run_context)
32
+ end
33
+
34
+ it "should set the -File flag as the last flag" do
35
+ @provider.flags.split(' ').pop.should == "-File"
36
+ end
37
+
38
+ end
@@ -28,9 +28,6 @@ end
28
28
  describe Chef::Provider::RemoteDirectory do
29
29
  before do
30
30
  Chef::FileAccessControl.any_instance.stub(:set_all)
31
- #Terrible, but we need to implement a pseduo-filesystem for testing
32
- #to not have this line. Only affects updating state fields.
33
- Chef::Provider::CookbookFile.any_instance.stub(:update_new_file_state)
34
31
 
35
32
  @resource = Chef::Resource::RemoteDirectory.new(File.join(Dir.tmpdir, "tafty"))
36
33
  # in CHEF_SPEC_DATA/cookbooks/openldap/files/default/remotedir
@@ -214,7 +211,6 @@ describe Chef::Provider::RemoteDirectory do
214
211
  ::File.open(@destination_dir + '/remotesubdir/remote_subdir_file1.txt', 'a') {|f| f.puts "blah blah blah" }
215
212
  file1md5 = Digest::MD5.hexdigest(::File.read(@destination_dir + '/remote_dir_file1.txt'))
216
213
  subdirfile1md5 = Digest::MD5.hexdigest(::File.read(@destination_dir + '/remotesubdir/remote_subdir_file1.txt'))
217
- @provider.stub!(:update_new_file_state)
218
214
  @provider.run_action(:create)
219
215
  file1md5.eql?(Digest::MD5.hexdigest(::File.read(@destination_dir + '/remote_dir_file1.txt'))).should be_true
220
216
  subdirfile1md5.eql?(Digest::MD5.hexdigest(::File.read(@destination_dir + '/remotesubdir/remote_subdir_file1.txt'))).should be_true
@@ -0,0 +1,211 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+ require 'uri'
21
+
22
+ CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH = 64
23
+ CACHE_FILE_MD5_HEX_LENGTH = 32
24
+ CACHE_FILE_JSON_FILE_EXTENSION_LENGTH = 5
25
+ CACHE_FILE_PATH_LIMIT =
26
+ CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH +
27
+ 1 +
28
+ CACHE_FILE_MD5_HEX_LENGTH +
29
+ CACHE_FILE_JSON_FILE_EXTENSION_LENGTH # {friendly}-{md5hex}.json == 102
30
+
31
+ describe Chef::Provider::RemoteFile::CacheControlData do
32
+
33
+ let(:uri) { URI.parse("http://www.google.com/robots.txt") }
34
+
35
+ subject(:cache_control_data) do
36
+ Chef::Provider::RemoteFile::CacheControlData.load_and_validate(uri, current_file_checksum)
37
+ end
38
+
39
+ let(:cache_path) { "remote_file/http___www_google_com_robots_txt-9839677abeeadf0691026e0cabca2339.json" }
40
+
41
+ # the checksum of the file we have on disk already
42
+ let(:current_file_checksum) { "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }
43
+
44
+ context "when loading data for an unknown URI" do
45
+
46
+ before do
47
+ Chef::FileCache.should_receive(:load).with(cache_path).and_raise(Chef::Exceptions::FileNotFound, "nope")
48
+ end
49
+
50
+ context "and there is no current copy of the file" do
51
+ let(:current_file_checksum) { nil }
52
+
53
+ it "returns empty cache control data" do
54
+ cache_control_data.etag.should be_nil
55
+ cache_control_data.mtime.should be_nil
56
+ end
57
+ end
58
+
59
+ it "returns empty cache control data" do
60
+ cache_control_data.etag.should be_nil
61
+ cache_control_data.mtime.should be_nil
62
+ end
63
+
64
+ context "and the URI contains a password" do
65
+
66
+ let(:uri) { URI.parse("http://bob:password@example.org/") }
67
+ let(:cache_path) { "remote_file/http___bob_XXXX_example_org_-f121caacb74c05a35bcefdf578ed5fc9.json" }
68
+
69
+ it "loads the cache data from a path based on a sanitized URI" do
70
+ Chef::Provider::RemoteFile::CacheControlData.load_and_validate(uri, current_file_checksum)
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "when loading data for a known URI" do
76
+
77
+ # the checksum of the file last we fetched it.
78
+ let(:last_fetched_checksum) { "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }
79
+
80
+ let(:etag) { "\"a-strong-identifier\"" }
81
+ let(:mtime) { "Tue, 21 May 2013 19:19:23 GMT" }
82
+
83
+ let(:cache_json_data) do
84
+ cache = {}
85
+ cache["etag"] = etag
86
+ cache["mtime"] = mtime
87
+ cache["checksum"] = last_fetched_checksum
88
+ cache.to_json
89
+ end
90
+
91
+ before do
92
+ Chef::FileCache.should_receive(:load).with(cache_path).and_return(cache_json_data)
93
+ end
94
+
95
+ context "and there is no on-disk copy of the file" do
96
+ let(:current_file_checksum) { nil }
97
+
98
+ it "returns empty cache control data" do
99
+ cache_control_data.etag.should be_nil
100
+ cache_control_data.mtime.should be_nil
101
+ end
102
+ end
103
+
104
+ context "and the cached checksum does not match the on-disk copy" do
105
+ let(:current_file_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
106
+
107
+ it "returns empty cache control data" do
108
+ cache_control_data.etag.should be_nil
109
+ cache_control_data.mtime.should be_nil
110
+ end
111
+ end
112
+
113
+ context "and the cached checksum matches the on-disk copy" do
114
+
115
+ it "populates the cache control data" do
116
+ cache_control_data.etag.should == etag
117
+ cache_control_data.mtime.should == mtime
118
+ end
119
+ end
120
+
121
+ context "and the cached checksum data is corrupted" do
122
+ let(:cache_json_data) { '{"foo",,"bar" []}' }
123
+
124
+ it "returns empty cache control data" do
125
+ cache_control_data.etag.should be_nil
126
+ cache_control_data.mtime.should be_nil
127
+ end
128
+ end
129
+ end
130
+
131
+ describe "when saving to disk" do
132
+
133
+ let(:etag) { "\"a-strong-identifier\"" }
134
+ let(:mtime) { "Tue, 21 May 2013 19:19:23 GMT" }
135
+ let(:fetched_file_checksum) { "e2a8938cc31754f6c067b35aab1d0d4864272e9bf8504536ef3e79ebf8432305" }
136
+
137
+ let(:expected_serialization_data) do
138
+ data = {}
139
+ data["etag"] = etag
140
+ data["mtime"] = mtime
141
+ data["checksum"] = fetched_file_checksum
142
+ data
143
+ end
144
+
145
+ before do
146
+ cache_control_data.etag = etag
147
+ cache_control_data.mtime = mtime
148
+ cache_control_data.checksum = fetched_file_checksum
149
+ end
150
+
151
+ it "serializes its attributes to JSON" do
152
+ # we have to test this separately because ruby 1.8 hash order is unstable
153
+ # so we can't count on the order of the keys in the json format.
154
+
155
+ json_data = cache_control_data.json_data
156
+ Chef::JSONCompat.from_json(json_data).should == expected_serialization_data
157
+ end
158
+
159
+ it "writes data to the cache" do
160
+ json_data = cache_control_data.json_data
161
+ Chef::FileCache.should_receive(:store).with(cache_path, json_data)
162
+ cache_control_data.save
163
+ end
164
+
165
+ context "and the URI contains a password" do
166
+
167
+ let(:uri) { URI.parse("http://bob:password@example.org/") }
168
+ let(:cache_path) { "remote_file/http___bob_XXXX_example_org_-f121caacb74c05a35bcefdf578ed5fc9.json" }
169
+
170
+ it "writes the data to the cache with a sanitized path name" do
171
+ json_data = cache_control_data.json_data
172
+ Chef::FileCache.should_receive(:store).with(cache_path, json_data)
173
+ cache_control_data.save
174
+ end
175
+ end
176
+
177
+ # Cover the very long remote file path case -- see CHEF-4422 where
178
+ # local cache file names generated from the long uri exceeded
179
+ # local file system path limits resulting in exceptions from
180
+ # file system API's on both Windows and Unix systems.
181
+ context "and the URI results in a file cache path that exceeds #{CACHE_FILE_PATH_LIMIT} characters in length" do
182
+ let(:long_remote_path) { "http://www.bing.com/" + ('0' * (CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH * 2 )) }
183
+ let(:uri) { URI.parse(long_remote_path) }
184
+ let(:truncated_remote_uri) { URI.parse(long_remote_path[0...CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH]) }
185
+ let(:truncated_file_cache_path) do
186
+ cache_control_data_truncated = Chef::Provider::RemoteFile::CacheControlData.load_and_validate(truncated_remote_uri, current_file_checksum)
187
+ cache_control_data_truncated.send('sanitized_cache_file_basename')[0...CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH]
188
+ end
189
+
190
+ it "truncates the file cache path to 102 characters" do
191
+ normalized_cache_path = cache_control_data.send('sanitized_cache_file_basename')
192
+
193
+ Chef::FileCache.should_receive(:store).with("remote_file/" + normalized_cache_path, cache_control_data.json_data)
194
+
195
+ cache_control_data.save
196
+
197
+ normalized_cache_path.length.should == CACHE_FILE_PATH_LIMIT
198
+ end
199
+
200
+ it "uses a file cache path that starts with the first #{CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH} characters of the URI" do
201
+ normalized_cache_path = cache_control_data.send('sanitized_cache_file_basename')
202
+
203
+ truncated_file_cache_path.length.should == CACHE_FILE_TRUNCATED_FRIENDLY_FILE_NAME_LENGTH
204
+ normalized_cache_path.start_with?(truncated_file_cache_path).should == true
205
+ end
206
+ end
207
+
208
+ end
209
+
210
+ end
211
+
@@ -0,0 +1,230 @@
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::Content do
22
+
23
+ #
24
+ # mock setup
25
+ #
26
+
27
+ let(:current_resource) do
28
+ Chef::Resource::RemoteFile.new("remote-file-content-spec (current resource)")
29
+ end
30
+
31
+ let(:source) { [ "http://opscode.com/seattle.txt" ] }
32
+
33
+ let(:new_resource) do
34
+ r = Chef::Resource::RemoteFile.new("remote-file-content-spec (current resource)")
35
+ r.source(source)
36
+ r
37
+ end
38
+
39
+ let(:run_context) { mock("Chef::RunContext") }
40
+
41
+ #
42
+ # subject
43
+ #
44
+ let(:content) do
45
+ Chef::Provider::RemoteFile::Content.new(new_resource, current_resource, run_context)
46
+ end
47
+
48
+ describe "when the checksum of the current_resource matches the checksum set on the resource" do
49
+ before do
50
+ new_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
51
+ current_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
52
+ end
53
+
54
+ it "should return nil for the tempfile" do
55
+ content.tempfile.should be_nil
56
+ end
57
+
58
+ it "should not call any fetcher" do
59
+ Chef::Provider::RemoteFile::Fetcher.should_not_receive(:for_resource)
60
+ end
61
+ end
62
+
63
+ describe "when the checksum of the current_resource is a partial match for the checksum set on the resource" do
64
+ before do
65
+ new_resource.stub!(:checksum).and_return("0fd012fd")
66
+ current_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
67
+ end
68
+
69
+ it "should return nil for the tempfile" do
70
+ content.tempfile.should be_nil
71
+ end
72
+
73
+ it "should not call any fetcher" do
74
+ Chef::Provider::RemoteFile::Fetcher.should_not_receive(:for_resource)
75
+ end
76
+ end
77
+
78
+ shared_examples_for "the resource needs fetching" do
79
+ before do
80
+ # FIXME: test one or the other nil, test both not nil and not equal, abuse the regexp a little
81
+ @uri = mock("URI")
82
+ URI.should_receive(:parse).with(new_resource.source[0]).and_return(@uri)
83
+ end
84
+
85
+ describe "when the fetcher returns nil for the tempfile" do
86
+ before do
87
+ http_fetcher = mock("Chef::Provider::RemoteFile::HTTP", :fetch => nil)
88
+ Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri, new_resource, current_resource).and_return(http_fetcher)
89
+ end
90
+
91
+ it "should return nil for the tempfile" do
92
+ content.tempfile.should be_nil
93
+ end
94
+ end
95
+
96
+ describe "when the fetcher returns a valid tempfile" do
97
+
98
+ let(:mtime) { Time.now }
99
+ let(:tempfile) { mock("Tempfile") }
100
+ let(:http_fetcher) { mock("Chef::Provider::RemoteFile::HTTP", :fetch => tempfile) }
101
+
102
+ before do
103
+ Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri, new_resource, current_resource).and_return(http_fetcher)
104
+ end
105
+
106
+ it "should return the tempfile object to the caller" do
107
+ content.tempfile.should == tempfile
108
+ end
109
+
110
+ end
111
+ end
112
+ describe "when the checksum are both nil" do
113
+ before do
114
+ new_resource.checksum.should be_nil
115
+ current_resource.checksum.should be_nil
116
+ end
117
+ it_behaves_like "the resource needs fetching"
118
+ end
119
+
120
+ describe "when the current_resource checksum is nil" do
121
+ before do
122
+ new_resource.stub!(:checksum).and_return("fd012fd")
123
+ current_resource.stub!(:checksum).and_return(nil)
124
+ end
125
+ it_behaves_like "the resource needs fetching"
126
+ end
127
+
128
+ describe "when the new_resource checksum is nil" do
129
+ before do
130
+ new_resource.stub!(:checksum).and_return(nil)
131
+ current_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
132
+ end
133
+ it_behaves_like "the resource needs fetching"
134
+ end
135
+
136
+ describe "when the checksums are a partial match, but not to the leading portion" do
137
+ before do
138
+ new_resource.stub!(:checksum).and_return("fd012fd")
139
+ current_resource.stub!(:checksum).and_return("0fd012fdc96e96f8f7cf2046522a54aed0ce470224513e45da6bc1a17a4924aa")
140
+ end
141
+ it_behaves_like "the resource needs fetching"
142
+ end
143
+
144
+
145
+ describe "when the fetcher throws an exception" do
146
+ before do
147
+ new_resource.stub!(:checksum).and_return(nil)
148
+ current_resource.stub!(:checksum).and_return(nil)
149
+ @uri = mock("URI")
150
+ URI.should_receive(:parse).with(new_resource.source[0]).and_return(@uri)
151
+ http_fetcher = mock("Chef::Provider::RemoteFile::HTTP")
152
+ http_fetcher.should_receive(:fetch).and_raise(Errno::ECONNREFUSED)
153
+ Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri, new_resource, current_resource).and_return(http_fetcher)
154
+ end
155
+
156
+ it "should propagate the error back to the caller" do
157
+ lambda { content.tempfile }.should raise_error(Errno::ECONNREFUSED)
158
+ end
159
+ end
160
+
161
+ describe "when there is an array of sources and the first fails" do
162
+
163
+ let(:source) { [ "http://opscode.com/seattle.txt", "http://opscode.com/nyc.txt" ] }
164
+ before do
165
+ new_resource.stub!(:checksum).and_return(nil)
166
+ current_resource.stub!(:checksum).and_return(nil)
167
+ @uri0 = mock("URI0")
168
+ @uri1 = mock("URI1")
169
+ URI.should_receive(:parse).with(new_resource.source[0]).and_return(@uri0)
170
+ URI.should_receive(:parse).with(new_resource.source[1]).and_return(@uri1)
171
+ @http_fetcher_throws_exception = mock("Chef::Provider::RemoteFile::HTTP")
172
+ @http_fetcher_throws_exception.should_receive(:fetch).at_least(:once).and_raise(Errno::ECONNREFUSED)
173
+ Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri0, new_resource, current_resource).and_return(@http_fetcher_throws_exception)
174
+ end
175
+
176
+ describe "when the second url succeeds" do
177
+ before do
178
+ @tempfile = mock("Tempfile")
179
+ mtime = Time.now
180
+ http_fetcher_works = mock("Chef::Provider::RemoteFile::HTTP", :fetch => @tempfile)
181
+ Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri1, new_resource, current_resource).and_return(http_fetcher_works)
182
+ end
183
+
184
+ it "should return a valid tempfile" do
185
+ content.tempfile.should == @tempfile
186
+ end
187
+
188
+ it "should not mutate the new_resource" do
189
+ content.tempfile
190
+ new_resource.source.length.should == 2
191
+ end
192
+ end
193
+
194
+ describe "when both urls fail" do
195
+ before do
196
+ Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri1, new_resource, current_resource).and_return(@http_fetcher_throws_exception)
197
+ end
198
+
199
+ it "should propagate the error back to the caller" do
200
+ lambda { content.tempfile }.should raise_error(Errno::ECONNREFUSED)
201
+ end
202
+ end
203
+ end
204
+
205
+ describe "when there is an array of sources and the first succeeds" do
206
+ let(:source) { [ "http://opscode.com/seattle.txt", "http://opscode.com/nyc.txt" ] }
207
+ before do
208
+ new_resource.stub!(:checksum).and_return(nil)
209
+ current_resource.stub!(:checksum).and_return(nil)
210
+ @uri0 = mock("URI0")
211
+ URI.should_receive(:parse).with(new_resource.source[0]).and_return(@uri0)
212
+ URI.should_not_receive(:parse).with(new_resource.source[1])
213
+ @tempfile = mock("Tempfile")
214
+ mtime = Time.now
215
+ http_fetcher_works = mock("Chef::Provider::RemoteFile::HTTP", :fetch => @tempfile)
216
+ Chef::Provider::RemoteFile::Fetcher.should_receive(:for_resource).with(@uri0, new_resource, current_resource).and_return(http_fetcher_works)
217
+ end
218
+
219
+ it "should return a valid tempfile" do
220
+ content.tempfile.should == @tempfile
221
+ end
222
+
223
+ it "should not mutate the new_resource" do
224
+ content.tempfile
225
+ new_resource.source.length.should == 2
226
+ end
227
+ end
228
+
229
+ end
230
+