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,48 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/chef_fs/file_system/file_system_error'
20
+
21
+ class Chef
22
+ module ChefFS
23
+ module FileSystem
24
+ class OperationNotAllowedError < FileSystemError
25
+ def initialize(operation, entry, cause = nil)
26
+ super(entry, cause)
27
+ @operation = operation
28
+ end
29
+
30
+ attr_reader :operation
31
+ attr_reader :entry
32
+
33
+ def reason
34
+ case operation
35
+ when :delete
36
+ "cannot be deleted"
37
+ when :write
38
+ "cannot be updated"
39
+ when :create_child
40
+ "cannot have a child created under it"
41
+ when :read
42
+ "cannot be read"
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -24,12 +24,14 @@ class Chef
24
24
  module ChefFS
25
25
  module FileSystem
26
26
  class RestListDir < BaseFSDir
27
- def initialize(name, parent, api_path = nil)
27
+ def initialize(name, parent, api_path = nil, data_handler = nil)
28
28
  super(name, parent)
29
29
  @api_path = api_path || (parent.api_path == "" ? name : "#{parent.api_path}/#{name}")
30
+ @data_handler = data_handler
30
31
  end
31
32
 
32
33
  attr_reader :api_path
34
+ attr_reader :data_handler
33
35
 
34
36
  def child(name)
35
37
  result = @children.select { |child| child.name == name }.first if @children
@@ -43,28 +45,55 @@ class Chef
43
45
 
44
46
  def children
45
47
  begin
46
- @children ||= rest.get_rest(api_path).keys.map do |key|
48
+ @children ||= Chef::ChefFS::RawRequest.raw_json(rest, api_path).keys.sort.map do |key|
47
49
  _make_child_entry("#{key}.json", true)
48
50
  end
49
- rescue Net::HTTPServerException
51
+ rescue Timeout::Error => e
52
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e), "Timeout retrieving children: #{e}"
53
+ rescue Net::HTTPServerException => e
50
54
  if $!.response.code == "404"
51
- raise Chef::ChefFS::FileSystem::NotFoundError.new($!), "#{path_for_printing} not found"
55
+ raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
52
56
  else
53
- raise
57
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:children, self, e), "HTTP error retrieving children: #{e}"
54
58
  end
55
59
  end
56
60
  end
57
61
 
58
- # NOTE if you change this significantly, you will likely need to change
59
- # DataBagDir.create_child as well.
60
62
  def create_child(name, file_contents)
61
- json = Chef::JSONCompat.from_json(file_contents).to_hash
62
- base_name = name[0,name.length-5]
63
- if json.include?('name') && json['name'] != base_name
64
- raise "Name in #{path_for_printing}/#{name} must be '#{base_name}' (is '#{json['name']}')"
63
+ begin
64
+ object = JSON.parse(file_contents, :create_additions => false)
65
+ rescue JSON::ParserError => e
66
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self, e), "Parse error reading JSON creating child '#{name}': #{e}"
65
67
  end
66
- rest.post_rest(api_path, json)
67
- _make_child_entry(name, true)
68
+
69
+ result = _make_child_entry(name, true)
70
+
71
+ if data_handler
72
+ object = data_handler.normalize_for_post(object, result)
73
+ data_handler.verify_integrity(object, result) do |error|
74
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self), "Error creating '#{name}': #{error}"
75
+ end
76
+ end
77
+
78
+ begin
79
+ rest.post_rest(api_path, object)
80
+ rescue Timeout::Error => e
81
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self, e), "Timeout creating '#{name}': #{e}"
82
+ rescue Net::HTTPServerException => e
83
+ if e.response.code == "404"
84
+ raise Chef::ChefFS::FileSystem::NotFoundError.new(self, e)
85
+ elsif $!.response.code == "409"
86
+ raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, self, e), "Failure creating '#{name}': #{path}/#{name} already exists"
87
+ else
88
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:create_child, self, e), "Failure creating '#{name}': #{e.message}"
89
+ end
90
+ end
91
+
92
+ result
93
+ end
94
+
95
+ def org
96
+ parent.org
68
97
  end
