chef 10.34.6-x86-mingw32 → 11.6.2-x86-mingw32

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 (777) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTING.md +155 -0
  3. data/README.md +89 -0
  4. data/Rakefile +18 -1
  5. data/bin/chef-apply +25 -0
  6. data/bin/chef-service-manager +37 -0
  7. data/bin/chef-shell +34 -0
  8. data/bin/shef +6 -5
  9. data/distro/common/html/chef-client.8.html +4 -4
  10. data/distro/common/html/chef-expander.8.html +4 -4
  11. data/distro/common/html/chef-expanderctl.8.html +4 -4
  12. data/distro/common/html/chef-server-webui.8.html +4 -4
  13. data/distro/common/html/chef-server.8.html +4 -4
  14. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  15. data/distro/common/html/chef-solo.8.html +4 -4
  16. data/distro/common/html/chef-solr.8.html +5 -5
  17. data/distro/common/html/knife-bootstrap.1.html +4 -4
  18. data/distro/common/html/knife-client.1.html +4 -4
  19. data/distro/common/html/knife-configure.1.html +4 -4
  20. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  21. data/distro/common/html/knife-cookbook.1.html +4 -4
  22. data/distro/common/html/knife-data-bag.1.html +4 -4
  23. data/distro/common/html/knife-environment.1.html +4 -4
  24. data/distro/common/html/knife-exec.1.html +9 -9
  25. data/distro/common/html/knife-index.1.html +4 -4
  26. data/distro/common/html/knife-node.1.html +4 -4
  27. data/distro/common/html/knife-role.1.html +4 -4
  28. data/distro/common/html/knife-search.1.html +4 -4
  29. data/distro/common/html/knife-ssh.1.html +4 -4
  30. data/distro/common/html/knife-status.1.html +4 -4
  31. data/distro/common/html/knife-tag.1.html +4 -4
  32. data/distro/common/html/knife.1.html +8 -13
  33. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  34. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  35. data/distro/common/man/man1/knife-client.1 +0 -99
  36. data/distro/common/man/man1/knife-configure.1 +1 -1
  37. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  38. data/distro/common/man/man1/knife-cookbook.1 +1 -1
  39. data/distro/common/man/man1/knife-data-bag.1 +1 -1
  40. data/distro/common/man/man1/knife-environment.1 +0 -168
  41. data/distro/common/man/man1/knife-exec.1 +4 -7
  42. data/distro/common/man/man1/knife-index.1 +1 -1
  43. data/distro/common/man/man1/knife-node.1 +1 -1
  44. data/distro/common/man/man1/knife-role.1 +1 -1
  45. data/distro/common/man/man1/knife-search.1 +1 -1
  46. data/distro/common/man/man1/knife-ssh.1 +1 -1
  47. data/distro/common/man/man1/knife-status.1 +1 -1
  48. data/distro/common/man/man1/knife-tag.1 +1 -1
  49. data/distro/common/man/man1/knife.1 +3 -6
  50. data/distro/common/man/man8/chef-client.8 +1 -1
  51. data/distro/common/man/man8/chef-expander.8 +1 -1
  52. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  53. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  54. data/distro/common/man/man8/chef-server.8 +1 -1
  55. data/distro/common/man/man8/chef-solo.8 +1 -1
  56. data/distro/common/man/man8/chef-solr.8 +1 -1
  57. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  58. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  59. data/distro/common/markdown/man1/knife.mkd +4 -9
  60. data/distro/debian/etc/default/chef-client +0 -1
  61. data/distro/debian/etc/init.d/chef-client +6 -4
  62. data/distro/windows/service_manager.rb +2 -146
  63. data/lib/chef.rb +3 -6
  64. data/lib/chef/api_client.rb +20 -130
  65. data/lib/chef/api_client/registration.rb +126 -0
  66. data/lib/chef/application.rb +68 -18
  67. data/lib/chef/application/apply.rb +162 -0
  68. data/lib/chef/application/client.rb +37 -22
  69. data/lib/chef/application/knife.rb +2 -4
  70. data/lib/chef/application/solo.rb +27 -13
  71. data/lib/chef/application/windows_service.rb +114 -54
  72. data/lib/chef/application/windows_service_manager.rb +179 -0
  73. data/lib/chef/applications.rb +1 -0
  74. data/lib/chef/chef_fs.rb +9 -0
  75. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  76. data/lib/chef/chef_fs/command_line.rb +284 -0
  77. data/lib/chef/chef_fs/config.rb +205 -0
  78. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  79. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  80. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  81. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  82. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  83. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  84. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  85. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  86. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  87. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  88. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  89. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  90. data/lib/chef/chef_fs/file_system.rb +426 -0
  91. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  92. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  93. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  94. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  95. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  96. data/lib/chef/chef_fs/file_system/base_fs_object.rb +180 -0
  97. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  98. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  99. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  100. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  101. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +60 -0
  102. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +121 -0
  103. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +110 -0
  104. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +223 -0
  105. data/lib/chef/chef_fs/file_system/cookbook_file.rb +85 -0
  106. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  107. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  108. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  109. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +149 -0
  110. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +69 -0
  111. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +72 -0
  112. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  113. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  114. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  115. data/lib/chef/chef_fs/file_system/file_system_error.rb +33 -0
  116. data/lib/chef/chef_fs/file_system/file_system_root_dir.rb +31 -0
  117. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  118. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  119. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  120. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  121. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  122. data/lib/chef/chef_fs/file_system/nodes_dir.rb +55 -0
  123. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +36 -0
  124. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  125. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  126. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  127. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +113 -0
  128. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +177 -0
  129. data/lib/chef/chef_fs/knife.rb +116 -0
  130. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  131. data/lib/chef/chef_fs/path_utils.rb +90 -0
  132. data/lib/chef/chef_fs/raw_request.rb +79 -0
  133. data/lib/chef/client.rb +111 -34
  134. data/lib/chef/config.rb +111 -102
  135. data/lib/chef/cookbook/chefignore.rb +2 -1
  136. data/lib/chef/cookbook/metadata.rb +0 -2
  137. data/lib/chef/cookbook/syntax_check.rb +76 -14
  138. data/lib/chef/cookbook_loader.rb +39 -26
  139. data/lib/chef/cookbook_uploader.rb +16 -9
  140. data/lib/chef/cookbook_version.rb +2 -410
  141. data/lib/chef/daemon.rb +24 -19
  142. data/lib/chef/data_bag.rb +20 -104
  143. data/lib/chef/data_bag_item.rb +2 -65
  144. data/lib/chef/deprecation/mixin/template.rb +49 -0
  145. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  146. data/lib/chef/deprecation/provider/file.rb +197 -0
  147. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  148. data/lib/chef/deprecation/provider/template.rb +63 -0
  149. data/lib/chef/deprecation/warnings.rb +38 -0
  150. data/lib/chef/digester.rb +73 -0
  151. data/lib/chef/dsl.rb +6 -0
  152. data/lib/chef/dsl/data_query.rb +71 -0
  153. data/lib/chef/dsl/include_attribute.rb +63 -0
  154. data/lib/chef/dsl/include_recipe.rb +45 -0
  155. data/lib/chef/dsl/platform_introspection.rb +218 -0
  156. data/lib/chef/dsl/recipe.rb +87 -0
  157. data/lib/chef/dsl/registry_helper.rb +59 -0
  158. data/lib/chef/encrypted_data_bag_item.rb +171 -24
  159. data/lib/chef/environment.rb +39 -179
  160. data/lib/chef/event_dispatch/base.rb +3 -0
  161. data/lib/chef/exceptions.rb +107 -8
  162. data/lib/chef/file_access_control/unix.rb +64 -7
  163. data/lib/chef/file_access_control/windows.rb +22 -11
  164. data/lib/chef/file_content_management/content_base.rb +56 -0
  165. data/lib/chef/file_content_management/deploy.rb +38 -0
  166. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  167. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  168. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  169. data/lib/chef/file_content_management/tempfile.rb +61 -0
  170. data/lib/chef/formatters/base.rb +4 -1
  171. data/lib/chef/formatters/doc.rb +1 -1
  172. data/lib/chef/formatters/error_descriptor.rb +5 -4
  173. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  174. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +8 -0
  175. data/lib/chef/json_compat.rb +15 -14
  176. data/lib/chef/knife.rb +99 -41
  177. data/lib/chef/knife/bootstrap.rb +46 -2
  178. data/lib/chef/knife/bootstrap/archlinux-gems.erb +1 -1
  179. data/lib/chef/knife/bootstrap/centos5-gems.erb +1 -1
  180. data/lib/chef/knife/bootstrap/chef-full.erb +1 -1
  181. data/lib/chef/knife/bootstrap/fedora13-gems.erb +1 -1
  182. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +1 -1
  183. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +1 -1
  184. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +1 -1
  185. data/lib/chef/knife/client_show.rb +2 -5
  186. data/lib/chef/knife/configure.rb +19 -17
  187. data/lib/chef/knife/cookbook_create.rb +6 -5
  188. data/lib/chef/knife/cookbook_download.rb +13 -5
  189. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  190. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  191. data/lib/chef/knife/cookbook_test.rb +4 -2
  192. data/lib/chef/knife/cookbook_upload.rb +4 -4
  193. data/lib/chef/knife/core/bootstrap_context.rb +11 -5
  194. data/lib/chef/knife/core/generic_presenter.rb +42 -13
  195. data/lib/chef/knife/core/node_editor.rb +36 -16
  196. data/lib/chef/knife/core/node_presenter.rb +1 -1
  197. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  198. data/lib/chef/knife/core/text_formatter.rb +23 -37
  199. data/lib/chef/knife/core/ui.rb +34 -13
  200. data/lib/chef/knife/delete.rb +106 -0
  201. data/lib/chef/knife/deps.rb +139 -0
  202. data/lib/chef/knife/diff.rb +63 -0
  203. data/lib/chef/knife/download.rb +63 -0
  204. data/lib/chef/knife/edit.rb +76 -0
  205. data/lib/chef/knife/environment_show.rb +2 -0
  206. data/lib/chef/knife/exec.rb +5 -5
  207. data/lib/chef/knife/help_topics.rb +1 -1
  208. data/lib/chef/knife/index_rebuild.rb +91 -7
  209. data/lib/chef/knife/list.rb +153 -0
  210. data/lib/chef/knife/node_run_list_set.rb +66 -0
  211. data/lib/chef/knife/node_show.rb +1 -7
  212. data/lib/chef/knife/raw.rb +64 -0
  213. data/lib/chef/knife/role_show.rb +2 -4
  214. data/lib/chef/knife/search.rb +45 -28
  215. data/lib/chef/knife/show.rb +55 -0
  216. data/lib/chef/knife/ssh.rb +14 -2
  217. data/lib/chef/knife/upload.rb +69 -0
  218. data/lib/chef/knife/user_create.rb +93 -0
  219. data/lib/chef/knife/user_delete.rb +46 -0
  220. data/lib/chef/knife/user_edit.rb +53 -0
  221. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → knife/user_list.rb} +21 -9
  222. data/lib/chef/knife/user_reregister.rb +59 -0
  223. data/lib/chef/knife/user_show.rb +49 -0
  224. data/lib/chef/knife/xargs.rb +265 -0
  225. data/lib/chef/log.rb +2 -2
  226. data/lib/chef/mixin/checksum.rb +3 -3
  227. data/lib/chef/mixin/deep_merge.rb +78 -194
  228. data/lib/chef/mixin/deprecation.rb +35 -0
  229. data/lib/chef/mixin/file_class.rb +0 -9
  230. data/lib/chef/mixin/language.rb +22 -223
  231. data/lib/chef/mixin/language_include_attribute.rb +10 -36
  232. data/lib/chef/mixin/language_include_recipe.rb +7 -33
  233. data/lib/chef/mixin/params_validate.rb +0 -3
  234. data/lib/chef/mixin/recipe_definition_dsl_core.rb +10 -61
  235. data/lib/chef/mixin/securable.rb +32 -7
  236. data/lib/chef/mixin/template.rb +156 -26
  237. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  238. data/lib/chef/mixins.rb +1 -5
  239. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/monkey_patches/file.rb} +6 -14
  240. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  241. data/lib/chef/monkey_patches/net_http.rb +0 -34
  242. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  243. data/lib/chef/monologger.rb +93 -0
  244. data/lib/chef/node.rb +139 -308
  245. data/lib/chef/node/attribute.rb +367 -473
  246. data/lib/chef/node/attribute_collections.rb +206 -0
  247. data/lib/chef/node/immutable_collections.rb +186 -0
  248. data/lib/chef/platform.rb +4 -496
  249. data/lib/chef/platform/provider_mapping.rb +529 -0
  250. data/lib/chef/{mixin/check_helper.rb → platform/query_helpers.rb} +20 -9
  251. data/lib/chef/provider.rb +14 -58
  252. data/lib/chef/provider/batch.rb +35 -0
  253. data/lib/chef/provider/breakpoint.rb +6 -6
  254. data/lib/chef/provider/cookbook_file.rb +11 -80
  255. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  256. data/lib/chef/provider/deploy.rb +26 -21
  257. data/lib/chef/provider/deploy/revision.rb +27 -0
  258. data/lib/chef/provider/directory.rb +12 -18
  259. data/lib/chef/provider/execute.rb +22 -5
  260. data/lib/chef/provider/file.rb +297 -248
  261. data/lib/chef/provider/file/content.rb +39 -0
  262. data/lib/chef/provider/git.rb +76 -43
  263. data/lib/chef/provider/group.rb +31 -51
  264. data/lib/chef/provider/group/dscl.rb +13 -53
  265. data/lib/chef/provider/group/gpasswd.rb +19 -14
  266. data/lib/chef/provider/group/groupadd.rb +1 -41
  267. data/lib/chef/provider/group/groupmod.rb +36 -46
  268. data/lib/chef/provider/group/pw.rb +16 -59
  269. data/lib/chef/provider/group/suse.rb +13 -16
  270. data/lib/chef/provider/group/usermod.rb +18 -40
  271. data/lib/chef/provider/group/windows.rb +6 -13
  272. data/lib/chef/provider/http_request.rb +25 -42
  273. data/lib/chef/provider/ifconfig.rb +25 -35
  274. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  275. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  276. data/lib/chef/provider/link.rb +12 -3
  277. data/lib/chef/provider/lwrp_base.rb +150 -0
  278. data/lib/chef/provider/mount.rb +1 -1
  279. data/lib/chef/provider/mount/mount.rb +8 -3
  280. data/lib/chef/provider/mount/windows.rb +4 -1
  281. data/lib/chef/provider/package/rpm.rb +2 -2
  282. data/lib/chef/provider/package/rubygems.rb +4 -1
  283. data/lib/chef/provider/package/smartos.rb +47 -36
  284. data/lib/chef/provider/package/zypper.rb +45 -55
  285. data/lib/chef/provider/powershell_script.rb +77 -0
  286. data/lib/chef/provider/registry_key.rb +156 -0
  287. data/lib/chef/provider/remote_directory.rb +6 -5
  288. data/lib/chef/provider/remote_file.rb +13 -100
  289. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  290. data/lib/chef/provider/remote_file/content.rb +75 -0
  291. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  292. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  293. data/lib/chef/provider/remote_file/http.rb +124 -0
  294. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  295. data/lib/chef/provider/route.rb +6 -2
  296. data/lib/chef/provider/ruby_block.rb +5 -2
  297. data/lib/chef/provider/script.rb +14 -2
  298. data/lib/chef/provider/service.rb +15 -0
  299. data/lib/chef/provider/service/init.rb +9 -7
  300. data/lib/chef/provider/service/macosx.rb +29 -81
  301. data/lib/chef/provider/service/simple.rb +1 -1
  302. data/lib/chef/provider/service/solaris.rb +6 -5
  303. data/lib/chef/provider/template.rb +16 -81
  304. data/lib/chef/provider/template/content.rb +61 -0
  305. data/lib/chef/provider/template_finder.rb +61 -0
  306. data/lib/chef/provider/user.rb +0 -1
  307. data/lib/chef/provider/user/dscl.rb +175 -568
  308. data/lib/chef/provider/user/useradd.rb +50 -54
  309. data/lib/chef/provider/windows_script.rb +73 -0
  310. data/lib/chef/providers.rb +18 -1
  311. data/lib/chef/recipe.rb +14 -8
  312. data/lib/chef/resource.rb +52 -146
  313. data/lib/chef/resource/{whyrun_safe_ruby_block.rb → batch.rb} +10 -10
  314. data/lib/chef/resource/conditional.rb +4 -0
  315. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  316. data/lib/chef/resource/file.rb +31 -3
  317. data/lib/chef/resource/group.rb +1 -11
  318. data/lib/chef/resource/http_request.rb +2 -1
  319. data/lib/chef/resource/link.rb +17 -0
  320. data/lib/chef/resource/lwrp_base.rb +132 -0
  321. data/lib/chef/resource/mount.rb +39 -13
  322. data/lib/chef/resource/powershell_script.rb +31 -0
  323. data/lib/chef/resource/registry_key.rb +86 -0
  324. data/lib/chef/resource/remote_directory.rb +6 -5
  325. data/lib/chef/resource/remote_file.rb +62 -25
  326. data/lib/chef/resource/route.rb +1 -1
  327. data/lib/chef/resource/ruby_block.rb +2 -2
  328. data/lib/chef/resource/service.rb +14 -0
  329. data/lib/chef/resource/template.rb +145 -0
  330. data/lib/chef/resource/user.rb +0 -18
  331. data/lib/chef/resource/windows_script.rb +62 -0
  332. data/lib/chef/resource_collection.rb +69 -31
  333. data/lib/chef/resource_reporter.rb +81 -52
  334. data/lib/chef/resources.rb +4 -1
  335. data/lib/chef/rest.rb +55 -127
  336. data/lib/chef/rest/auth_credentials.rb +4 -20
  337. data/lib/chef/rest/rest_request.rb +7 -8
  338. data/lib/chef/role.rb +1 -97
  339. data/lib/chef/run_context.rb +108 -130
  340. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  341. data/lib/chef/run_list.rb +0 -2
  342. data/lib/chef/run_list/run_list_expansion.rb +1 -16
  343. data/lib/chef/run_lock.rb +96 -0
  344. data/lib/chef/runner.rb +28 -6
  345. data/lib/chef/sandbox.rb +15 -148
  346. data/lib/chef/scan_access_control.rb +8 -5
  347. data/lib/chef/search/query.rb +2 -2
  348. data/lib/chef/shef/ext.rb +3 -575
  349. data/lib/chef/{shef.rb → shell.rb} +35 -40
  350. data/lib/chef/shell/ext.rb +593 -0
  351. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  352. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  353. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +15 -13
  354. data/lib/chef/shell_out.rb +7 -0
  355. data/lib/chef/user.rb +182 -0
  356. data/lib/chef/util/backup.rb +84 -0
  357. data/lib/chef/util/diff.rb +145 -0
  358. data/lib/chef/util/file_edit.rb +1 -1
  359. data/lib/chef/util/selinux.rb +100 -0
  360. data/lib/chef/util/windows/net_group.rb +1 -5
  361. data/lib/chef/util/windows/net_user.rb +14 -1
  362. data/lib/chef/util/windows/volume.rb +2 -2
  363. data/lib/chef/version.rb +1 -1
  364. data/lib/chef/version/platform.rb +42 -0
  365. data/lib/chef/version_class.rb +1 -1
  366. data/lib/chef/version_constraint.rb +6 -5
  367. data/lib/chef/{index_queue.rb → version_constraint/platform.rb} +11 -14
  368. data/lib/chef/win32/api/file.rb +8 -2
  369. data/lib/chef/win32/api/security.rb +45 -1
  370. data/lib/chef/win32/registry.rb +382 -0
  371. data/lib/chef/win32/security.rb +19 -0
  372. data/lib/chef/win32/version.rb +25 -8
  373. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  374. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  375. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  376. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  377. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  378. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  379. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  380. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  381. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  382. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  383. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  384. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  385. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  386. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  387. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  388. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  389. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  390. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  391. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  392. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  393. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  394. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  395. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  396. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  397. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  398. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  399. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  400. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  401. data/spec/data/apt/var/www/apt/db/version +4 -0
  402. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  403. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  404. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  405. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  406. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  407. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  408. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  409. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  410. data/spec/data/bootstrap/secret.erb +9 -0
  411. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  412. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  413. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  414. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  415. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  416. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  417. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  418. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  419. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  420. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  421. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  422. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  423. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  424. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  425. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  426. data/spec/data/nodes/default.rb +3 -3
  427. data/spec/data/nodes/test.example.com.rb +3 -3
  428. data/spec/data/nodes/test.rb +3 -3
  429. data/spec/data/null_config.rb +1 -0
  430. data/spec/data/partial_one.erb +1 -0
  431. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  432. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  433. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  434. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  435. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  436. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  437. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  438. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  439. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  440. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  441. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  442. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  443. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  444. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  445. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  446. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  447. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  448. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  449. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  450. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  451. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  452. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  453. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  454. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  455. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  456. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  457. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  458. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  459. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  460. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  461. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  462. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  463. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  464. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  465. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  466. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  467. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  468. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  469. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  470. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  471. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  472. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  473. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  474. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  475. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  476. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  477. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  478. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  479. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  480. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  481. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  482. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  483. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  484. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  485. data/spec/data/shef-config.rb +10 -0
  486. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  487. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  488. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  489. data/spec/functional/knife/exec_spec.rb +3 -3
  490. data/spec/functional/knife/smoke_test.rb +34 -0
  491. data/spec/functional/knife/ssh_spec.rb +5 -1
  492. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  493. data/spec/functional/resource/batch_spec.rb +64 -0
  494. data/spec/functional/resource/cookbook_file_spec.rb +15 -9
  495. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  496. data/spec/functional/resource/directory_spec.rb +5 -1
  497. data/spec/functional/resource/file_spec.rb +71 -21
  498. data/spec/functional/resource/git_spec.rb +259 -0
  499. data/spec/functional/resource/link_spec.rb +424 -388
  500. data/spec/functional/resource/package_spec.rb +297 -0
  501. data/spec/functional/resource/powershell_spec.rb +188 -0
  502. data/spec/functional/resource/registry_spec.rb +576 -0
  503. data/spec/functional/resource/remote_directory_spec.rb +143 -37
  504. data/spec/functional/resource/remote_file_spec.rb +99 -13
  505. data/spec/functional/resource/template_spec.rb +180 -3
  506. data/spec/functional/resource/user_spec.rb +547 -0
  507. data/spec/functional/run_lock_spec.rb +243 -0
  508. data/spec/functional/shell_spec.rb +102 -0
  509. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  510. data/spec/functional/win32/security_spec.rb +37 -0
  511. data/spec/functional/win32/service_manager_spec.rb +269 -0
  512. data/spec/functional/win32/versions_spec.rb +78 -0
  513. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  514. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  515. data/spec/integration/knife/chefignore_spec.rb +271 -0
  516. data/spec/integration/knife/delete_spec.rb +944 -0
  517. data/spec/integration/knife/deps_spec.rb +648 -0
  518. data/spec/integration/knife/diff_spec.rb +536 -0
  519. data/spec/integration/knife/download_spec.rb +962 -0
  520. data/spec/integration/knife/list_spec.rb +633 -0
  521. data/spec/integration/knife/raw_spec.rb +166 -0
  522. data/spec/integration/knife/redirection_spec.rb +57 -0
  523. data/spec/integration/knife/show_spec.rb +158 -0
  524. data/spec/integration/knife/upload_spec.rb +1060 -0
  525. data/spec/integration/solo/solo_spec.rb +41 -0
  526. data/spec/spec_helper.rb +49 -13
  527. data/spec/stress/win32/security_spec.rb +1 -1
  528. data/spec/support/chef_helpers.rb +33 -3
  529. data/spec/support/lib/chef/resource/cat.rb +3 -5
  530. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  531. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  532. data/spec/support/platform_helpers.rb +46 -13
  533. data/spec/support/platforms/win32/spec_service.rb +59 -0
  534. data/spec/support/shared/functional/diff_disabled.rb +10 -0
  535. data/spec/support/shared/functional/directory_resource.rb +129 -38
  536. data/spec/support/shared/functional/file_resource.rb +837 -71
  537. data/spec/support/shared/functional/securable_resource.rb +189 -58
  538. data/spec/support/shared/functional/securable_resource_with_reporting.rb +385 -0
  539. data/spec/support/shared/integration/integration_helper.rb +166 -0
  540. data/spec/support/shared/integration/knife_support.rb +171 -0
  541. data/spec/support/shared/unit/execute_resource.rb +125 -0
  542. data/spec/support/shared/unit/file_system_support.rb +70 -0
  543. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  544. data/spec/support/shared/unit/provider/file.rb +609 -0
  545. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  546. data/spec/support/shared/unit/script_resource.rb +52 -0
  547. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  548. data/spec/tiny_server.rb +13 -11
  549. data/spec/unit/api_client/registration_spec.rb +172 -0
  550. data/spec/unit/api_client_spec.rb +78 -156
  551. data/spec/unit/application/apply.rb +84 -0
  552. data/spec/unit/application/client_spec.rb +16 -14
  553. data/spec/unit/application/knife_spec.rb +17 -0
  554. data/spec/unit/application/solo_spec.rb +1 -1
  555. data/spec/unit/application_spec.rb +113 -3
  556. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  557. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  558. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  559. data/spec/unit/chef_fs/file_system_spec.rb +135 -0
  560. data/spec/unit/client_spec.rb +195 -23
  561. data/spec/unit/config_spec.rb +102 -51
  562. data/spec/unit/cookbook/syntax_check_spec.rb +75 -111
  563. data/spec/unit/cookbook_loader_spec.rb +154 -91
  564. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  565. data/spec/unit/cookbook_spec.rb +3 -20
  566. data/spec/unit/cookbook_version_spec.rb +23 -122
  567. data/spec/unit/daemon_spec.rb +24 -19
  568. data/spec/unit/data_bag_spec.rb +13 -4
  569. data/spec/unit/deprecation_spec.rb +86 -0
  570. data/spec/unit/digester_spec.rb +50 -0
  571. data/spec/unit/dsl/data_query_spec.rb +66 -0
  572. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  573. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  574. data/spec/unit/encrypted_data_bag_item_spec.rb +197 -157
  575. data/spec/unit/environment_spec.rb +94 -126
  576. data/spec/unit/exceptions_spec.rb +8 -4
  577. data/spec/unit/file_access_control_spec.rb +21 -1
  578. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  579. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  580. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  581. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  582. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +6 -5
  583. data/spec/unit/json_compat_spec.rb +8 -0
  584. data/spec/unit/knife/bootstrap_spec.rb +130 -29
  585. data/spec/unit/knife/configure_spec.rb +64 -45
  586. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  587. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  588. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  589. data/spec/unit/knife/cookbook_upload_spec.rb +39 -0
  590. data/spec/unit/knife/core/bootstrap_context_spec.rb +79 -62
  591. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  592. data/spec/unit/knife/core/ui_spec.rb +196 -124
  593. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  594. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  595. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  596. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  597. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  598. data/spec/unit/knife/knife_help.rb +7 -7
  599. data/spec/unit/knife/node_edit_spec.rb +6 -33
  600. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  601. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  602. data/spec/unit/knife/ssh_spec.rb +12 -15
  603. data/spec/unit/knife/status_spec.rb +2 -2
  604. data/spec/unit/knife/user_create_spec.rb +86 -0
  605. data/spec/unit/knife/user_delete_spec.rb +39 -0
  606. data/spec/unit/knife/user_edit_spec.rb +42 -0
  607. data/spec/unit/knife/user_list_spec.rb +32 -0
  608. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  609. data/spec/unit/knife/user_show_spec.rb +41 -0
  610. data/spec/unit/knife_spec.rb +74 -0
  611. data/spec/unit/lwrp_spec.rb +102 -60
  612. data/spec/unit/mixin/checksum_spec.rb +2 -2
  613. data/spec/unit/mixin/deep_merge_spec.rb +130 -791
  614. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  615. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +7 -1
  616. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  617. data/spec/unit/mixin/securable_spec.rb +5 -3
  618. data/spec/unit/mixin/template_spec.rb +145 -14
  619. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  620. data/spec/unit/node/attribute_spec.rb +273 -173
  621. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  622. data/spec/unit/node_spec.rb +418 -370
  623. data/spec/unit/platform_spec.rb +21 -8
  624. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  625. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  626. data/spec/unit/provider/cookbook_file_spec.rb +26 -187
  627. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  628. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  629. data/spec/unit/provider/deploy_spec.rb +2 -2
  630. data/spec/unit/provider/directory_spec.rb +99 -67
  631. data/spec/unit/provider/env_spec.rb +2 -2
  632. data/spec/unit/provider/execute_spec.rb +27 -1
  633. data/spec/unit/provider/file/content_spec.rb +101 -0
  634. data/spec/unit/provider/file_spec.rb +25 -475
  635. data/spec/unit/provider/git_spec.rb +224 -28
  636. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  637. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  638. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  639. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  640. data/spec/unit/provider/group/pw_spec.rb +15 -12
  641. data/spec/unit/provider/group/usermod_spec.rb +9 -22
  642. data/spec/unit/provider/group/windows_spec.rb +8 -0
  643. data/spec/unit/provider/group_spec.rb +6 -28
  644. data/spec/unit/provider/http_request_spec.rb +28 -69
  645. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  646. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  647. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  648. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  649. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  650. data/spec/unit/provider/mount_spec.rb +16 -6
  651. data/spec/unit/provider/ohai_spec.rb +4 -4
  652. data/spec/unit/provider/package/apt_spec.rb +0 -1
  653. data/spec/unit/provider/package/ips_spec.rb +0 -1
  654. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  655. data/spec/unit/provider/package/rubygems_spec.rb +1 -1
  656. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  657. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  658. data/spec/unit/provider/package_spec.rb +7 -9
  659. data/spec/unit/provider/powershell_spec.rb +38 -0
  660. data/spec/unit/provider/registry_key_spec.rb +269 -0
  661. data/spec/unit/provider/remote_directory_spec.rb +7 -7
  662. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  663. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  664. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  665. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  666. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  667. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  668. data/spec/unit/provider/remote_file_spec.rb +33 -259
  669. data/spec/unit/provider/route_spec.rb +29 -12
  670. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  671. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  672. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  673. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  674. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  675. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  676. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  677. data/spec/unit/provider/service/macosx_spec.rb +176 -207
  678. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  679. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  680. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  681. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  682. data/spec/unit/provider/service/upstart_service_spec.rb +11 -11
  683. data/spec/unit/provider/service_spec.rb +3 -3
  684. data/spec/unit/provider/subversion_spec.rb +1 -1
  685. data/spec/unit/provider/template/content_spec.rb +78 -0
  686. data/spec/unit/provider/template_spec.rb +52 -160
  687. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  688. data/spec/unit/provider/user/solaris_spec.rb +39 -373
  689. data/spec/unit/provider/user/useradd_spec.rb +12 -379
  690. data/spec/unit/provider/user_spec.rb +1 -1
  691. data/spec/unit/recipe_spec.rb +10 -8
  692. data/spec/unit/registry_helper_spec.rb +376 -0
  693. data/spec/unit/resource/batch_spec.rb +48 -0
  694. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  695. data/spec/unit/resource/execute_spec.rb +3 -101
  696. data/spec/unit/resource/file_spec.rb +0 -5
  697. data/spec/unit/resource/group_spec.rb +9 -0
  698. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  699. data/spec/unit/resource/link_spec.rb +1 -0
  700. data/spec/unit/resource/mount_spec.rb +37 -11
  701. data/spec/unit/resource/powershell_spec.rb +48 -0
  702. data/spec/unit/resource/registry_key_spec.rb +171 -0
  703. data/spec/unit/resource/remote_file_spec.rb +63 -25
  704. data/spec/unit/resource/route_spec.rb +1 -1
  705. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  706. data/spec/unit/resource/script_spec.rb +13 -36
  707. data/spec/unit/resource/service_spec.rb +11 -0
  708. data/spec/unit/resource/template_spec.rb +111 -8
  709. data/spec/unit/resource/user_spec.rb +7 -0
  710. data/spec/unit/resource_collection_spec.rb +61 -32
  711. data/spec/unit/resource_reporter_spec.rb +115 -102
  712. data/spec/unit/resource_spec.rb +197 -5
  713. data/spec/unit/rest/auth_credentials_spec.rb +4 -21
  714. data/spec/unit/rest_spec.rb +134 -284
  715. data/spec/unit/run_context/cookbook_compiler_spec.rb +190 -0
  716. data/spec/unit/run_context_spec.rb +18 -4
  717. data/spec/unit/run_list_spec.rb +0 -209
  718. data/spec/unit/run_lock_spec.rb +37 -0
  719. data/spec/unit/runner_spec.rb +102 -3
  720. data/spec/unit/scan_access_control_spec.rb +8 -6
  721. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  722. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  723. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +16 -58
  724. data/spec/unit/shell_out_spec.rb +18 -0
  725. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  726. data/spec/unit/user_spec.rb +255 -0
  727. data/spec/unit/util/backup_spec.rb +149 -0
  728. data/spec/unit/util/diff_spec.rb +596 -0
  729. data/spec/unit/util/selinux_spec.rb +172 -0
  730. data/spec/unit/version/platform_spec.rb +61 -0
  731. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  732. data/spec/unit/version_constraint_spec.rb +5 -0
  733. metadata +493 -264
  734. data/README.rdoc +0 -177
  735. data/distro/common/html/knife-recipe.1.html +0 -92
  736. data/lib/chef/certificate.rb +0 -161
  737. data/lib/chef/checksum.rb +0 -167
  738. data/lib/chef/checksum_cache.rb +0 -190
  739. data/lib/chef/cookbook_version_selector.rb +0 -168
  740. data/lib/chef/couchdb.rb +0 -246
  741. data/lib/chef/index_queue/amqp_client.rb +0 -116
  742. data/lib/chef/index_queue/consumer.rb +0 -76
  743. data/lib/chef/index_queue/indexable.rb +0 -109
  744. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  745. data/lib/chef/monkey_patches/dir.rb +0 -36
  746. data/lib/chef/monkey_patches/moneta.rb +0 -50
  747. data/lib/chef/monkey_patches/uri.rb +0 -70
  748. data/lib/chef/openid_registration.rb +0 -187
  749. data/lib/chef/solr_query.rb +0 -187
  750. data/lib/chef/solr_query/lucene.treetop +0 -150
  751. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  752. data/lib/chef/solr_query/query_transform.rb +0 -65
  753. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  754. data/lib/chef/webui_user.rb +0 -231
  755. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  756. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  757. data/spec/data/mac_users/10.7.plist.xml +0 -559
  758. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  759. data/spec/data/mac_users/10.8.plist.xml +0 -559
  760. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  761. data/spec/data/mac_users/10.9.plist.xml +0 -560
  762. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  763. data/spec/functional/resource/base.rb +0 -40
  764. data/spec/functional/resource/group_spec.rb +0 -343
  765. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  766. data/spec/unit/certificate_spec.rb +0 -76
  767. data/spec/unit/checksum_cache_spec.rb +0 -209
  768. data/spec/unit/checksum_spec.rb +0 -94
  769. data/spec/unit/couchdb_spec.rb +0 -274
  770. data/spec/unit/index_queue_spec.rb +0 -391
  771. data/spec/unit/mixin/language_spec.rb +0 -305
  772. data/spec/unit/openid_registration_spec.rb +0 -153
  773. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  774. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  775. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  776. data/spec/unit/solr_query_spec.rb +0 -203
  777. data/spec/unit/webui_user_spec.rb +0 -238
