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
@@ -1,11 +1,9 @@
1
- require 'chef/chef_fs/file_system/chef_server_root_dir'
2
- require 'chef/config'
3
- require 'chef/rest'
1
+ require 'chef/platform'
4
2
 
5
3
  class Chef
6
4
  module ChefFS
7
5
  def self.windows?
8
- false
6
+ Chef::Platform.windows?
9
7
  end
10
8
  end
11
9
  end
@@ -0,0 +1,371 @@
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_zero/data_store/memory_store'
20
+ require 'chef_zero/data_store/data_already_exists_error'
21
+ require 'chef_zero/data_store/data_not_found_error'
22
+ require 'chef/chef_fs/file_pattern'
23
+ require 'chef/chef_fs/file_system'
24
+ require 'chef/chef_fs/file_system/not_found_error'
25
+ require 'chef/chef_fs/file_system/memory_root'
26
+
27
+ class Chef
28
+ module ChefFS
29
+ class ChefFSDataStore
30
+ def initialize(chef_fs)
31
+ @chef_fs = chef_fs
32
+ @memory_store = ChefZero::DataStore::MemoryStore.new
33
+ end
34
+
35
+ def publish_description
36
+ "Reading and writing data to #{chef_fs.fs_description}"
37
+ end
38
+
39
+ attr_reader :chef_fs
40
+
41
+ def create_dir(path, name, *options)
42
+ if use_memory_store?(path)
43
+ @memory_store.create_dir(path, name, *options)
44
+ else
45
+ with_dir(path) do |parent|
46
+ parent.create_child(chef_fs_filename(path + [name]), nil)
47
+ end
48
+ end
49
+ end
50
+
51
+ def create(path, name, data, *options)
52
+ if use_memory_store?(path)
53
+ @memory_store.create(path, name, data, *options)
54
+
55
+ elsif path[0] == 'cookbooks' && path.length == 2
56
+ # Do nothing. The entry gets created when the cookbook is created.
57
+
58
+ else
59
+ if !data.is_a?(String)
60
+ raise "set only works with strings"
61
+ end
62
+
63
+ with_dir(path) do |parent|
64
+ parent.create_child(chef_fs_filename(path + [name]), data)
65
+ end
66
+ end
67
+ end
68
+
69
+ def get(path, request=nil)
70
+ if use_memory_store?(path)
71
+ @memory_store.get(path)
72
+
73
+ elsif path[0] == 'file_store' && path[1] == 'repo'
74
+ entry = Chef::ChefFS::FileSystem.resolve_path(chef_fs, path[2..-1].join('/'))
75
+ begin
76
+ entry.read
77
+ rescue Chef::ChefFS::FileSystem::NotFoundError => e
78
+ raise ChefZero::DataStore::DataNotFoundError.new(to_zero_path(e.entry), e)
79
+ end
80
+
81
+ else
82
+ with_entry(path) do |entry|
83
+ if path[0] == 'cookbooks' && path.length == 3
84
+ # get /cookbooks/NAME/version
85
+ result = entry.chef_object.to_hash
86
+ result.each_pair do |key, value|
87
+ if value.is_a?(Array)
88
+ value.each do |file|
89
+ if file.is_a?(Hash) && file.has_key?('checksum')
90
+ relative = ['file_store', 'repo', 'cookbooks']
91
+ if Chef::Config.versioned_cookbooks
92
+ relative << "#{path[1]}-#{path[2]}"
93
+ else
94
+ relative << path[1]
95
+ end
96
+ relative = relative + file[:path].split('/')
97
+ file['url'] = ChefZero::RestBase::build_uri(request.base_uri, relative)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ JSON.pretty_generate(result)
103
+
104
+ else
105
+ entry.read
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ def set(path, data, *options)
112
+ if use_memory_store?(path)
113
+ @memory_store.set(path, data, *options)
114
+ else
115
+ if !data.is_a?(String)
116
+ raise "set only works with strings: #{path} = #{data.inspect}"
117
+ end
118
+
119
+ # Write out the files!
120
+ if path[0] == 'cookbooks' && path.length == 3
121
+ write_cookbook(path, data, *options)
122
+ else
123
+ with_dir(path[0..-2]) do |parent|
124
+ parent.create_child(chef_fs_filename(path), data)
125
+ end
126
+ end
127
+ end
128
+ end
129
+
130
+ def delete(path)
131
+ if use_memory_store?(path)
132
+ @memory_store.delete(path)
133
+ else
134
+ with_entry(path) do |entry|
135
+ if path[0] == 'cookbooks' && path.length >= 3
136
+ entry.delete(true)
137
+ else
138
+ entry.delete
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+ def delete_dir(path, *options)
145
+ if use_memory_store?(path)
146
+ @memory_store.delete_dir(path, *options)
147
+ else
148
+ with_entry(path) do |entry|
149
+ entry.delete(options.include?(:recursive))
150
+ end
151
+ end
152
+ end
153
+
154
+ def list(path)
155
+ if use_memory_store?(path)
156
+ @memory_store.list(path)
157
+
158
+ elsif path[0] == 'cookbooks' && path.length == 1
159
+ with_entry(path) do |entry|
160
+ begin
161
+ if Chef::Config.versioned_cookbooks
162
+ # /cookbooks/name-version -> /cookbooks/name
163
+ entry.children.map { |child| split_name_version(child.name)[0] }.uniq
164
+ else
165
+ entry.children.map { |child| child.name }
166
+ end
167
+ rescue Chef::ChefFS::FileSystem::NotFoundError
168
+ # If the cookbooks dir doesn't exist, we have no cookbooks (not 404)
169
+ []
170
+ end
171
+ end
172
+
173
+ elsif path[0] == 'cookbooks' && path.length == 2
174
+ if Chef::Config.versioned_cookbooks
175
+ # list /cookbooks/name = filter /cookbooks/name-version down to name
176
+ entry.children.map { |child| split_name_version(child.name) }.
177
+ select { |name, version| name == path[1] }.
178
+ map { |name, version| version }.to_a
179
+ else
180
+ # list /cookbooks/name = <single version>
181
+ version = get_single_cookbook_version(path)
182
+ [version]
183
+ end
184
+
185
+ else
186
+ with_entry(path) do |entry|
187
+ begin
188
+ entry.children.map { |c| zero_filename(c) }.sort
189
+ rescue Chef::ChefFS::FileSystem::NotFoundError
190
+ # /cookbooks, /data, etc. never return 404
191
+ if path_always_exists?(path)
192
+ []
193
+ else
194
+ raise
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
200
+
201
+ def exists?(path)
202
+ if use_memory_store?(path)
203
+ @memory_store.exists?(path)
204
+ else
205
+ path_always_exists?(path) || Chef::ChefFS::FileSystem.resolve_path(chef_fs, to_chef_fs_path(path)).exists?
206
+ end
207
+ end
208
+
209
+ def exists_dir?(path)
210
+ if use_memory_store?(path)
211
+ @memory_store.exists_dir?(path)
212
+ elsif path[0] == 'cookbooks' && path.length == 2
213
+ list([ path[0] ]).include?(path[1])
214
+ else
215
+ Chef::ChefFS::FileSystem.resolve_path(chef_fs, to_chef_fs_path(path)).exists?
216
+ end
217
+ end
218
+
219
+ private
220
+
221
+ def use_memory_store?(path)
222
+ return path[0] == 'sandboxes' || path[0] == 'file_store' && path[1] == 'checksums' || path == [ 'environments', '_default' ]
223
+ end
224
+
225
+ def write_cookbook(path, data, *options)
226
+ # Create a little Chef::ChefFS memory filesystem with the data
227
+ if Chef::Config.versioned_cookbooks
228
+ cookbook_path = "cookbooks/#{path[1]}-#{path[2]}"
229
+ else
230
+ cookbook_path = "cookbooks/#{path[1]}"
231
+ end
232
+ cookbook_fs = Chef::ChefFS::FileSystem::MemoryRoot.new('uploading')
233
+ cookbook = JSON.parse(data, :create_additions => false)
234
+ cookbook.each_pair do |key, value|
235
+ if value.is_a?(Array)
236
+ value.each do |file|
237
+ if file.is_a?(Hash) && file.has_key?('checksum')
238
+ file_data = @memory_store.get(['file_store', 'checksums', file['checksum']])
239
+ cookbook_fs.add_file("#{cookbook_path}/#{file['path']}", file_data)
240
+ end
241
+ end
242
+ end
243
+ end
244
+
245
+ # Use the copy/diff algorithm to copy it down so we don't destroy
246
+ # chefignored data. This is terribly un-thread-safe.
247
+ Chef::ChefFS::FileSystem.copy_to(Chef::ChefFS::FilePattern.new("/#{cookbook_path}"), cookbook_fs, chef_fs, nil, {:purge => true})
248
+ end
249
+
250
+ def split_name_version(entry_name)
251
+ name_version = entry_name.split('-')
252
+ name = name_version[0..-2].join('-')
253
+ version = name_version[-1]
254
+ [name,version]
255
+ end
256
+
257
+ def to_chef_fs_path(path)
258
+ _to_chef_fs_path(path).join('/')
259
+ end
260
+
261
+ def chef_fs_filename(path)
262
+ _to_chef_fs_path(path)[-1]
263
+ end
264
+
265
+ def _to_chef_fs_path(path)
266
+ if path[0] == 'data'
267
+ path = path.dup
268
+ path[0] = 'data_bags'
269
+ if path.length >= 3
270
+ path[2] = "#{path[2]}.json"
271
+ end
272
+ elsif path[0] == 'cookbooks'
273
+ if path.length == 2
274
+ raise ChefZero::DataStore::DataNotFoundError.new(path)
275
+ elsif Chef::Config.versioned_cookbooks
276
+ if path.length >= 3
277
+ # cookbooks/name/version -> cookbooks/name-version
278
+ path = [ path[0], "#{path[1]}-#{path[2]}" ] + path[3..-1]
279
+ end
280
+ else
281
+ if path.length >= 3
282
+ # cookbooks/name/version/... -> /cookbooks/name/... iff metadata says so
283
+ version = get_single_cookbook_version(path)
284
+ if path[2] == version
285
+ path = path[0..1] + path[3..-1]
286
+ else
287
+ raise ChefZero::DataStore::DataNotFoundError.new(path)
288
+ end
289
+ end
290
+ end
291
+ elsif path.length == 2
292
+ path = path.dup
293
+ path[1] = "#{path[1]}.json"
294
+ end
295
+ path
296
+ end
297
+
298
+ def to_zero_path(entry)
299
+ path = entry.path.split('/')[1..-1]
300
+ if path[0] == 'data_bags'
301
+ path = path.dup
302
+ path[0] = 'data'
303
+ if path.length >= 3
304
+ path[2] = path[2][0..-6]
305
+ end
306
+
307
+ elsif path[0] == 'cookbooks'
308
+ if Chef::Config.versioned_cookbooks
309
+ # cookbooks/name-version/... -> cookbooks/name/version/...
310
+ if path.length >= 2
311
+ name, version = split_name_version(path[1])
312
+ path = [ path[0], name, version ] + path[2..-1]
313
+ end
314
+ else
315
+ if path.length >= 2
316
+ # cookbooks/name/... -> cookbooks/name/version/...
317
+ version = get_single_cookbook_version(path)
318
+ path = path[0..1] + [version] + path[2..-1]
319
+ end
320
+ end
321
+
322
+ elsif path.length == 2 && path[0] != 'cookbooks'
323
+ path = path.dup
324
+ path[1] = path[1][0..-6]
325
+ end
326
+ path
327
+ end
328
+
329
+ def zero_filename(entry)
330
+ to_zero_path(entry)[-1]
331
+ end
332
+
333
+ def path_always_exists?(path)
334
+ return path.length == 1 && %w(clients cookbooks data environments nodes roles users).include?(path[0])
335
+ end
336
+
337
+ def with_entry(path)
338
+ begin
339
+ yield Chef::ChefFS::FileSystem.resolve_path(chef_fs, to_chef_fs_path(path))
340
+ rescue Chef::ChefFS::FileSystem::NotFoundError => e
341
+ raise ChefZero::DataStore::DataNotFoundError.new(to_zero_path(e.entry), e)
342
+ end
343
+ end
344
+
345
+ def with_dir(path)
346
+ begin
347
+ yield get_dir(_to_chef_fs_path(path), true)
348
+ rescue Chef::ChefFS::FileSystem::NotFoundError => e
349
+ raise ChefZero::DataStore::DataNotFoundError.new(to_zero_path(e.entry), e)
350
+ end
351
+ end
352
+
353
+ def get_dir(path, create=false)
354
+ result = Chef::ChefFS::FileSystem.resolve_path(chef_fs, path.join('/'))
355
+ if result.exists?
356
+ result
357
+ elsif create
358
+ get_dir(path[0..-2], create).create_child(result.name, nil)
359
+ else
360
+ raise ChefZero::DataStore::DataNotFoundError.new(path)
361
+ end
362
+ end
363
+
364
+ def get_single_cookbook_version(path)
365
+ dir = Chef::ChefFS::FileSystem.resolve_path(chef_fs, path[0..1].join('/'))
366
+ metadata = ChefZero::CookbookData.metadata_from(dir, path[1], nil, [])
367
+ metadata[:version] || '0.0.0'
368
+ end
369
+ end
370
+ end
371
+ end
@@ -17,89 +17,171 @@
17
17
  #