69
98
 
70
99
  def environment
@@ -18,6 +18,8 @@
18
18
 
19
19
  require 'chef/chef_fs/file_system/base_fs_object'
20
20
  require 'chef/chef_fs/file_system/not_found_error'
21
+ require 'chef/chef_fs/file_system/operation_failed_error'
22
+ require 'chef/chef_fs/raw_request'
21
23
  require 'chef/role'
22
24
  require 'chef/node'
23
25
 
@@ -30,14 +32,25 @@ class Chef
30
32
  @exists = exists
31
33
  end
32
34
 
33
- def api_path
35
+ def data_handler
36
+ parent.data_handler
37
+ end
38
+
39
+ def api_child_name
34
40
  if name.length < 5 || name[-5,5] != ".json"
35
41
  raise "Invalid name #{path}: must end in .json"
36
42
  end
37
- api_child_name = name[0,name.length-5]
43
+ name[0,name.length-5]
44
+ end
45
+
46
+ def api_path
38
47
  "#{parent.api_path}/#{api_child_name}"
39
48
  end
40
49
 
50
+ def org
51
+ parent.org
52
+ end
53
+
41
54
  def environment
42
55
  parent.environment
43
56
  end
@@ -56,45 +69,76 @@ class Chef
56
69
  def delete(recurse)
57
70
  begin
58
71
  rest.delete_rest(api_path)
59
- rescue Net::HTTPServerException
60
- if $!.response.code == "404"
61
- raise Chef::ChefFS::FileSystem::NotFoundError.new($!), "#{path_for_printing} not found"
72
+ rescue Timeout::Error => e
73
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:delete, self, e), "Timeout deleting: #{e}"
74
+ rescue Net::HTTPServerException => e
75
+ if e.response.code == "404"
76
+ raise Chef::ChefFS::FileSystem::NotFoundError.new(self, e)
62
77
  else
63
- raise
78
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:delete, self, e), "Timeout deleting: #{e}"
64
79
  end
65
80
  end
66
81
  end
67
82
 
68
83
  def read
69
- Chef::JSONCompat.to_json_pretty(chef_object.to_hash)
84
+ Chef::JSONCompat.to_json_pretty(_read_hash)
70
85
  end
71
86
 
72
- def chef_object
87
+ def _read_hash
73
88
  begin
74
- # REST will inflate the Chef object using json_class
75
- rest.get_rest(api_path)
76
- rescue Net::HTTPServerException
89
+ json = Chef::ChefFS::RawRequest.raw_request(rest, api_path)
90
+ rescue Timeout::Error => e
91
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:read, self, e), "Timeout reading: #{e}"
92
+ rescue Net::HTTPServerException => e
77
93
  if $!.response.code == "404"
78
- raise Chef::ChefFS::FileSystem::NotFoundError.new($!), "#{path_for_printing} not found"
94
+ raise Chef::ChefFS::FileSystem::NotFoundError.new(self, e)
79
95
  else
80
- raise
96
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:read, self, e), "HTTP error reading: #{e}"
81
97
  end
82
98
  end
99
+ # Minimize the value (get rid of defaults) so the results don't look terrible
100
+ minimize_value(JSON.parse(json, :create_additions => false))
101
+ end
102
+
103
+ def chef_object
104
+ # REST will inflate the Chef object using json_class
105
+ data_handler.json_class.json_create(read)
106
+ end
107
+
108
+ def minimize_value(value)
109
+ data_handler.minimize(data_handler.normalize(value, self), self)
83
110
  end
84
111
 
85
112
  def compare_to(other)
113
+ # TODO this pair of reads can be parallelized
114
+
115
+ # Grab the other value
86
116
  begin
87
- other_value = other.read
117
+ other_value_json = other.read
88
118
  rescue Chef::ChefFS::FileSystem::NotFoundError
89
119
  return [ nil, nil, :none ]
90
120
  end