@@ -43,7 +43,8 @@ class Chef
43
43
 
44
44
  def parse_ignore_file
45
45
  ignore_globs = []
46
- if File.exist?(@ignore_file) && File.readable?(@ignore_file)
46
+ if File.exist?(@ignore_file) && File.readable?(@ignore_file) &&
47
+ (File.file?(@ignore_file) || File.symlink?(@ignore_file))
47
48
  File.foreach(@ignore_file) do |line|
48
49
  ignore_globs << line.strip unless line =~ COMMENTS_AND_WHITESPACE
49
50
  end
@@ -21,7 +21,6 @@
21
21
  require 'chef/mash'
22
22
  require 'chef/mixin/from_file'
23
23
  require 'chef/mixin/params_validate'
24
- require 'chef/mixin/check_helper'
25
24
  require 'chef/log'
26
25
  require 'chef/version_class'
27
26
  require 'chef/version_constraint'
@@ -64,7 +63,6 @@ class Chef
64
63
  :provides => PROVIDING,
65
64
  :replaces => REPLACING }
66
65
 
67
- include Chef::Mixin::CheckHelper
68
66
  include Chef::Mixin::ParamsValidate
69
67
  include Chef::Mixin::FromFile
70
68
 
@@ -16,8 +16,9 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'chef/checksum_cache'
19
+ require 'pathname'
20
20
  require 'chef/mixin/shell_out'
