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,40 @@
1
+ require 'chef/chef_fs/data_handler/data_handler_base'
2
+ require 'chef/environment'
3
+
4
+ class Chef
5
+ module ChefFS
6
+ module DataHandler
7
+ class EnvironmentDataHandler < DataHandlerBase
8
+ def normalize(environment, entry)
9
+ normalize_hash(environment, {
10
+ 'name' => remove_dot_json(entry.name),
11
+ 'description' => '',
12
+ 'cookbook_versions' => {},
13
+ 'default_attributes' => {},
14
+ 'override_attributes' => {},
15
+ 'json_class' => 'Chef::Environment',
16
+ 'chef_type' => 'environment'
17
+ })
18
+ end
19
+
20
+ def preserve_key(key)
21
+ return key == 'name'
22
+ end
23
+
24
+ def chef_class
25
+ Chef::Environment
26
+ end
27
+
28
+ def to_ruby(object)
29
+ result = to_ruby_keys(object, %w(name description default_attributes override_attributes))
30
+ if object['cookbook_versions']
31
+ object['cookbook_versions'].each_pair do |name, version|
32
+ result << "cookbook #{name.inspect}, #{version.inspect}"
33
+ end
34
+ end
35
+ result
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,51 @@
1
+ require 'chef/chef_fs/data_handler/data_handler_base'
2
+ require 'chef/api_client'
3
+
4
+ class Chef
5
+ module ChefFS
6
+ module DataHandler
7
+ class GroupDataHandler < DataHandlerBase
8
+ def normalize(group, entry)
9
+ defaults = {
10
+ 'name' => remove_dot_json(entry.name),
11
+ 'groupname' => remove_dot_json(entry.name),
12
+ 'users' => [],
13
+ 'clients' => [],
14
+ 'groups' => [],
15
+ }
16
+ if entry.org
17
+ defaults['orgname'] = entry.org
18
+ end
19
+ result = normalize_hash(group, defaults)
20
+ if result['actors'] && result['actors'].sort.uniq == (result['users'] + result['clients']).sort.uniq
21
+ result.delete('actors')
22
+ end
23
+ result
24
+ end
25
+
26
+ def normalize_for_put(group, entry)
27
+ result = super(group, entry)
28
+ result['actors'] = {
29
+ 'users' => result['users'],
30
+ 'clients' => result['clients'],
31
+ 'groups' => result['groups']
32
+ }
33
+ result.delete('users')
34
+ result.delete('clients')
35
+ result.delete('groups')
36
+ result
37
+ end
38
+
39
+ def preserve_key(key)
40
+ return key == 'name'
41
+ end
42
+
43
+ def chef_class
44
+ Chef::ApiClient
45
+ end
46
+
47
+ # There is no Ruby API for Chef::ApiClient
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,36 @@
1
+ require 'chef/chef_fs/data_handler/data_handler_base'
2
+ require 'chef/node'
3
+
4
+ class Chef
5
+ module ChefFS
6
+ module DataHandler
7
+ class NodeDataHandler < DataHandlerBase
8
+ def normalize(node, entry)
9
+ result = normalize_hash(node, {
10
+ 'name' => remove_dot_json(entry.name),
11
+ 'json_class' => 'Chef::Node',
12
+ 'chef_type' => 'node',
13
+ 'chef_environment' => '_default',
14
+ 'override' => {},
15
+ 'normal' => {},
16
+ 'default' => {},
17
+ 'automatic' => {},
18
+ 'run_list' => []
19
+ })
20
+ result['run_list'] = normalize_run_list(result['run_list'])
21
+ result
22
+ end
23
+
24
+ def preserve_key(key)
25
+ return key == 'name'
26
+ end
27
+
28
+ def chef_class
29
+ Chef::Node
30
+ end
31
+
32
+ # Nodes do not support .rb files
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ require 'chef/chef_fs/data_handler/data_handler_base'
2
+ require 'chef/role'
3
+
4
+ class Chef
5
+ module ChefFS
6
+ module DataHandler
7
+ class RoleDataHandler < DataHandlerBase
8
+ def normalize(role, entry)
9
+ result = normalize_hash(role, {
10
+ 'name' => remove_dot_json(entry.name),
11
+ 'description' => '',
12
+ 'json_class' => 'Chef::Role',
13
+ 'chef_type' => 'role',
14
+ 'default_attributes' => {},
15
+ 'override_attributes' => {},
16
+ 'run_list' => [],
17
+ 'env_run_lists' => {}
18
+ })
19
+ result['run_list'] = normalize_run_list(result['run_list'])
20
+ result['env_run_lists'].each_pair do |env, run_list|
21
+ result['env_run_lists'][env] = normalize_run_list(run_list)
22
+ end
23
+ result
24
+ end
25
+
26
+ def preserve_key(key)
27
+ return key == 'name'
28
+ end
29
+
30
+ def chef_class
31
+ Chef::Role
32
+ end
33
+
34
+ def to_ruby(object)
35
+ to_ruby_keys(object, %w(name description default_attributes override_attributes run_list env_run_lists))
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,27 @@
1
+ require 'chef/chef_fs/data_handler/data_handler_base'
2
+
3
+ class Chef
4
+ module ChefFS
5
+ module DataHandler
6
+ class UserDataHandler < DataHandlerBase
7
+ def normalize(user, entry)
8
+ normalize_hash(user, {
9
+ 'name' => remove_dot_json(entry.name),
10
+ 'admin' => false,
11
+ 'json_class' => 'Chef::WebUIUser',
12
+ 'chef_type' => 'webui_user',
13
+ 'salt' => nil,
14
+ 'password' => nil,
15
+ 'openid' => nil
16
+ })
17
+ end
18
+
19
+ def preserve_key(key)
20
+ return key == 'name'
21
+ end
22
+
23
+ # There is no chef_class for users, nor does to_ruby work.
24
+ end
25
+ end
26
+ end
27
+ end
@@ -17,40 +17,63 @@
17
17
  #