121
+
122
+ # Grab this value
91
123
  begin
92
- value = chef_object.to_hash
124
+ value = _read_hash
93
125
  rescue Chef::ChefFS::FileSystem::NotFoundError
94
- return [ false, :none, other_value ]
126
+ return [ false, :none, other_value_json ]
95
127
  end
96
- are_same = (value == Chef::JSONCompat.from_json(other_value, :create_additions => false))
97
- [ are_same, Chef::JSONCompat.to_json_pretty(value), other_value ]
128
+
129
+ # Minimize (and normalize) both values for easy and beautiful diffs
130
+ value = minimize_value(value)
131
+ value_json = Chef::JSONCompat.to_json_pretty(value)
132
+ begin
133
+ other_value = JSON.parse(other_value_json, :create_additions => false)
134
+ rescue JSON::ParserError => e
135
+ Chef::Log.warn("Parse error reading #{other.path_for_printing} as JSON: #{e}")
136
+ return [ nil, value_json, other_value_json ]
137
+ end
138
+ other_value = minimize_value(other_value)
139
+ other_value_json = Chef::JSONCompat.to_json_pretty(other_value)
140
+
141
+ [ value == other_value, value_json, other_value_json ]
98
142
  end
99
143
 
100
144
  def rest
@@ -102,18 +146,28 @@ class Chef
102
146
  end
103
147
 
104
148
  def write(file_contents)
105
- json = Chef::JSONCompat.from_json(file_contents).to_hash
106
- base_name = name[0,name.length-5]
107
- if json['name'] != base_name
108
- raise "Name in #{path_for_printing}/#{name} must be '#{base_name}' (is '#{json['name']}')"
149
+ begin
150
+ object = JSON.parse(file_contents, :create_additions => false)
151
+ rescue JSON::ParserError => e
152
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:write, self, e), "Parse error reading JSON: #{e}"
153
+ end
154
+
155
+ if data_handler
156
+ object = data_handler.normalize_for_put(object, self)
157
+ data_handler.verify_integrity(object, self) do |error|
158
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:write, self), "#{error}"
159
+ end
109
160
  end
161
+
110
162
  begin
111
- rest.put_rest(api_path, json)
112
- rescue Net::HTTPServerException
113
- if $!.response.code == "404"
114
- raise Chef::ChefFS::FileSystem::NotFoundError.new($!), "#{path_for_printing} not found"
163
+ rest.put_rest(api_path, object)
164
+ rescue Timeout::Error => e
165
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:write, self, e), "Timeout writing: #{e}"
166
+ rescue Net::HTTPServerException => e
167
+ if e.response.code == "404"
168
+ raise Chef::ChefFS::FileSystem::NotFoundError.new(self, e)
115
169
  else
116
- raise
170
+ raise Chef::ChefFS::FileSystem::OperationFailedError.new(:write, self, e), "HTTP error writing: #{e}"
117
171
  end
118
172
  end
119
173
  end
@@ -16,52 +16,74 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'chef/chef_fs/file_system/chef_server_root_dir'
20
- require 'chef/chef_fs/file_system/chef_repository_file_system_root_dir'
21
- require 'chef/chef_fs/file_pattern'
22
- require 'chef/chef_fs/path_utils'
23
- require 'chef/config'
19
+ require 'chef/knife'
24
20
 
25
21
  class Chef
26
22
  module ChefFS
27
23
  class Knife < Chef::Knife
28
- def self.common_options
24
+ # Workaround for CHEF-3932
25
+ def self.deps
26
+ super do
27
+ require 'chef/config'
28
+ require 'chef/chef_fs/parallelizer'
29
+ require 'chef/chef_fs/config'
30
+ require 'chef/chef_fs/file_pattern'
31
+ require 'chef/chef_fs/path_utils'
32
+ yield
33
+ end
34
+ end
35
+
36
+ def self.inherited(c)
37
+ super
38
+ # Ensure we always get to do our includes, whether subclass calls deps or not
39
+ c.deps do
40
+ end
41
+
29
42
  option :repo_mode,