21
+ require 'chef/mixin/checksum'
21
22
 
22
23
  class Chef
23
24
  class Cookbook
@@ -25,10 +26,65 @@ class Chef
25
26
  # Encapsulates the process of validating the ruby syntax of files in Chef
26
27
  # cookbooks.
27
28
  class SyntaxCheck
29
+
30
+ # == Chef::Cookbook::SyntaxCheck::PersistentSet
31
+ # Implements set behavior with disk-based persistence. Objects in the set
32
+ # are expected to be strings containing only characters that are valid in
33
+ # filenames.
34
+ #
35
+ # This class is used to track which files have been syntax checked so
36
+ # that known good files are not rechecked.
37
+ class PersistentSet
38
+
39
+ attr_reader :cache_path
40
+
41
+ # Create a new PersistentSet. Values in the set are persisted by
42
+ # creating a file in the +cache_path+ directory. If not given, the
43
+ # value of Chef::Config[:syntax_check_cache_path] is used; if that
44
+ # value is not configured, the value of
45
+ # Chef::Config[:cache_options][:path] is used.
46
+ #--
47
+ # history: prior to Chef 11, the cache implementation was based on
48
+ # moneta and configured via cache_options[:path]. Knife configs
49
+ # generated with Chef 11 will have `syntax_check_cache_path`, but older
50
+ # configs will have `cache_options[:path]`. `cache_options` is marked
51
+ # deprecated in chef/config.rb but doesn't currently trigger a warning.
52
+ # See also: CHEF-3715
53
+ def initialize(cache_path=nil)
54
+ @cache_path = cache_path || Chef::Config[:syntax_check_cache_path] || Chef::Config[:cache_options][:path]
55
+ @cache_path_created = false
56
+ end
57
+
58
+ # Adds +value+ to the set's collection.
59
+ def add(value)
60
+ ensure_cache_path_created
61
+ FileUtils.touch(File.join(cache_path, value))
62
+ end
63
+
64
+ # Returns true if the set includes +value+
65
+ def include?(value)
66
+ File.exist?(File.join(cache_path, value))
67
+ end
68
+
69
+ private
70
+
71
+ def ensure_cache_path_created
72
+ return true if @cache_path_created
73
+ FileUtils.mkdir_p(cache_path)
74
+ @cache_path_created = true
75
+ end
76
+
77
+ end
78
+
28
79
  include Chef::Mixin::ShellOut