18
18
 
19
19
  require 'chef/chef_fs/path_utils'
20
+ require 'chef/chef_fs/file_system/default_environment_cannot_be_modified_error'
21
+ require 'chef/chef_fs/file_system/operation_failed_error'
22
+ require 'chef/chef_fs/file_system/operation_not_allowed_error'
23
+ require 'chef/chef_fs/parallelizer'
20
24
 
21
25
  class Chef
22
26
  module ChefFS
23
27
  module FileSystem
24
- # Yields a list of all things under (and including) this entry that match the
28
+ # Returns a list of all things under (and including) this entry that match the
25
29
  # given pattern.
26
30
  #
27
31
  # ==== Attributes
28
32
  #
29
- # * +entry+ - Entry to start listing under
33
+ # * +root+ - Entry to start listing under
30
34
  # * +pattern+ - Chef::ChefFS::FilePattern to match children under
31
35
  #
32
- def self.list(entry, pattern, &block)
33
- # Include self in results if it matches
34
- if pattern.match?(entry.path)
35
- block.call(entry)
36
+ def self.list(root, pattern)
37
+ Lister.new(root, pattern)
38
+ end
39
+
40
+ class Lister
41
+ include Enumerable
42
+
43
+ def initialize(root, pattern)
44
+ @root = root
45
+ @pattern = pattern
36
46
  end
37
47
 
38
- if entry.dir? && pattern.could_match_children?(entry.path)
39
- # If it's possible that our children could match, descend in and add matches.
40
- exact_child_name = pattern.exact_child_name_under(entry.path)
48
+ attr_reader :root
49
+ attr_reader :pattern
41
50
 
42
- # If we've got an exact name, don't bother listing children; just grab the
43
- # child with the given name.
44
- if exact_child_name
45
- exact_child = entry.child(exact_child_name)
46
- if exact_child
47
- list(exact_child, pattern, &block)
48
- end
51
+ def each(&block)
52
+ list_from(root, &block)
53
+ end
49
54
 