18
18
 
19
19
  require 'chef/chef_fs/file_system'
20
+ require 'chef/chef_fs/file_system/operation_failed_error'
21
+ require 'chef/chef_fs/file_system/operation_not_allowed_error'
20
22
 
21
23
  class Chef
22
24
  module ChefFS
23
25
  module CommandLine
24
- def self.diff(pattern, a_root, b_root, recurse_depth, output_mode)
25
- found_result = false
26
- Chef::ChefFS::FileSystem.list_pairs(pattern, a_root, b_root) do |a, b|
27
- existed = diff_entries(a, b, recurse_depth, output_mode) do |diff|
28
- yield diff
29
- end
30
- found_result = true if existed
31
- end
32
- if !found_result && pattern.exact_path
33
- yield "#{pattern}: No such file or directory on remote or local"
26
+
27
+ def self.diff_print(pattern, a_root, b_root, recurse_depth, output_mode, format_path = nil, diff_filter = nil, ui = nil)
28
+ if format_path.nil?
29
+ format_path = proc { |entry| entry.path_for_printing }
34
30
  end
35
- end
36
31
 
37
- # Diff two known entries (could be files or dirs)
38
- def self.diff_entries(old_entry, new_entry, recurse_depth, output_mode)
39
- # If both are directories
40
- if old_entry.dir?
41
- if new_entry.dir?
42
- if recurse_depth == 0
43
- if output_mode != :name_only && output_mode != :name_status
44
- yield "Common subdirectories: #{old_entry.path}\n"
45
- end
32
+ get_content = (output_mode != :name_only && output_mode != :name_status)
33
+ found_match = false
34
+ diff(pattern, a_root, b_root, recurse_depth, get_content).each do |type, old_entry, new_entry, old_value, new_value, error|
35
+ found_match = true unless type == :both_nonexistent
36
+ old_path = format_path.call(old_entry)
37
+ new_path = format_path.call(new_entry)
38
+
39
+ case type
40
+ when :common_subdirectories
41
+ if output_mode != :name_only && output_mode != :name_status
42
+ yield "Common subdirectories: #{new_path}\n"
43
+ end
44
+
45
+ when :directory_to_file
46
+ next if diff_filter && diff_filter !~ /T/
47
+ if output_mode == :name_only
48
+ yield "#{new_path}\n"
49
+ elsif output_mode == :name_status
50
+ yield "T\t#{new_path}\n"
46
51
  else