80
+ include Chef::Mixin::Checksum
29
81
 
30
82
  attr_reader :cookbook_path
31
83
 
84
+ # A PersistentSet object that tracks which files have already been
85
+ # validated.
86
+ attr_reader :validated_files
87
+
32
88
  # Creates a new SyntaxCheck given the +cookbook_name+ and a +cookbook_path+.
33
89
  # If no +cookbook_path+ is given, +Chef::Config.cookbook_path+ is used.
34
90
  def self.for_cookbook(cookbook_name, cookbook_path=nil)
@@ -44,14 +100,25 @@ class Chef
44
100
  # cookbook_path::: the (on disk) path to the cookbook
45
101
  def initialize(cookbook_path)
46
102
  @cookbook_path = cookbook_path
103
+ @validated_files = PersistentSet.new
104
+ end
105
+
106
+ def chefignore
107
+ @chefignore ||= Chefignore.new(File.dirname(cookbook_path))
47
108
  end
48
109
 
49
- def cache
50
- Chef::ChecksumCache.instance
110
+ def remove_ignored_files(file_list)
111
+ return file_list unless chefignore.ignores.length > 0
112
+ file_list.reject do |full_path|
113
+ cookbook_pn = Pathname.new cookbook_path
114
+ full_pn = Pathname.new full_path
115
+ relative_pn = full_pn.relative_path_from cookbook_pn
116
+ chefignore.ignored? relative_pn.to_s
117
+ end
51
118
  end