50
- # Otherwise, go through all children and find any matches
51
- else
52
- entry.children.each do |child|
53
- list(child, pattern, &block)
55
+ def list_from(entry, &block)
56
+ # Include self in results if it matches
57
+ if pattern.match?(entry.path)
58
+ block.call(entry)
59
+ end
60
+
61
+ if pattern.could_match_children?(entry.path)
62
+ # If it's possible that our children could match, descend in and add matches.
63
+ exact_child_name = pattern.exact_child_name_under(entry.path)
64
+
65
+ # If we've got an exact name, don't bother listing children; just grab the
66
+ # child with the given name.
67
+ if exact_child_name
68
+ exact_child = entry.child(exact_child_name)
69
+ if exact_child
70
+ list_from(exact_child, &block)
71
+ end
72
+
73
+ # Otherwise, go through all children and find any matches
74
+ elsif entry.dir?
75
+ results = Parallelizer::parallelize(entry.children, :flatten => true) { |child| Chef::ChefFS::FileSystem.list(child, pattern) }
76
+ results.each(&block)
54
77
  end
55
78
  end
56
79
  end
@@ -113,16 +136,20 @@ class Chef
113
136
  # puts message
114
137
  # end
115
138
  #
116
- def self.copy_to(pattern, src_root, dest_root, recurse_depth, options)
139
+ def self.copy_to(pattern, src_root, dest_root, recurse_depth, options, ui = nil, format_path = nil)
117
140
  found_result = false
118
- list_pairs(pattern, src_root, dest_root) do |src, dest|
141
+ error = false
142
+ parallel_do(list_pairs(pattern, src_root, dest_root)) do |src, dest|
119
143
  found_result = true
120
- new_dest_parent = get_or_create_parent(dest, options)
121
- copy_entries(src, dest, new_dest_parent, recurse_depth, options)
144
+ new_dest_parent = get_or_create_parent(dest, options, ui, format_path)
145
+ child_error = copy_entries(src, dest, new_dest_parent, recurse_depth, options, ui, format_path)
146
+ error ||= child_error
122
147
  end
123
148
  if !found_result && pattern.exact_path
124
- puts "#{pattern}: No such file or directory on remote or local"
149
+ ui.error "#{pattern}: No such file or directory on remote or local" if ui
150
+ error = true
125
151
  end
152
+ error
126
153
  end
127
154
 
128
155
  # Yield entries for children that are in either +a_root+ or +b_root+, with
@@ -136,26 +163,44 @@ class Chef
136
163
  #
137
164
  # ==== Example
138
165
  #
139
- # Chef::ChefFS::FileSystem.list_pairs(FilePattern.new('**x.txt', a_root, b_root)) do |a, b|
166
+ # Chef::ChefFS::FileSystem.list_pairs(FilePattern.new('**x.txt', a_root, b_root)).each do |a, b|
140
167
  # ...
141
168
  # end
142
169
  #
143
170
  def self.list_pairs(pattern, a_root, b_root)
144
- # Make sure everything on the server is also on the filesystem, and diff
145
- found_paths = Set.new
146
- Chef::ChefFS::FileSystem.list(a_root, pattern) do |a|
147
- found_paths << a.path
148
- b = Chef::ChefFS::FileSystem.resolve_path(b_root, a.path)
149
- yield [ a, b ]
171
+ PairLister.new(pattern, a_root, b_root)
172
+ end
173
+
174
+ class PairLister
175
+ include Enumerable
176
+
177
+ def initialize(pattern, a_root, b_root)
178
+ @pattern = pattern
179
+ @a_root = a_root
180
+ @b_root = b_root
150
181
  end
151
182
 
152
- # Check the outer regex pattern to see if it matches anything on the
153
- # filesystem that isn't on the server
154
- Chef::ChefFS::FileSystem.list(b_root, pattern) do |b|
155
- if !found_paths.include?(b.path)
156
- a = Chef::ChefFS::FileSystem.resolve_path(a_root, b.path)
183
+ attr_reader :pattern
184
+ attr_reader :a_root
185
+ attr_reader :b_root
186
+
187
+ def each
188
+ # Make sure everything on the server is also on the filesystem, and diff
189
+ found_paths = Set.new
190
+ Chef::ChefFS::FileSystem.list(a_root, pattern).each do |a|
191
+ found_paths << a.path
192
+ b = Chef::ChefFS::FileSystem.resolve_path(b_root, a.path)
157
193
  yield [ a, b ]