47
- Chef::ChefFS::FileSystem.child_pairs(old_entry, new_entry).each do |old_child,new_child|
48
- diff_entries(old_child, new_child,
49
- recurse_depth ? recurse_depth - 1 : nil, output_mode) do |diff|
50
- yield diff
51
- end
52
- end
52
+ yield "File #{old_path} is a directory while file #{new_path} is a regular file\n"
53
53
  end
54
54
 
55
- # If old is a directory and new is a file
56
- elsif new_entry.exists?
55
+ when :file_to_directory
56
+ next if diff_filter && diff_filter !~ /T/
57
57
  if output_mode == :name_only
58
- yield "#{new_entry.path_for_printing}\n"
58
+ yield "#{new_path}\n"
59
59
  elsif output_mode == :name_status
60
- yield "T\t#{new_entry.path_for_printing}\n"
60
+ yield "T\t#{new_path}\n"
61
61
  else
62
- yield "File #{new_entry.path_for_printing} is a directory while file #{new_entry.path_for_printing} is a regular file\n"
62
+ yield "File #{old_path} is a regular file while file #{new_path} is a directory\n"
63
63
  end
64
64
 
65
- # If old is a directory and new does not exist
66
- elsif new_entry.parent.can_have_child?(old_entry.name, old_entry.dir?)
65
+ when :deleted
66
+ next if diff_filter && diff_filter !~ /D/
67
67
  if output_mode == :name_only