52
119
 
53
120
  def ruby_files
54
- Dir[File.join(cookbook_path, '**', '*.rb')]
121
+ remove_ignored_files Dir[File.join(cookbook_path, '**', '*.rb')]
55
122
  end
56
123
 
57
124
  def untested_ruby_files
@@ -66,7 +133,7 @@ class Chef
66
133
  end
67
134
 
68
135
  def template_files
69
- Dir[File.join(cookbook_path, '**', '*.erb')]
136
+ remove_ignored_files Dir[File.join(cookbook_path, '**', '*.erb')]
70
137
  end
71
138
 
72
139
  def untested_template_files
@@ -81,16 +148,11 @@ class Chef
81
148
  end
82
149
 
83
150
  def validated?(file)
84
- !!cache.lookup_checksum(cache_key(file), File.stat(file))
151
+ validated_files.include?(checksum(file))
85
152
  end
86
153
 
87
154
  def validated(file)
88
- cache.generate_checksum(cache_key(file), file, File.stat(file))
89
- end
90
-
91
- def cache_key(file)
92
- @cache_keys ||= {}
93
- @cache_keys[file] ||= cache.generate_key(file, "chef-test")
155
+ validated_files.add(checksum(file))
94
156
  end
95
157
 
96
158
  def validate_ruby_files
@@ -118,7 +180,7 @@ class Chef
118
180
  result.stderr.each_line { |l| Chef::Log.fatal(l.chomp) }
119
181
  false
120
182
  end
121
-
183
+
122
184
  def validate_ruby_file(ruby_file)
123
185
  Chef::Log.debug("Testing #{ruby_file} for syntax errors...")
124
186
  result = shell_out("ruby -c #{ruby_file}")
@@ -130,7 +192,7 @@ class Chef
130
192
  result.stderr.each_line { |l| Chef::Log.fatal(l.chomp) }
131
193
  false
132
194
  end
133
-
195
+
134
196
  end
135
197
  end
136
198
  end
@@ -25,31 +25,36 @@ require 'chef/cookbook_version'
25
25
  require 'chef/cookbook/chefignore'
26
26
  require 'chef/cookbook/metadata'
27
27
 
28
+ #
29
+ # CookbookLoader class loads the cookbooks lazily as read
30
+ #
28
31
  class Chef
29
32
  class CookbookLoader
30
33
 
31
- attr_accessor :metadata
32
34
  attr_reader :cookbooks_by_name
33
35
  attr_reader :merged_cookbooks
34
36
  attr_reader :cookbook_paths
37
+ attr_reader :metadata
35
38
 
36
39
  include Enumerable
37
40
 
38
41
  def initialize(*repo_paths)
39
- @repo_paths = repo_paths.flatten
40
- raise ArgumentError, "You must specify at least one cookbook repo path" if @repo_paths.empty?
42
+ repo_paths = repo_paths.flatten
43
+ raise ArgumentError, "You must specify at least one cookbook repo path" if repo_paths.empty?
41
44
  @cookbooks_by_name = Mash.new
42
45
  @loaded_cookbooks = {}
43
46
  @metadata = Mash.new
44
47
  @cookbooks_paths = Hash.new {|h,k| h[k] = []} # for deprecation warnings