158
194
  end
195
+
196
+ # Check the outer regex pattern to see if it matches anything on the
197
+ # filesystem that isn't on the server
198
+ Chef::ChefFS::FileSystem.list(b_root, pattern).each do |b|
199
+ if !found_paths.include?(b.path)
200
+ a = Chef::ChefFS::FileSystem.resolve_path(a_root, b.path)
201
+ yield [ a, b ]
202
+ end
203
+ end
159
204
  end
160
205
  end
161
206
 
@@ -198,6 +243,7 @@ class Chef
198
243
  are_same, b_value, a_value = b.compare_to(a)
199
244
  end
200
245
  if are_same.nil?
246
+ # TODO these reads can be parallelized
201
247
  begin
202
248
  a_value = a.read if a_value.nil?
203
249
  rescue Chef::ChefFS::FileSystem::NotFoundError
@@ -216,7 +262,7 @@ class Chef
216
262
  private
217
263
 
218
264
  # Copy two entries (could be files or dirs)
219
- def self.copy_entries(src_entry, dest_entry, new_dest_parent, recurse_depth, options)
265
+ def self.copy_entries(src_entry, dest_entry, new_dest_parent, recurse_depth, options, ui, format_path)
220
266
  # A NOTE about this algorithm:
221
267
  # There are cases where this algorithm does too many network requests.
222
268
  # knife upload with a specific filename will first check if the file
@@ -228,131 +274,153 @@ class Chef
228
274
  # exist.
229
275
  # Will need to decide how that works with checksums, though.
230
276
 
231
- if !src_entry.exists?
232
- if options[:purge]
233
- # If we would not have uploaded it, we will not purge it.
234
- if src_entry.parent.can_have_child?(dest_entry.name, dest_entry.dir?)
235
- if options[:dry_run]
236
- puts "Would delete #{dest_entry.path_for_printing}"
277
+ error = false
278
+ begin
279
+ dest_path = format_path.call(dest_entry) if ui
280
+ src_path = format_path.call(src_entry) if ui
281
+ if !src_entry.exists?
282
+ if options[:purge]
283
+ # If we would not have uploaded it, we will not purge it.
284
+ if src_entry.parent.can_have_child?(dest_entry.name, dest_entry.dir?)
285
+ if options[:dry_run]
286
+ ui.output "Would delete #{dest_path}" if ui
287
+ else
288
+ dest_entry.delete(true)
289
+ ui.output "Deleted extra entry #{dest_path} (purge is on)" if ui
290
+ end
237
291
  else
238
- dest_entry.delete(true)
239
- puts "Deleted extra entry #{dest_entry.path_for_printing} (purge is on)"
292
+ Chef::Log.info("Not deleting extra entry #{dest_path} (purge is off)") if ui
240
293
  end
241
- else
242
- Chef::Log.info("Not deleting extra entry #{dest_entry.path_for_printing} (purge is off)")
243
294
  end
244
- end
245
295
 
246
- elsif !dest_entry.exists?
247
- if new_dest_parent.can_have_child?(src_entry.name, src_entry.dir?)
248
- # If the entry can do a copy directly from filesystem, do that.
249
- if new_dest_parent.respond_to?(:create_child_from)
250
- if options[:dry_run]
251
- puts "Would create #{dest_entry.path_for_printing}"
252
- else
253
- new_dest_parent.create_child_from(src_entry)
254
- puts "Created #{dest_entry.path_for_printing}"
296
+ elsif !dest_entry.exists?
297
+ if new_dest_parent.can_have_child?(src_entry.name, src_entry.dir?)
298
+ # If the entry can do a copy directly from filesystem, do that.
299
+ if new_dest_parent.respond_to?(:create_child_from)
300
+ if options[:dry_run]
301
+ ui.output "Would create #{dest_path}" if ui
302
+ else
303
+ new_dest_parent.create_child_from(src_entry)
304
+ ui.output "Created #{dest_path}" if ui
305
+ end
306
+ return
255
307
  end