68
- yield "#{new_entry.path_for_printing}\n"
68
+ yield "#{new_path}\n"
69
69
  elsif output_mode == :name_status
70
- yield "D\t#{new_entry.path_for_printing}\n"
70
+ yield "D\t#{new_path}\n"
71
+ elsif old_value
72
+ result = "diff --knife #{old_path} #{new_path}\n"
73
+ result << "deleted file\n"
74
+ result << diff_text(old_path, '/dev/null', old_value, '')
75
+ yield result
71
76
  else
72
- yield "Only in #{old_entry.parent.path_for_printing}: #{old_entry.name}\n"
77
+ yield "Only in #{format_path.call(old_entry.parent)}: #{old_entry.name}\n"
73
78
  end
74
- end
75
79
 
76
- # If new is a directory and old is a file
77
- elsif new_entry.dir?
78
- if old_entry.exists?
80
+ when :added
81
+ next if diff_filter && diff_filter !~ /A/
79
82
  if output_mode == :name_only
80
- yield "#{new_entry.path_for_printing}\n"
83
+ yield "#{new_path}\n"
81
84
  elsif output_mode == :name_status
82
- yield "T\t#{new_entry.path_for_printing}\n"
85
+ yield "A\t#{new_path}\n"
86
+ elsif new_value
87
+ result = "diff --knife #{old_path} #{new_path}\n"
88
+ result << "new file\n"
89
+ result << diff_text('/dev/null', new_path, '', new_value)
90
+ yield result
83
91
  else