48
+ @chefignores = {}
49
+ @repo_paths = repo_paths.map do |repo_path|
50
+ repo_path = File.expand_path(repo_path)
51
+ end
45
52
 
46
53
  # Used to track which cookbooks appear in multiple places in the cookbook repos
47
54
  # and are merged in to a single cookbook by file shadowing. This behavior is
48
55
  # deprecated, so users of this class may issue warnings to the user by checking
49
56
  # this variable
50
57
  @merged_cookbooks = []
51
-
52
- load_cookbooks
53
58
  end
54
59
 
55
60
  def merged_cookbook_paths # for deprecation warnings
@@ -59,35 +64,43 @@ class Chef
59
64
  end
60
65
 
61
66
  def load_cookbooks
62
- cookbook_settings = Hash.new
63
67
  @repo_paths.each do |repo_path|
64
- repo_path = File.expand_path(repo_path)
65
- chefignore = Cookbook::Chefignore.new(repo_path)
66
68
  Dir[File.join(repo_path, "*")].each do |cookbook_path|
67
- next unless File.directory?(cookbook_path)
68
- loader = Cookbook::CookbookVersionLoader.new(cookbook_path, chefignore)
69
- loader.load_cookbooks
70
- next if loader.empty?
71
- @cookbooks_paths[loader.cookbook_name] << cookbook_path # for deprecation warnings
72
- if @loaded_cookbooks.key?(loader.cookbook_name)
73
- @merged_cookbooks << loader.cookbook_name # for deprecation warnings
74
- @loaded_cookbooks[loader.cookbook_name].merge!(loader)
75
- else
76
- @loaded_cookbooks[loader.cookbook_name] = loader
77
- end
69
+ load_cookbook(File.basename(cookbook_path), [repo_path])
70
+ end
71
+ end
72
+ @cookbooks_by_name
73
+ end
74
+
75
+ def load_cookbook(cookbook_name, repo_paths=nil)
76
+ repo_paths ||= @repo_paths
77
+ repo_paths.each do |repo_path|
78
+ @chefignores[repo_path] ||= Cookbook::Chefignore.new(repo_path)
79
+ cookbook_path = File.join(repo_path, cookbook_name.to_s)
80
+ next unless File.directory?(cookbook_path) and Dir[File.join(repo_path, "*")].include?(cookbook_path)
81
+ loader = Cookbook::CookbookVersionLoader.new(cookbook_path, @chefignores[repo_path])
82
+ loader.load_cookbooks
83
+ next if loader.empty?
84
+ cookbook_name = loader.cookbook_name
85
+ @cookbooks_paths[cookbook_name] << cookbook_path # for deprecation warnings
86
+ if @loaded_cookbooks.key?(cookbook_name)
87
+ @merged_cookbooks << cookbook_name # for deprecation warnings
88
+ @loaded_cookbooks[cookbook_name].merge!(loader)
89
+ else
90
+ @loaded_cookbooks[cookbook_name] = loader
78
91
  end
79
92
  end
80
93
 
81
- @loaded_cookbooks.each do |cookbook, loader|
82
- cookbook_version = loader.cookbook_version
83
- @cookbooks_by_name[cookbook] = cookbook_version
84
- @metadata[cookbook] = cookbook_version.metadata
94
+ if @loaded_cookbooks.has_key?(cookbook_name)
95
+ cookbook_version = @loaded_cookbooks[cookbook_name].cookbook_version
96
+ @cookbooks_by_name[cookbook_name] = cookbook_version
97
+ @metadata[cookbook_name] = cookbook_version.metadata
85
98
  end
86
- @cookbooks_by_name
99
+ @cookbooks_by_name[cookbook_name]
87
100
  end
88
101
 
89
102
  def [](cookbook)
90
- if @cookbooks_by_name.has_key?(cookbook.to_sym)
103
+ if @cookbooks_by_name.has_key?(cookbook.to_sym) or load_cookbook(cookbook.to_sym)
91
104
  @cookbooks_by_name[cookbook.to_sym]
92
105
  else
93
106
  raise Exceptions::CookbookNotFoundInRepo, "Cannot find a cookbook named #{cookbook.to_s}; did you forget to add metadata to a cookbook? (http://wiki.opscode.com/display/chef/Metadata)"
@@ -97,7 +110,7 @@ class Chef
97
110
  alias :fetch :[]
98
111
 
99
112
  def has_key?(cookbook_name)
100
- @cookbooks_by_name.has_key?(cookbook_name)
113
+ not self[cookbook_name.to_sym].nil?
101
114
  end
102
115
  alias :cookbook_exists? :has_key?
103
116
  alias :key? :has_key?
@@ -3,11 +3,11 @@ require 'set'
3
3
  require 'rest_client'
4
4
  require 'chef/exceptions'
5
5
  require 'chef/knife/cookbook_metadata'
6
- require 'chef/checksum_cache'
7
- require 'chef/sandbox'
6
+ require 'chef/digester'
8
7
  require 'chef/cookbook_version'
9
8
  require 'chef/cookbook/syntax_check'
10
9
  require 'chef/cookbook/file_system_file_vendor'
10
+ require 'chef/sandbox'
11
11
 
12
12
  class Chef
13
13
  class CookbookUploader
@@ -134,17 +134,24 @@ class Chef
134
134
  # but we need the base64 encoding for the content-md5
135
135
  # header
136
136
  checksum64 = Base64.encode64([checksum].pack("H*")).strip
137
+ timestamp = Time.now.utc.iso8601
137
138
  file_contents = File.open(file, "rb") {|f| f.read}
138
- headers = { 'content-type' => 'application/x-binary', 'content-md5' => checksum64, 'accept' => 'application/json' }
139
+ # TODO - 5/28/2010, cw: make signing and sending the request streaming
140
+ sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(
141
+ :http_method => :put,
142
+ :path => URI.parse(url).path,
143
+ :body => file_contents,
144
+ :timestamp => timestamp,
145
+ :user_id => rest.client_name
146
+ )
147
+ headers = { 'content-type' => 'application/x-binary', 'content-md5' => checksum64, :accept => 'application/json' }
148
+ headers.merge!(sign_obj.sign(OpenSSL::PKey::RSA.new(rest.signing_key)))
139
149
 
140
150
  begin
141
- url = rest.create_url(url)
142
- rest.raw_http_request(:PUT, url, headers, file_contents)
151
+ RestClient::Resource.new(url, :headers=>headers, :timeout=>1800, :open_timeout=>1800).put(file_contents)
143
152
  checksums_to_upload.delete(checksum)
144
- rescue Net::HTTPServerException, Net::HTTPFatalError, Errno::ECONNREFUSED, Timeout::Error, Errno::ETIMEDOUT, SocketError => e
145
- error_message = "Failed to upload #{file} (#{checksum}) to #{url} : #{e.message}"
146
- error_message << "\n#{e.response.body}" if e.respond_to?(:response)
147
- Chef::Knife.ui.error(error_message)
153
+ rescue RestClient::Exception => e
154
+ Chef::Knife.ui.error("Failed to upload #@cookbook : #{e.message}\n#{e.response.body}")
148
155
  raise
149
156
  end
150
157
  end
@@ -24,86 +24,11 @@ require 'chef/node'
24
24
  require 'chef/resource_definition_list'
25
25
  require 'chef/recipe'
26
26
  require 'chef/cookbook/file_vendor'
27
- require 'chef/checksum'
28
27
  require 'chef/cookbook/metadata'
29
28
  require 'chef/version_class'
30
29
 
31
30
  class Chef
32
31
 