30
43
  :long => '--repo-mode MODE',
31
- :default => "default",
32
- :description => "Specifies the local repository layout. Values: default or full"
44
+ :description => "Specifies the local repository layout. Values: static, everything, hosted_everything. Default: everything/hosted_everything"
45
+
46
+ option :chef_repo_path,
47
+ :long => '--chef-repo-path PATH',
48
+ :description => 'Overrides the location of chef repo. Default is specified by chef_repo_path in the config'
49
+
50
+ option :concurrency,
51
+ :long => '--concurrency THREADS',
52
+ :description => 'Maximum number of simultaneous requests to send (default: 10)'
33
53
  end
34
54
 
35
- def base_path
36
- @base_path ||= begin
37
- relative_to_base = Chef::ChefFS::PathUtils::relative_to(File.expand_path(Dir.pwd), chef_repo)
38
- relative_to_base == '.' ? '/' : "/#{relative_to_base}"
55
+ def configure_chef
56
+ super
57
+ Chef::Config[:repo_mode] = config[:repo_mode] if config[:repo_mode]
58
+ Chef::Config[:concurrency] = config[:concurrency].to_i if config[:concurrency]
59
+
60
+ # --chef-repo-path overrides all other paths
61
+ if config[:chef_repo_path]
62
+ Chef::Config[:chef_repo_path] = config[:chef_repo_path]
63
+ Chef::ChefFS::Config::PATH_VARIABLES.each do |variable_name|
64
+ Chef::Config[variable_name.to_sym] = chef_repo_paths.map { |path| File.join(path, "#{variable_name[0..-6]}s") }
65
+ end
39
66
  end
67
+
68
+ @chef_fs_config = Chef::ChefFS::Config.new(Chef::Config)
69
+
70
+ Chef::ChefFS::Parallelizer.threads = (Chef::Config[:concurrency] || 10) - 1
40
71
  end
41
72
 
42
73
  def chef_fs
43
- @chef_fs ||= Chef::ChefFS::FileSystem::ChefServerRootDir.new("remote", Chef::Config, config[:repo_mode])
74
+ @chef_fs_config.chef_fs
44
75
  end
45
76
 
46
- def chef_repo
47
- @chef_repo ||= File.expand_path(File.join(Chef::Config.cookbook_path, ".."))
77
+ def create_chef_fs
78
+ @chef_fs_config.create_chef_fs
48
79
  end
49
80
 
50
- def format_path(path)
51
- if path[0,base_path.length] == base_path
52
- if path == base_path
53
- return "."
54
- elsif path[base_path.length] == "/"
55
- return path[base_path.length + 1, path.length - base_path.length - 1]
56
- elsif base_path == "/" && path[0] == "/"
57
- return path[1, path.length - 1]
58
- end
59
- end
60
- path
81
+ def local_fs
82
+ @chef_fs_config.local_fs
61
83
  end
62
84
 
63
- def local_fs
64
- @local_fs ||= Chef::ChefFS::FileSystem::ChefRepositoryFileSystemRootDir.new(chef_repo)
85
+ def create_local_fs
86
+ @chef_fs_config.create_local_fs
65
87
  end
66
88
 
67
89
  def pattern_args
@@ -69,9 +91,26 @@ class Chef
69
91
  end
70
92
 
71
93
  def pattern_args_from(args)
72
- args.map { |arg| Chef::ChefFS::FilePattern::relative_to(base_path, arg) }.to_a
94
+ # TODO support absolute file paths and not just patterns? Too much?
95
+ # Could be super useful in a world with multiple repo paths
96
+ args.map do |arg|
97
+ if !@chef_fs_config.base_path && !Chef::ChefFS::PathUtils.is_absolute?(arg)
98
+ # Check if chef repo path is specified to give a better error message
99
+ @chef_fs_config.require_chef_repo_path
100
+ ui.error("Attempt to use relative path '#{arg}' when current directory is outside the repository path")
101
+ exit(1)
102
+ end
103
+ Chef::ChefFS::FilePattern.relative_to(@chef_fs_config.base_path, arg)
104
+ end
73
105
  end