84
- yield "File #{old_entry.path_for_printing} is a regular file while file #{old_entry.path_for_printing} is a directory\n"
92
+ yield "Only in #{format_path.call(new_entry.parent)}: #{new_entry.name}\n"
85
93
  end
86
94
 
87
- # If new is a directory and old does not exist
88
- elsif old_entry.parent.can_have_child?(new_entry.name, new_entry.dir?)
95
+ when :modified
96
+ next if diff_filter && diff_filter !~ /M/
89
97
  if output_mode == :name_only
90
- yield "#{new_entry.path_for_printing}\n"
98
+ yield "#{new_path}\n"
91
99
  elsif output_mode == :name_status
92
- yield "A\t#{new_entry.path_for_printing}\n"
100
+ yield "M\t#{new_path}\n"
101
+ else
102
+ result = "diff --knife #{old_path} #{new_path}\n"
103
+ result << diff_text(old_path, new_path, old_value, new_value)
104
+ yield result
105
+ end
106
+
107
+ when :both_nonexistent
108
+ when :added_cannot_upload
109
+ when :deleted_cannot_download
110
+ when :same
111
+ # Skip these silently
112
+ when :error
113
+ if error.is_a?(Chef::ChefFS::FileSystem::OperationFailedError)
114
+ ui.error "#{format_path.call(error.entry)} failed to #{error.operation}: #{error.message}" if ui
115
+ error = true
116
+ elsif error.is_a?(Chef::ChefFS::FileSystem::OperationNotAllowedError)
117
+ ui.error "#{format_path.call(error.entry)} #{error.reason}." if ui
93
118
  else