256
- return
257
- end
258
308
 
259
- if src_entry.dir?
260
- if options[:dry_run]
261
- puts "Would create #{dest_entry.path_for_printing}"
262
- new_dest_dir = new_dest_parent.child(src_entry.name)
263
- else
264
- new_dest_dir = new_dest_parent.create_child(src_entry.name, nil)
265
- puts "Created #{dest_entry.path_for_printing}/"
266
- end
267
- # Directory creation is recursive.
268
- if recurse_depth != 0
269
- src_entry.children.each do |src_child|
270
- new_dest_child = new_dest_dir.child(src_child.name)
271
- copy_entries(src_child, new_dest_child, new_dest_dir, recurse_depth ? recurse_depth - 1 : recurse_depth, options)
309
+ if src_entry.dir?
310
+ if options[:dry_run]
311
+ ui.output "Would create #{dest_path}" if ui
312
+ new_dest_dir = new_dest_parent.child(src_entry.name)
313
+ else
314
+ new_dest_dir = new_dest_parent.create_child(src_entry.name, nil)
315
+ ui.output "Created #{dest_path}" if ui
316
+ end
317
+ # Directory creation is recursive.
318
+ if recurse_depth != 0
319
+ parallel_do(src_entry.children) do |src_child|
320
+ new_dest_child = new_dest_dir.child(src_child.name)
321
+ child_error = copy_entries(src_child, new_dest_child, new_dest_dir, recurse_depth ? recurse_depth - 1 : recurse_depth, options, ui, format_path)
322
+ error ||= child_error
323
+ end
272
324
  end
273
- end
274
- else
275
- if options[:dry_run]
276
- puts "Would create #{dest_entry.path_for_printing}"
277
325
  else
278
- new_dest_parent.create_child(src_entry.name, src_entry.read)
279
- puts "Created #{dest_entry.path_for_printing}"
326
+ if options[:dry_run]
327
+ ui.output "Would create #{dest_path}" if ui
328
+ else
329
+ new_dest_parent.create_child(src_entry.name, src_entry.read)
330
+ ui.output "Created #{dest_path}" if ui
331
+ end
280
332
  end
281
333
  end
282
- end
283
334
 
284
- else
285
- # Both exist.
286
-
287
- # If the entry can do a copy directly, do that.
288
- if dest_entry.respond_to?(:copy_from)
289
- if options[:force] || compare(src_entry, dest_entry)[0] == false
290
- if options[:dry_run]
291
- puts "Would update #{dest_entry.path_for_printing}"
292
- else
293
- dest_entry.copy_from(src_entry)
294
- puts "Updated #{dest_entry.path_for_printing}"
295
- end
296
- end
297
- return
298
- end
335
+ else
336
+ # Both exist.
299
337
 
300
- # If they are different types, log an error.
301
- if src_entry.dir?
302
- if dest_entry.dir?
303
- # If both are directories, recurse into their children
304
- if recurse_depth != 0
305
- child_pairs(src_entry, dest_entry).each do |src_child, dest_child|
306
- copy_entries(src_child, dest_child, dest_entry, recurse_depth ? recurse_depth - 1 : recurse_depth, options)
338
+ # If the entry can do a copy directly, do that.
339
+ if dest_entry.respond_to?(:copy_from)
340
+ if options[:force] || compare(src_entry, dest_entry)[0] == false
341
+ if options[:dry_run]
342
+ ui.output "Would update #{dest_path}" if ui
343
+ else
344
+ dest_entry.copy_from(src_entry, options)
345
+ ui.output "Updated #{dest_path}" if ui
307
346
  end
308
347
  end
309
- else
310
- # If they are different types.
311
- Chef::Log.error("File #{dest_entry.path_for_printing} is a directory while file #{dest_entry.path_for_printing} is a regular file\n")
312
348
  return
313
349
  end