74
106
 
107
+ def format_path(entry)
108
+ @chef_fs_config.format_path(entry)
109
+ end
110
+
111
+ def parallelize(inputs, options = {}, &block)
112
+ Chef::ChefFS::Parallelizer.parallelize(inputs, options, &block)
113
+ end
75
114
  end
76
115
  end
77
116
  end
@@ -0,0 +1,129 @@
1
+ class Chef
2
+ module ChefFS
3
+ class Parallelizer
4
+ @@parallelizer = nil
5
+ @@threads = 0
6
+
7
+ def self.threads=(value)
8
+ if @@threads != value
9
+ @@threads = value
10
+ @@parallelizer = nil
11
+ end
12
+ end
13
+
14
+ def self.parallelize(enumerator, options = {}, &block)
15
+ @@parallelizer ||= Parallelizer.new(@@threads)
16
+ @@parallelizer.parallelize(enumerator, options, &block)
17
+ end
18
+
19
+ def initialize(threads)
20
+ @tasks_mutex = Mutex.new
21
+ @tasks = []
22
+ @threads = []
23
+ 1.upto(threads) do
24
+ @threads << Thread.new { worker_loop }
25
+ end
26
+ end
27
+
28
+ def parallelize(enumerator, options = {}, &block)
29
+ task = ParallelizedResults.new(enumerator, options, &block)
30
+ @tasks_mutex.synchronize do
31
+ @tasks << task
32
+ end
33
+ task
34
+ end
35
+
36
+ class ParallelizedResults
37
+ include Enumerable
38
+
39
+ def initialize(enumerator, options, &block)
40
+ @inputs = enumerator.to_a
41
+ @options = options
42
+ @block = block
43
+
44
+ @mutex = Mutex.new
45
+ @outputs = []
46
+ @status = []
47
+ end
48
+
49
+ def each
50
+ next_index = 0
51
+ while true
52
+ # Report any results that already exist
53
+ while @status.length > next_index && ([:finished, :exception].include?(@status[next_index]))
54
+ if @status[next_index] == :finished
55
+ if @options[:flatten]
56
+ @outputs[next_index].each do |entry|
57
+ yield entry
58
+ end
59
+ else
60
+ yield @outputs[next_index]
61
+ end
62
+ else
63
+ raise @outputs[next_index]
64
+ end
65
+ next_index = next_index + 1
66
+ end
67
+
68
+ # Pick up a result and process it, if there is one. This ensures we
69
+ # move forward even if there are *zero* worker threads available.
70
+ if !process_input
71
+ # Exit if we're done.
72
+ if next_index >= @status.length
73
+ break
74
+ else
75
+ # Ruby 1.8 threading sucks. Wait till we process more things.
76
+ sleep(0.05)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ def process_input
83
+ # Grab the next one to process
84
+ index, input = @mutex.synchronize do
85
+ index = @status.length
86
+ if index >= @inputs.length
87
+ return nil
88
+ end
89
+ input = @inputs[index]
90
+ @status[index] = :started
91
+ [ index, input ]
92
+ end
93
+
94
+ begin
95
+ @outputs[index] = @block.call(input)
96
+ @status[index] = :finished
97
+ rescue Exception
98
+ @outputs[index] = $!
99
+ @status[index] = :exception
100
+ end
101
+ index
102
+ end
103
+ end
104
+
105
+ private
106
+
107
+ def worker_loop
108
+ while true
109
+ begin
110
+ task = @tasks[0]
111
+ if task
112
+ if !task.process_input
113
+ @tasks_mutex.synchronize do
114
+ @tasks.delete(task)
115
+ end
116
+ end
117
+ else
118
+ # Ruby 1.8 threading sucks. Wait a bit to see if another task comes in.
119
+ sleep(0.05)
120
+ end
121
+ rescue
122
+ puts "ERROR #{$!}"
123
+ puts $!.backtrace
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end