33
- #== Chef::MinimalCookbookVersion
34
- # MinimalCookbookVersion is a duck type of CookbookVersion, used
35
- # internally by Chef Server as an optimization when determining the
36
- # optimal cookbook set for a chef-client.
37
- #
38
- # MinimalCookbookVersion objects contain only enough information to
39
- # solve the cookbook collection for a given run list. They *do not*
40
- # contain enough information to generate the response.
41
- #
42
- # See also: Chef::CookbookVersionSelector
43
- class MinimalCookbookVersion
44
-
45
- include Comparable
46
-
47
- ID = "id".freeze
48
- NAME = 'name'.freeze
49
- KEY = 'key'.freeze
50
- VERSION = 'version'.freeze
51
- VALUE = 'value'.freeze
52
- DEPS = 'deps'.freeze
53
-
54
- DEPENDENCIES = 'dependencies'.freeze
55
-
56
- # Loads the full list of cookbooks, using a couchdb view to fetch
57
- # only the id, name, version, and dependency constraints. This is
58
- # enough information to solve for the cookbook collection for a
59
- # given run list. After solving for the cookbook collection, you
60
- # need to call +load_full_versions_of+ to convert
61
- # MinimalCookbookVersion objects to their non-minimal counterparts
62
- def self.load_all(couchdb)
63
- # Example:
64
- # {"id"=>"1a806f1c-b409-4d8e-abab-fa414ff5b96d", "key"=>"activemq", "value"=>{"version"=>"0.3.3", "deps"=>{"java"=>">= 0.0.0", "runit"=>">= 0.0.0"}}}
65
- couchdb ||= Chef::CouchDB.new
66
- couchdb.get_view("cookbooks", "all_with_version_and_deps")["rows"].map {|params| self.new(params) }
67
- end
68
-
69
- # Loads the non-minimal CookbookVersion objects corresponding to
70
- # +minimal_cookbook_versions+ from couchdb using a bulk GET.
71
- def self.load_full_versions_of(minimal_cookbook_versions, couchdb)
72
- database_ids = Array(minimal_cookbook_versions).map {|mcv| mcv.couchdb_id }
73
- couchdb ||= Chef::CouchDB.new
74
- couchdb.bulk_get(*database_ids)
75
- end
76
-
77
- attr_reader :couchdb_id
78
- attr_reader :name
79
- attr_reader :version
80
- attr_reader :deps
81
-
82
- def initialize(params)
83
- @couchdb_id = params[ID]
84
- @name = params[KEY]
85
- @version = params[VALUE][VERSION]
86
- @deps = params[VALUE][DEPS]
87
- end
88
-
89
- # Returns the Cookbook::MinimalMetadata object for this cookbook
90
- # version.
91
- def metadata
92
- @metadata ||= Cookbook::MinimalMetadata.new(@name, DEPENDENCIES => @deps)
93
- end
94
-
95
- def legit_version
96
- @legit_version ||= Chef::Version.new(@version)
97
- end
98
-
99
- def <=>(o)
100
- raise Chef::Exceptions::CookbookVersionNameMismatch if self.name != o.name
101
- raise "Unexpected comparison to #{o}" unless o.respond_to?(:legit_version)
102
- legit_version <=> o.legit_version
103
- end
104
- end
105
-
106
-
107
32
  # == Chef::CookbookVersion
108
33
  # CookbookVersion is a model object encapsulating the data about a Chef
109
34
  # cookbook. Chef supports maintaining multiple versions of a cookbook on a
@@ -113,140 +38,10 @@ class Chef
113
38
  # TODO: timh/cw: 5-24-2010: mutators for files (e.g., recipe_filenames=,
114
39
  # recipe_filenames.insert) should dirty the manifest so it gets regenerated.
115
40
  class CookbookVersion
116
- include Chef::IndexQueue::Indexable
117
41
  include Comparable
118
42
 
119
43
  COOKBOOK_SEGMENTS = [ :resources, :providers, :recipes, :definitions, :libraries, :attributes, :files, :templates, :root_files ]
120
44
 
121
- DESIGN_DOCUMENT = {
122
- "version" => 8,
123
- "language" => "javascript",
124
- "views" => {
125
- "all" => {
126
- "map" => <<-EOJS
127
- function(doc) {
128
- if (doc.chef_type == "cookbook_version") {
129
- emit(doc.name, doc);
130
- }
131
- }
132
- EOJS
133
- },
134
- "all_id" => {
135
- "map" => <<-EOJS
136
- function(doc) {
137
- if (doc.chef_type == "cookbook_version") {
138
- emit(doc.name, doc.name);
139
- }
140
- }
141
- EOJS
142
- },
143
- "all_with_version" => {
144
- "map" => <<-EOJS
145
- function(doc) {
146
- if (doc.chef_type == "cookbook_version") {
147
- emit(doc.cookbook_name, doc.version);
148
- }
149
- }
150
- EOJS
151
- },
152
- "all_with_version_and_deps" => {
153
- "map" => <<-JS
154
- function(doc) {
155
- if (doc.chef_type == "cookbook_version") {
156
- emit(doc.cookbook_name, {version: doc.version, deps: doc.metadata.dependencies});
157
- }
158
- }
159
- JS
160
- },
161
- "all_latest_version" => {
162
- "map" => %q@
163
- function(doc) {
164
- if (doc.chef_type == "cookbook_version") {
165
- emit(doc.cookbook_name, doc.version);
166
- }
167
- }
168
- @,
169
- "reduce" => %q@
170
- function(keys, values, rereduce) {
171
- var result = null;
172
-
173
- for (var idx in values) {
174
- var value = values[idx];
175
-
176
- if (idx == 0) {
177
- result = value;
178
- continue;
179
- }
180
-
181
- var valueParts = value.split('.').map(function(v) { return parseInt(v); });
182
- var resultParts = result.split('.').map(function(v) { return parseInt(v); });
183
-
184
- if (valueParts[0] != resultParts[0]) {
185
- if (valueParts[0] > resultParts[0]) {
186
- result = value;
187
- }
188
- }
189
- else if (valueParts[1] != resultParts[1]) {
190
- if (valueParts[1] > resultParts[1]) {
191
- result = value;
192
- }
193
- }
194
- else if (valueParts[2] != resultParts[2]) {
195
- if (valueParts[2] > resultParts[2]) {
196
- result = value;
197
- }
198
- }
199
- }
200
- return result;
201
- }
202
- @
203
- },
204
- "all_latest_version_by_id" => {
205
- "map" => %q@
206
- function(doc) {
207
- if (doc.chef_type == "cookbook_version") {
208
- emit(doc.cookbook_name, {version: doc.version, id:doc._id});
209
- }
210
- }
211
- @,
212
- "reduce" => %q@
213
- function(keys, values, rereduce) {
214
- var result = null;
215
-
216
- for (var idx in values) {
217
- var value = values[idx];
218
-
219
- if (idx == 0) {
220
- result = value;
221
- continue;
222
- }
223
-
224
- var valueParts = value.version.split('.').map(function(v) { return parseInt(v); });
225
- var resultParts = result.version.split('.').map(function(v) { return parseInt(v); });
226
-
227
- if (valueParts[0] != resultParts[0]) {
228
- if (valueParts[0] > resultParts[0]) {
229
- result = value;
230
- }
231
- }
232
- else if (valueParts[1] != resultParts[1]) {
233
- if (valueParts[1] > resultParts[1]) {
234
- result = value;
235
- }
236
- }
237
- else if (valueParts[2] != resultParts[2]) {
238
- if (valueParts[2] > resultParts[2]) {
239
- result = value;
240
- }
241
- }
242
- }
243
- return result;
244
- }
245
- @
246
- },
247
- }
248
- }
249
-
250
45
  attr_accessor :root_dir
251
46
  attr_accessor :definition_filenames
252
47
  attr_accessor :template_filenames
@@ -259,10 +54,6 @@ class Chef
259
54
  attr_accessor :metadata
260
55
  attr_accessor :metadata_filenames
261
56
  attr_accessor :status
262
- attr_accessor :couchdb_rev
263
- attr_accessor :couchdb
264
-
265
- attr_reader :couchdb_id
266
57
 
267
58
  # attribute_filenames also has a setter that has non-default
268
59
  # functionality.
@@ -278,7 +69,7 @@ class Chef
278
69
  # This is the one and only method that knows how cookbook files'
279
70
  # checksums are generated.
280
71
  def self.checksum_cookbook_file(filepath)
281
- Chef::ChecksumCache.generate_md5_checksum_for_file(filepath)
72
+ Chef::Digester.generate_md5_checksum_for_file(filepath)
282
73
  rescue Errno::ENOENT
283
74
  Chef::Log.debug("File #{filepath} does not exist, so there is no checksum to generate")
284
75
  nil
@@ -288,120 +79,11 @@ class Chef
288
79
  Chef::FileCache
289
80
  end
290
81
 