314
- else
315
- if dest_entry.dir?
316
- Chef::Log.error("File #{dest_entry.path_for_printing} is a directory while file #{dest_entry.path_for_printing} is a regular file\n")
317
- return
318
- else
319
350
 
320
- # Both are files! Copy them unless we're sure they are the same.
321
- if options[:force]
322
- should_copy = true
323
- src_value = nil
351
+ # If they are different types, log an error.
352
+ if src_entry.dir?
353
+ if dest_entry.dir?
354
+ # If both are directories, recurse into their children
355
+ if recurse_depth != 0
356
+ parallel_do(child_pairs(src_entry, dest_entry)) do |src_child, dest_child|
357
+ child_error = copy_entries(src_child, dest_child, dest_entry, recurse_depth ? recurse_depth - 1 : recurse_depth, options, ui, format_path)
358
+ error ||= child_error
359
+ end
360
+ end
324
361
  else
325
- are_same, src_value, dest_value = compare(src_entry, dest_entry)
326
- should_copy = !are_same
362
+ # If they are different types.
363
+ ui.error("File #{src_path} is a directory while file #{dest_path} is a regular file\n") if ui
364
+ return
327
365
  end
328
- if should_copy
329
- if options[:dry_run]
330
- puts "Would update #{dest_entry.path_for_printing}"
366
+ else
367
+ if dest_entry.dir?
368
+ ui.error("File #{src_path} is a directory while file #{dest_path} is a regular file\n") if ui
369
+ return
370
+ else
371
+
372
+ # Both are files! Copy them unless we're sure they are the same.'
373
+ if options[:diff] == false
374
+ should_copy = false
375
+ elsif options[:force]
376
+ should_copy = true
377
+ src_value = nil
331
378
  else
332
- src_value = src_entry.read if src_value.nil?
333
- dest_entry.write(src_value)
334
- puts "Updated #{dest_entry.path_for_printing}"
379
+ are_same, src_value, dest_value = compare(src_entry, dest_entry)
380
+ should_copy = !are_same
381
+ end
382
+ if should_copy
383
+ if options[:dry_run]
384
+ ui.output "Would update #{dest_path}" if ui
385
+ else
386
+ src_value = src_entry.read if src_value.nil?
387
+ dest_entry.write(src_value)
388
+ ui.output "Updated #{dest_path}" if ui
389
+ end
335
390
  end
336
391
  end
337
392
  end
338
393
  end
394
+ rescue DefaultEnvironmentCannotBeModifiedError => e
395
+ ui.warn "#{format_path.call(e.entry)} #{e.reason}." if ui
396
+ rescue OperationFailedError => e
397
+ ui.error "#{format_path.call(e.entry)} failed to #{e.operation}: #{e.message}" if ui
398
+ error = true
399
+ rescue OperationNotAllowedError => e
400
+ ui.error "#{format_path.call(e.entry)} #{e.reason}." if ui
401
+ error = true
339
402
  end
403
+ error
340
404
  end
341
405
 
342
- def self.get_or_create_parent(entry, options)
406
+ def self.get_or_create_parent(entry, options, ui, format_path)
343
407
  parent = entry.parent
344
408
  if parent && !parent.exists?
345
- parent_parent = get_or_create_parent(entry.parent, options)
409
+ parent_path = format_path.call(parent) if ui
410
+ parent_parent = get_or_create_parent(entry.parent, options, ui, format_path)
346
411
  if options[:dry_run]
347
- puts "Would create #{parent.path_for_printing}"
412
+ ui.output "Would create #{parent_path}" if ui
348
413
  else
349
- parent = parent_parent.create_child(parent.name, true)
350
- puts "Created #{parent.path_for_printing}"
414
+ parent = parent_parent.create_child(parent.name, nil)
415
+ ui.output "Created #{parent_path}" if ui
351
416
  end
352
417
  end
353
418
  return parent
354
419
  end
355
420
 
421
+ def self.parallel_do(enum, options = {}, &block)
422
+ Chef::ChefFS::Parallelizer.parallelize(enum, options, &block).to_a
423
+ end
356
424
  end
357
425
  end
358
426
  end