94
- yield "Only in #{new_entry.parent.path_for_printing}: #{new_entry.name}\n"
119
+ raise error
95
120
  end
96
121
  end
122
+ end
123
+ if !found_match
124
+ ui.error "#{pattern}: No such file or directory on remote or local" if ui
125
+ error = true
126
+ end
127
+ error
128
+ end
129
+
130
+ def self.diff(pattern, old_root, new_root, recurse_depth, get_content)
131
+ Chef::ChefFS::Parallelizer.parallelize(Chef::ChefFS::FileSystem.list_pairs(pattern, old_root, new_root), :flatten => true) do |old_entry, new_entry|
132
+ diff_entries(old_entry, new_entry, recurse_depth, get_content)
133
+ end
134
+ end
135
+
136
+ # Diff two known entries (could be files or dirs)
137
+ def self.diff_entries(old_entry, new_entry, recurse_depth, get_content)
138
+ # If both are directories
139
+ if old_entry.dir?
140
+ if new_entry.dir?
141
+ if recurse_depth == 0
142
+ return [ [ :common_subdirectories, old_entry, new_entry ] ]
143
+ else
144
+ return Chef::ChefFS::Parallelizer.parallelize(Chef::ChefFS::FileSystem.child_pairs(old_entry, new_entry), :flatten => true) do |old_child, new_child|
145
+ Chef::ChefFS::CommandLine.diff_entries(old_child, new_child, recurse_depth ? recurse_depth - 1 : nil, get_content)
146
+ end
147
+ end
148
+
149
+ # If old is a directory and new is a file
150
+ elsif new_entry.exists?
151
+ return [ [ :directory_to_file, old_entry, new_entry ] ]
152
+
153
+ # If old is a directory and new does not exist
154
+ elsif new_entry.parent.can_have_child?(old_entry.name, old_entry.dir?)
155
+ return [ [ :deleted, old_entry, new_entry ] ]
156
+
157
+ # If the new entry does not and *cannot* exist, report that.
158
+ else
159
+ return [ [ :new_cannot_upload, old_entry, new_entry ] ]
160
+ end
161
+
162
+ # If new is a directory and old is a file
163
+ elsif new_entry.dir?
164
+ if old_entry.exists?
165
+ return [ [ :file_to_directory, old_entry, new_entry ] ]
166
+
167
+ # If new is a directory and old does not exist
168
+ elsif old_entry.parent.can_have_child?(new_entry.name, new_entry.dir?)
169
+ return [ [ :added, old_entry, new_entry ] ]
170
+
171
+ # If the new entry does not and *cannot* exist, report that.
172
+ else
173
+ return [ [ :old_cannot_upload, old_entry, new_entry ] ]
174
+ end
97
175
 
98
176
  # Neither is a directory, so they are diffable with file diff
99
177
  else
100
178
  are_same, old_value, new_value = Chef::ChefFS::FileSystem.compare(old_entry, new_entry)
101
179
  if are_same
102
- return old_value != :none
180
+ if old_value == :none
181
+ return [ [ :both_nonexistent, old_entry, new_entry ] ]
182
+ else
183
+ return [ [ :same, old_entry, new_entry ] ]
184
+ end
103
185
  else