291
- # Synchronizes all the cookbooks from the chef-server.
292
- #
293
- # === Returns
294
- # true:: Always returns true
295
- def self.sync_cookbooks(cookbook_hash)
296
- Chef::Log.info("Loading cookbooks [#{cookbook_hash.keys.sort.join(', ')}]")
297
- Chef::Log.debug("Cookbooks detail: #{cookbook_hash.inspect}")
298
-
299
- clear_obsoleted_cookbooks(cookbook_hash)
300
-
301
- # Synchronize each of the node's cookbooks, and add to the
302
- # valid_cache_entries hash.
303
- cookbook_hash.values.each do |cookbook|
304
- sync_cookbook_file_cache(cookbook)
305
- end
306
-
307
- true
308
- end
309
-
310
- # Iterates over cached cookbooks' files, removing files belonging to
311
- # cookbooks that don't appear in +cookbook_hash+
312
- def self.clear_obsoleted_cookbooks(cookbook_hash)
313
- # Remove all cookbooks no longer relevant to this node
314
- cache.find(File.join(%w{cookbooks ** *})).each do |cache_file|
315
- cache_file =~ /^cookbooks\/([^\/]+)\//
316
- unless cookbook_hash.has_key?($1)
317
- Chef::Log.info("Removing #{cache_file} from the cache; its cookbook is no longer needed on this client.")
318
- cache.delete(cache_file)
319
- end
320
- end
321
- end
322
-
323
- # Update the file caches for a given cache segment. Takes a segment name
324
- # and a hash that matches one of the cookbooks/_attribute_files style
325
- # remote file listings.
326
- #
327
- # === Parameters
328
- # cookbook<Chef::Cookbook>:: The cookbook to update
329
- # valid_cache_entries<Hash>:: Out-param; Added to this hash are the files that
330
- # were referred to by this cookbook
331
- def self.sync_cookbook_file_cache(cookbook)
332
- Chef::Log.debug("Synchronizing cookbook #{cookbook.name}")
333
-
334
- # files and templates are lazily loaded, and will be done later.
335
- eager_segments = COOKBOOK_SEGMENTS.dup
336
-
337
- unless Chef::Config[:no_lazy_load] then
338
- eager_segments.delete(:files)
339
- eager_segments.delete(:templates)
340
- end
341
-
342
- eager_segments.each do |segment|
343
- segment_filenames = Array.new
344
- cookbook.manifest[segment].each do |manifest_record|
345
- # segment = cookbook segment
346
- # remote_list = list of file hashes
347
- #
348
- # We need the list of known good attribute files, so we can delete any that are
349
- # just laying about.
350
-
351
- cache_filename = File.join("cookbooks", cookbook.name, manifest_record['path'])
352
- valid_cache_entries[cache_filename] = true
353
-
354
- current_checksum = nil
355
- if cache.has_key?(cache_filename)
356
- current_checksum = checksum_cookbook_file(cache.load(cache_filename, false))
357
- end
358
-
359
- # If the checksums are different between on-disk (current) and on-server
360
- # (remote, per manifest), do the update. This will also execute if there
361
- # is no current checksum.
362
- if current_checksum != manifest_record['checksum']
363
- raw_file = chef_server_rest.get_rest(manifest_record[:url], true)
364
-
365
- Chef::Log.info("Storing updated #{cache_filename} in the cache.")
366
- cache.move_to(raw_file.path, cache_filename)
367
- else
368
- Chef::Log.debug("Not storing #{cache_filename}, as the cache is up to date.")
369
- end
370
-
371
- # make the segment filenames a full path.
372
- full_path_cache_filename = cache.load(cache_filename, false)
373
- segment_filenames << full_path_cache_filename
374
- end
375
-
376
- # replace segment filenames with a full-path one.
377
- if segment.to_sym == :recipes
378
- cookbook.recipe_filenames = segment_filenames
379
- elsif segment.to_sym == :attributes
380
- cookbook.attribute_filenames = segment_filenames
381
- else
382
- cookbook.segment_filenames(segment).replace(segment_filenames)
383
- end
384
- end
385
- end
386
-
387
- def self.cleanup_file_cache
388
- unless Chef::Config[:solo]
389
- # Delete each file in the cache that we didn't encounter in the
390
- # manifest.
391
- cache.find(File.join(%w{cookbooks ** *})).each do |cache_filename|
392
- unless valid_cache_entries[cache_filename]
393
- Chef::Log.info("Removing #{cache_filename} from the cache; it is no longer needed by chef-client.")
394
- cache.delete(cache_filename)
395
- end
396
- end
397
- end
398
- end
399
-
400
82
  # Creates a new Chef::CookbookVersion object.
401
83
  #
402
84
  # === Returns
403
85
  # object<Chef::CookbookVersion>:: Duh. :)
404
- def initialize(name, couchdb=nil)
86
+ def initialize(name)
405
87
  @name = name
406
88
  @frozen = false
407
89
  @attribute_filenames = Array.new
@@ -416,9 +98,6 @@ class Chef
416
98
  @metadata_filenames = Array.new
417
99
  @root_dir = nil
418
100
  @root_filenames = Array.new
419
- @couchdb_id = nil
420
- @couchdb = couchdb || Chef::CouchDB.new
421
- @couchdb_rev = nil
422
101
  @status = :ready
423
102
  @manifest = nil
424
103
  @file_vendor = nil
@@ -761,7 +440,6 @@ class Chef
761
440
  result = manifest.dup
762
441
  result['frozen?'] = frozen_version?
763
442
  result['chef_type'] = 'cookbook_version'
764
- result["_rev"] = couchdb_rev if couchdb_rev
765
443
  result.to_hash
766
444
  end
767
445
 
@@ -773,15 +451,6 @@ class Chef
773
451
 
774
452
  def self.json_create(o)
775
453
  cookbook_version = new(o["cookbook_name"])
776
- if o.has_key?('_rev')
777
- cookbook_version.couchdb_rev = o["_rev"] if o.has_key?("_rev")
778
- o.delete("_rev")
779
- end
780
- if o.has_key?("_id")
781
- cookbook_version.couchdb_id = o["_id"] if o.has_key?("_id")
782
- cookbook_version.index_id = cookbook_version.couchdb_id
783
- o.delete("_id")
784
- end
785
454
  # We want the Chef::Cookbook::Metadata object to always be inflated
786
455
  cookbook_version.metadata = Chef::Cookbook::Metadata.from_hash(o["metadata"])
787
456
  cookbook_version.manifest = o
@@ -888,83 +557,6 @@ class Chef
888
557
  chef_server_rest.get_rest('cookbooks/_latest')
889
558
  end
890
559
 
891
- ##
892
- # Couchdb
893
- ##
894
-
895
- def self.cdb_by_name(cookbook_name, couchdb=nil)
896
- cdb = (couchdb || Chef::CouchDB.new)
897
- options = { :startkey => cookbook_name, :endkey => cookbook_name }
898
- rs = cdb.get_view("cookbooks", "all_with_version", options)
899
- rs["rows"].inject({}) { |memo, row| memo.has_key?(row["key"]) ? memo[row["key"]] << row["value"] : memo[row["key"]] = [ row["value"] ]; memo }
900
- end
901
-
902
- def self.create_design_document(couchdb=nil)
903
- (couchdb || Chef::CouchDB.new).create_design_document("cookbooks", DESIGN_DOCUMENT)
904
- end
905
-
906
- def self.cdb_list_latest(inflate=false, couchdb=nil)
907
- couchdb ||= Chef::CouchDB.new
908
- if inflate
909
- doc_ids = cdb_list_latest_ids.map {|i|i["id"]}
910
- couchdb.bulk_get(doc_ids)
911
- else
912
- results = couchdb.get_view("cookbooks", "all_latest_version", :group=>true)["rows"]
913
- results.inject({}) { |mapped, row| mapped[row["key"]] = row["value"]; mapped}
914
- end
915
- end
916
-
917
- def self.cdb_list_latest_ids(inflate=false, couchdb=nil)
918
- couchdb ||= Chef::CouchDB.new
919
- results = couchdb.get_view("cookbooks", "all_latest_version_by_id", :group=>true)["rows"]
920
- results.map { |name_and_id| name_and_id["value"]}
921
- end
922
-
923
- def self.cdb_list(inflate=false, couchdb=nil)
924
- couchdb ||= Chef::CouchDB.new
925
- if inflate
926
- couchdb.list("cookbooks", true)["rows"].collect{|r| r["value"]}
927
- else
928
- # If you modify this, please make sure the desc sorted order on the versions doesn't get broken.
929
- couchdb.get_view("cookbooks", "all_with_version")["rows"].inject({}) { |mapped, row| mapped[row["key"]]||=Array.new; mapped[row["key"]].push(Chef::Version.new(row["value"])); mapped[row["key"]].sort!.reverse!; mapped}
930
- end
931
- end
932
-
933
- def self.cdb_load(name, version='latest', couchdb=nil)
934
- cdb = couchdb || Chef::CouchDB.new
935
- if version == "latest" || version == "_latest"
936
- rs = cdb.get_view("cookbooks", "all_latest_version", :key => name, :descending => true, :group => true, :reduce => true)["rows"].first
937
- cdb.load("cookbook_version", "#{rs["key"]}-#{rs["value"]}")
938
- else
939
- cdb.load("cookbook_version", "#{name}-#{version}")
940
- end
941
- end
942
-
943
- def cdb_destroy
944
- (couchdb || Chef::CouchDB.new).delete("cookbook_version", full_name, couchdb_rev)
945
- end
946
-
947
- # Runs on Chef Server (API); deletes the cookbook from couchdb and also destroys associated
948
- # checksum documents
949
- def purge
950
- checksums.keys.each do |checksum|
951
- begin
952
- Chef::Checksum.cdb_load(checksum, couchdb).purge
953
- rescue Chef::Exceptions::CouchDBNotFound
954
- end
955
- end
956
- cdb_destroy
957
- end
958
-
959
- def cdb_save
960
- @couchdb_rev = couchdb.store("cookbook_version", full_name, self)["rev"]
961
- end
962
-
963
- def couchdb_id=(value)
964
- @couchdb_id = value
965
- @index_id = value
966
- end
967
-
968
560
  def <=>(o)
969
561
  raise Chef::Exceptions::CookbookVersionNameMismatch if self.name != o.name
970
562
  # FIXME: can we change the interface to the Metadata class such