104
186
  if old_value == :none
105
187
  old_exists = false
@@ -108,6 +190,7 @@ class Chef
108
190
  else
109
191
  old_exists = true
110
192
  end
193
+
111
194
  if new_value == :none
112
195
  new_exists = false
113
196
  elsif new_value.nil?
@@ -119,24 +202,14 @@ class Chef
119
202
  # If one of the files doesn't exist, we only want to print the diff if the
120
203
  # other file *could be uploaded/downloaded*.
121
204
  if !old_exists && !old_entry.parent.can_have_child?(new_entry.name, new_entry.dir?)
122
- return true
205
+ return [ [ :old_cannot_upload, old_entry, new_entry ] ]
123
206
  end
124
207
  if !new_exists && !new_entry.parent.can_have_child?(old_entry.name, old_entry.dir?)
125
- return true
208
+ return [ [ :new_cannot_upload, old_entry, new_entry ] ]
126
209
  end
127
210
 
128
- if output_mode == :name_only
129
- yield "#{new_entry.path_for_printing}\n"
130
- elsif output_mode == :name_status
131
- if old_value == :none || (old_value == nil && !old_entry.exists?)
132
- yield "A\t#{new_entry.path_for_printing}\n"
133
- elsif new_value == :none
134
- yield "D\t#{new_entry.path_for_printing}\n"
135
- else
136
- yield "M\t#{new_entry.path_for_printing}\n"
137
- end
138
- else
139
- # If we haven't read the values yet, get them now.
211
+ if get_content
212
+ # If we haven't read the values yet, get them now so that they can be diffed
140
213
  begin
141
214
  old_value = old_entry.read if old_value.nil?
142
215
  rescue Chef::ChefFS::FileSystem::NotFoundError
@@ -147,27 +220,19 @@ class Chef
147
220
  rescue Chef::ChefFS::FileSystem::NotFoundError
148
221
  new_value = :none
149
222
  end
223
+ end
150
224
 
151
- old_path = old_entry.path_for_printing
152
- new_path = new_entry.path_for_printing
153
- result = ''
154
- result << "diff --knife #{old_path} #{new_path}\n"
155
- if old_value == :none
156
- result << "new file\n"
157
- old_path = "/dev/null"
158
- old_value = ''
159
- end
160
- if new_value == :none
161
- result << "deleted file\n"
162
- new_path = "/dev/null"
163
- new_value = ''
164
- end
165
- result << diff_text(old_path, new_path, old_value, new_value)
166
- yield result
225
+ if old_value == :none || (old_value == nil && !old_entry.exists?)
226
+ return [ [ :added, old_entry, new_entry, old_value, new_value ] ]
227
+ elsif new_value == :none
228
+ return [ [ :deleted, old_entry, new_entry, old_value, new_value ] ]
229
+ else
230
+ return [ [ :modified, old_entry, new_entry, old_value, new_value ] ]
167
231
  end
168
232
  end
169
233
  end
170
- return true
234
+ rescue Chef::ChefFS::FileSystem::FileSystemError => e
235
+ return [ [ :error, old_entry, new_entry, nil, nil, e ] ]
171
236
  end
172
237
 
173
238
  private
@@ -191,19 +256,6 @@ class Chef
191
256
  end
192
257
 
193
258
  def self.diff_text(old_path, new_path, old_value, new_value)
194
- # Reformat JSON for a nicer diff.
195
- if old_path =~ /\.json$/
196
- begin
197
- reformatted_old_value = canonicalize_json(old_value)
198
- reformatted_new_value = canonicalize_json(new_value)
199
- old_value = reformatted_old_value
200
- new_value = reformatted_new_value
201
- rescue
202
- # If JSON parsing fails, we just won't change any values and fall back
203
- # to normal diff.
204
- end
205
- end
206
-
207
259
  # Copy to tempfiles before diffing
208
260
  # TODO don't copy things that are already in files! Or find an in-memory diff algorithm
209
261
  begin