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
@@ -0,0 +1,962 @@
1
+ #
2
+ # Author:: John Keiser (<jkeiser@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'support/shared/integration/integration_helper'
19
+ require 'chef/knife/download'
20
+ require 'chef/knife/diff'
21
+
22
+ describe 'knife download' do
23
+ extend IntegrationSupport
24
+ include KnifeSupport
25
+
26
+ context 'without versioned cookbooks' do
27
+ when_the_chef_server "has one of each thing" do
28
+ client 'x', {}
29
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
30
+ data_bag 'x', { 'y' => {} }
31
+ environment 'x', {}
32
+ node 'x', {}
33
+ role 'x', {}
34
+ user 'x', {}
35
+
36
+ when_the_repository 'has only top-level directories' do
37
+ directory 'clients'
38
+ directory 'cookbooks'
39
+ directory 'data_bags'
40
+ directory 'environments'
41
+ directory 'nodes'
42
+ directory 'roles'
43
+ directory 'users'
44
+
45
+ it 'knife download downloads everything' do
46
+ knife('download /').should_succeed <<EOM
47
+ Created /clients/chef-validator.json
48
+ Created /clients/chef-webui.json
49
+ Created /clients/x.json
50
+ Created /cookbooks/x
51
+ Created /cookbooks/x/metadata.rb
52
+ Created /data_bags/x
53
+ Created /data_bags/x/y.json
54
+ Created /environments/_default.json
55
+ Created /environments/x.json
56
+ Created /nodes/x.json
57
+ Created /roles/x.json
58
+ Created /users/admin.json
59
+ Created /users/x.json
60
+ EOM
61
+ knife('diff --name-status /').should_succeed ''
62
+ end
63
+ end
64
+
65
+ when_the_repository 'has an identical copy of each thing' do
66
+ file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
67
+ file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
68
+ file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
69
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
70
+ file 'data_bags/x/y.json', {}
71
+ file 'environments/_default.json', { "description" => "The default Chef environment" }
72
+ file 'environments/x.json', {}
73
+ file 'nodes/x.json', {}
74
+ file 'roles/x.json', {}
75
+ file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
76
+ file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
77
+
78
+ it 'knife download makes no changes' do
79
+ knife('download /').should_succeed ''
80
+ knife('diff --name-status /').should_succeed ''
81
+ end
82
+
83
+ it 'knife download --purge makes no changes' do
84
+ knife('download --purge /').should_succeed ''
85
+ knife('diff --name-status /').should_succeed ''
86
+ end
87
+
88
+ context 'except the role file' do
89
+ file 'roles/x.json', <<EOM
90
+ {
91
+ "chef_type": "role",
92
+ "default_attributes": {
93
+ },
94
+ "description": "blarghle",
95
+ "env_run_lists": {
96
+ },
97
+ "json_class": "Chef::Role",
98
+ "name": "x",
99
+ "override_attributes": {
100
+ },
101
+ "run_list": [
102
+
103
+ ]
104
+ }
105
+ EOM
106
+ it 'knife download changes the role' do
107
+ knife('download /').should_succeed "Updated /roles/x.json\n"
108
+ knife('diff --name-status /').should_succeed ''
109
+ end
110
+
111
+ it 'knife download --no-diff does not change the role' do
112
+ knife('download --no-diff /').should_succeed ''
113
+ knife('diff --name-status /').should_succeed "M\t/roles/x.json\n"
114
+ end
115
+ end
116
+
117
+ context 'except the role file is textually different, but not ACTUALLY different' do
118
+ file 'roles/x.json', <<EOM
119
+ {
120
+ "chef_type": "role",
121
+ "default_attributes": {
122
+ },
123
+ "env_run_lists": {
124
+ },
125
+ "json_class": "Chef::Role",
126
+ "name": "x",
127
+ "description": "",
128
+ "override_attributes": {
129
+ },
130
+ "run_list": [
131
+
132
+ ]
133
+ }
134
+ EOM
135
+ it 'knife download / does not change anything' do
136
+ knife('download /').should_succeed ''
137
+ knife('diff --name-status /').should_succeed ''
138
+ end
139
+ end
140
+
141
+ context 'as well as one extra copy of each thing' do
142
+ file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
143
+ file 'cookbooks/x/blah.rb', ''
144
+ file 'cookbooks/y/metadata.rb', 'version "1.0.0"'
145
+ file 'data_bags/x/z.json', {}
146
+ file 'data_bags/y/zz.json', {}
147
+ file 'environments/y.json', {}
148
+ file 'nodes/y.json', {}
149
+ file 'roles/y.json', {}
150
+ file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
151
+
152
+ it 'knife download does nothing' do
153
+ knife('download /').should_succeed ''
154
+ knife('diff --name-status /').should_succeed <<EOM
155
+ A\t/clients/y.json
156
+ A\t/cookbooks/x/blah.rb
157
+ A\t/cookbooks/y
158
+ A\t/data_bags/x/z.json
159
+ A\t/data_bags/y
160
+ A\t/environments/y.json
161
+ A\t/nodes/y.json
162
+ A\t/roles/y.json
163
+ A\t/users/y.json
164
+ EOM
165
+ end
166
+
167
+ it 'knife download --purge deletes the extra files' do
168
+ knife('download --purge /').should_succeed <<EOM
169
+ Deleted extra entry /clients/y.json (purge is on)
170
+ Deleted extra entry /cookbooks/x/blah.rb (purge is on)
171
+ Deleted extra entry /cookbooks/y (purge is on)
172
+ Deleted extra entry /data_bags/x/z.json (purge is on)
173
+ Deleted extra entry /data_bags/y (purge is on)
174
+ Deleted extra entry /environments/y.json (purge is on)
175
+ Deleted extra entry /nodes/y.json (purge is on)
176
+ Deleted extra entry /roles/y.json (purge is on)
177
+ Deleted extra entry /users/y.json (purge is on)
178
+ EOM
179
+ knife('diff --name-status /').should_succeed ''
180
+ end
181
+ end
182
+ end
183
+
184
+ when_the_repository 'is empty' do
185
+ it 'knife download creates the extra files' do
186
+ knife('download /').should_succeed <<EOM
187
+ Created /clients
188
+ Created /clients/chef-validator.json
189
+ Created /clients/chef-webui.json
190
+ Created /clients/x.json
191
+ Created /cookbooks
192
+ Created /cookbooks/x
193
+ Created /cookbooks/x/metadata.rb
194
+ Created /data_bags
195
+ Created /data_bags/x
196
+ Created /data_bags/x/y.json
197
+ Created /environments
198
+ Created /environments/_default.json
199
+ Created /environments/x.json
200
+ Created /nodes
201
+ Created /nodes/x.json
202
+ Created /roles
203
+ Created /roles/x.json
204
+ Created /users
205
+ Created /users/admin.json
206
+ Created /users/x.json
207
+ EOM
208
+ knife('diff --name-status /').should_succeed ''
209
+ end
210
+
211
+ it 'knife download --no-diff creates the extra files' do
212
+ knife('download --no-diff /').should_succeed <<EOM
213
+ Created /clients
214
+ Created /clients/chef-validator.json
215
+ Created /clients/chef-webui.json
216
+ Created /clients/x.json
217
+ Created /cookbooks
218
+ Created /cookbooks/x
219
+ Created /cookbooks/x/metadata.rb
220
+ Created /data_bags
221
+ Created /data_bags/x
222
+ Created /data_bags/x/y.json
223
+ Created /environments
224
+ Created /environments/_default.json
225
+ Created /environments/x.json
226
+ Created /nodes
227
+ Created /nodes/x.json
228
+ Created /roles
229
+ Created /roles/x.json
230
+ Created /users
231
+ Created /users/admin.json
232
+ Created /users/x.json
233
+ EOM
234
+ knife('diff --name-status /').should_succeed ''
235
+ end
236
+
237
+ context 'when current directory is top level' do
238
+ cwd '.'
239
+ it 'knife download with no parameters reports an error' do
240
+ knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
241
+ end
242
+ end
243
+ end
244
+ end
245
+
246
+ # Test download of an item when the other end doesn't even have the container
247
+ when_the_repository 'is empty' do
248
+ when_the_chef_server 'has two data bag items' do
249
+ data_bag 'x', { 'y' => {}, 'z' => {} }
250
+
251
+ it 'knife download of one data bag item itself succeeds' do
252
+ knife('download /data_bags/x/y.json').should_succeed <<EOM
253
+ Created /data_bags
254
+ Created /data_bags/x
255
+ Created /data_bags/x/y.json
256
+ EOM
257
+ knife('diff --name-status /data_bags').should_succeed <<EOM
258
+ D\t/data_bags/x/z.json
259
+ EOM
260
+ end
261
+ end
262
+ end
263
+
264
+ when_the_repository 'has three data bag items' do
265
+ file 'data_bags/x/deleted.json', <<EOM
266
+ {
267
+ "id": "deleted"
268
+ }
269
+ EOM
270
+ file 'data_bags/x/modified.json', <<EOM
271
+ {
272
+ "id": "modified"
273
+ }
274
+ EOM
275
+ file 'data_bags/x/unmodified.json', <<EOM
276
+ {
277
+ "id": "unmodified"
278
+ }
279
+ EOM
280
+
281
+ when_the_chef_server 'has a modified, unmodified, added and deleted data bag item' do
282
+ data_bag 'x', {
283
+ 'added' => {},
284
+ 'modified' => { 'foo' => 'bar' },
285
+ 'unmodified' => {}
286
+ }
287
+
288
+ it 'knife download of the modified file succeeds' do
289
+ knife('download /data_bags/x/modified.json').should_succeed <<EOM
290
+ Updated /data_bags/x/modified.json
291
+ EOM
292
+ knife('diff --name-status /data_bags').should_succeed <<EOM
293
+ D\t/data_bags/x/added.json
294
+ A\t/data_bags/x/deleted.json
295
+ EOM
296
+ end
297
+ it 'knife download of the unmodified file does nothing' do
298
+ knife('download /data_bags/x/unmodified.json').should_succeed ''
299
+ knife('diff --name-status /data_bags').should_succeed <<EOM
300
+ D\t/data_bags/x/added.json
301
+ M\t/data_bags/x/modified.json
302
+ A\t/data_bags/x/deleted.json
303
+ EOM
304
+ end
305
+ it 'knife download of the added file succeeds' do
306
+ knife('download /data_bags/x/added.json').should_succeed <<EOM
307
+ Created /data_bags/x/added.json
308
+ EOM
309
+ knife('diff --name-status /data_bags').should_succeed <<EOM
310
+ M\t/data_bags/x/modified.json
311
+ A\t/data_bags/x/deleted.json
312
+ EOM
313
+ end
314
+ it 'knife download of the deleted file does nothing' do
315
+ knife('download /data_bags/x/deleted.json').should_succeed ''
316
+ knife('diff --name-status /data_bags').should_succeed <<EOM
317
+ D\t/data_bags/x/added.json
318
+ M\t/data_bags/x/modified.json
319
+ A\t/data_bags/x/deleted.json
320
+ EOM
321
+ end
322
+ it 'knife download --purge of the deleted file deletes it' do
323
+ knife('download --purge /data_bags/x/deleted.json').should_succeed <<EOM
324
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
325
+ EOM
326
+ knife('diff --name-status /data_bags').should_succeed <<EOM
327
+ D\t/data_bags/x/added.json
328
+ M\t/data_bags/x/modified.json
329
+ EOM
330
+ end
331
+ it 'knife download of the entire data bag downloads everything' do
332
+ knife('download /data_bags/x').should_succeed <<EOM
333
+ Created /data_bags/x/added.json
334
+ Updated /data_bags/x/modified.json
335
+ EOM
336
+ knife('diff --name-status /data_bags').should_succeed <<EOM
337
+ A\t/data_bags/x/deleted.json
338
+ EOM
339
+ end
340
+ it 'knife download --purge of the entire data bag downloads everything' do
341
+ knife('download --purge /data_bags/x').should_succeed <<EOM
342
+ Created /data_bags/x/added.json
343
+ Updated /data_bags/x/modified.json
344
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
345
+ EOM
346
+ knife('diff --name-status /data_bags').should_succeed ''
347
+ end
348
+ context 'when cwd is the /data_bags directory' do
349
+ cwd 'data_bags'
350
+ it 'knife download fails' do
351
+ knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
352
+ end
353
+ it 'knife download --purge . downloads everything' do
354
+ knife('download --purge .').should_succeed <<EOM
355
+ Created x/added.json
356
+ Updated x/modified.json
357
+ Deleted extra entry x/deleted.json (purge is on)
358
+ EOM
359
+ knife('diff --name-status /data_bags').should_succeed ''
360
+ end
361
+ it 'knife download --purge * downloads everything' do
362
+ knife('download --purge *').should_succeed <<EOM
363
+ Created x/added.json
364
+ Updated x/modified.json
365
+ Deleted extra entry x/deleted.json (purge is on)
366
+ EOM
367
+ knife('diff --name-status /data_bags').should_succeed ''
368
+ end
369
+ end
370
+ end
371
+ end
372
+
373
+ when_the_repository 'has a cookbook' do
374
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
375
+ file 'cookbooks/x/z.rb', ''
376
+
377
+ when_the_chef_server 'has a modified, added and deleted file for the cookbook' do
378
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'y.rb' => 'hi' }
379
+
380
+ it 'knife download of a modified file succeeds' do
381
+ knife('download /cookbooks/x/metadata.rb').should_succeed "Updated /cookbooks/x/metadata.rb\n"
382
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
383
+ D\t/cookbooks/x/y.rb
384
+ A\t/cookbooks/x/z.rb
385
+ EOM
386
+ end
387
+ it 'knife download of a deleted file does nothing' do
388
+ knife('download /cookbooks/x/z.rb').should_succeed ''
389
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
390
+ M\t/cookbooks/x/metadata.rb
391
+ D\t/cookbooks/x/y.rb
392
+ A\t/cookbooks/x/z.rb
393
+ EOM
394
+ end
395
+ it 'knife download --purge of a deleted file succeeds' do
396
+ knife('download --purge /cookbooks/x/z.rb').should_succeed "Deleted extra entry /cookbooks/x/z.rb (purge is on)\n"
397
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
398
+ M\t/cookbooks/x/metadata.rb
399
+ D\t/cookbooks/x/y.rb
400
+ EOM
401
+ end
402
+ it 'knife download of an added file succeeds' do
403
+ knife('download /cookbooks/x/y.rb').should_succeed "Created /cookbooks/x/y.rb\n"
404
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
405
+ M\t/cookbooks/x/metadata.rb
406
+ A\t/cookbooks/x/z.rb
407
+ EOM
408
+ end
409
+ it 'knife download of the cookbook itself succeeds' do
410
+ knife('download /cookbooks/x').should_succeed <<EOM
411
+ Updated /cookbooks/x/metadata.rb
412
+ Created /cookbooks/x/y.rb
413
+ EOM
414
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
415
+ A\t/cookbooks/x/z.rb
416
+ EOM
417
+ end
418
+ it 'knife download --purge of the cookbook itself succeeds' do
419
+ knife('download --purge /cookbooks/x').should_succeed <<EOM
420
+ Updated /cookbooks/x/metadata.rb
421
+ Created /cookbooks/x/y.rb
422
+ Deleted extra entry /cookbooks/x/z.rb (purge is on)
423
+ EOM
424
+ knife('diff --name-status /cookbooks').should_succeed ''
425
+ end
426
+ end
427
+ end
428
+
429
+ when_the_repository 'has a cookbook' do
430
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
431
+ file 'cookbooks/x/onlyin1.0.0.rb', 'old_text'
432
+
433
+ when_the_chef_server 'has a later version for the cookbook' do
434
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
435
+ cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
436
+
437
+ it 'knife download /cookbooks/x downloads the latest version' do
438
+ knife('download --purge /cookbooks/x').should_succeed <<EOM
439
+ Updated /cookbooks/x/metadata.rb
440
+ Created /cookbooks/x/onlyin1.0.1.rb
441
+ Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
442
+ EOM
443
+ knife('diff --name-status /cookbooks').should_succeed ''
444
+ end
445
+ end
446
+
447
+ when_the_chef_server 'has an earlier version for the cookbook' do
448
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
449
+ cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
450
+ it 'knife download /cookbooks/x downloads the updated file' do
451
+ knife('download --purge /cookbooks/x').should_succeed <<EOM
452
+ Updated /cookbooks/x/onlyin1.0.0.rb
453
+ EOM
454
+ knife('diff --name-status /cookbooks').should_succeed ''
455
+ end
456
+ end
457
+
458
+ when_the_chef_server 'has a later version for the cookbook, and no current version' do
459
+ cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
460
+
461
+ it 'knife download /cookbooks/x downloads the latest version' do
462
+ knife('download --purge /cookbooks/x').should_succeed <<EOM
463
+ Updated /cookbooks/x/metadata.rb
464
+ Created /cookbooks/x/onlyin1.0.1.rb
465
+ Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
466
+ EOM
467
+ knife('diff --name-status /cookbooks').should_succeed ''
468
+ end
469
+ end
470
+
471
+ when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
472
+ cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
473
+
474
+ it 'knife download /cookbooks/x downloads the old version' do
475
+ knife('download --purge /cookbooks/x').should_succeed <<EOM
476
+ Updated /cookbooks/x/metadata.rb
477
+ Created /cookbooks/x/onlyin0.9.9.rb
478
+ Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on)
479
+ EOM
480
+ knife('diff --name-status /cookbooks').should_succeed ''
481
+ end
482
+ end
483
+ end
484
+
485
+ when_the_chef_server 'has an environment' do
486
+ environment 'x', {}
487
+ when_the_repository 'has an environment with bad JSON' do
488
+ file 'environments/x.json', '{'
489
+ it 'knife download succeeds' do
490
+ knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n", :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n"
491
+ knife('diff --name-status /environments/x.json').should_succeed ''
492
+ end
493
+ end
494
+
495
+ when_the_repository 'has the same environment with the wrong name in the file' do
496
+ file 'environments/x.json', { 'name' => 'y' }
497
+ it 'knife download succeeds' do
498
+ knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n"
499
+ knife('diff --name-status /environments/x.json').should_succeed ''
500
+ end
501
+ end
502
+
503
+ when_the_repository 'has the same environment with no name in the file' do
504
+ file 'environments/x.json', { 'description' => 'hi' }
505
+ it 'knife download succeeds' do
506
+ knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n"
507
+ knife('diff --name-status /environments/x.json').should_succeed ''
508
+ end
509
+ end
510
+ end
511
+ end # without versioned cookbooks
512
+
513
+ with_versioned_cookbooks do
514
+ when_the_chef_server "has one of each thing" do
515
+ client 'x', {}
516
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
517
+ data_bag 'x', { 'y' => {} }
518
+ environment 'x', {}
519
+ node 'x', {}
520
+ role 'x', {}
521
+ user 'x', {}
522
+
523
+ when_the_repository 'has only top-level directories' do
524
+ directory 'clients'
525
+ directory 'cookbooks'
526
+ directory 'data_bags'
527
+ directory 'environments'
528
+ directory 'nodes'
529
+ directory 'roles'
530
+ directory 'users'
531
+
532
+ it 'knife download downloads everything' do
533
+ knife('download /').should_succeed <<EOM
534
+ Created /clients/chef-validator.json
535
+ Created /clients/chef-webui.json
536
+ Created /clients/x.json
537
+ Created /cookbooks/x-1.0.0
538
+ Created /cookbooks/x-1.0.0/metadata.rb
539
+ Created /data_bags/x
540
+ Created /data_bags/x/y.json
541
+ Created /environments/_default.json
542
+ Created /environments/x.json
543
+ Created /nodes/x.json
544
+ Created /roles/x.json
545
+ Created /users/admin.json
546
+ Created /users/x.json
547
+ EOM
548
+ knife('diff --name-status /').should_succeed ''
549
+ end
550
+ end
551
+
552
+ when_the_repository 'has an identical copy of each thing' do
553
+ file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
554
+ file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
555
+ file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
556
+ file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
557
+ file 'data_bags/x/y.json', {}
558
+ file 'environments/_default.json', { "description" => "The default Chef environment" }
559
+ file 'environments/x.json', {}
560
+ file 'nodes/x.json', {}
561
+ file 'roles/x.json', {}
562
+ file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
563
+ file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
564
+
565
+ it 'knife download makes no changes' do
566
+ knife('download /').should_succeed ''
567
+ knife('diff --name-status /').should_succeed ''
568
+ end
569
+
570
+ it 'knife download --purge makes no changes' do
571
+ knife('download --purge /').should_succeed ''
572
+ knife('diff --name-status /').should_succeed ''
573
+ end
574
+
575
+ context 'except the role file' do
576
+ file 'roles/x.json', { "description" => "blarghle" }
577
+
578
+ it 'knife download changes the role' do
579
+ knife('download /').should_succeed "Updated /roles/x.json\n"
580
+ knife('diff --name-status /').should_succeed ''
581
+ end
582
+ end
583
+
584
+ context 'except the role file is textually different, but not ACTUALLY different' do
585
+ file 'roles/x.json', <<EOM
586
+ {
587
+ "chef_type": "role" ,
588
+ "default_attributes": {
589
+ },
590
+ "env_run_lists": {
591
+ },
592
+ "json_class": "Chef::Role",
593
+ "name": "x",
594
+ "description": "",
595
+ "override_attributes": {
596
+ },
597
+ "run_list": [
598
+
599
+ ]
600
+ }
601
+ EOM
602
+ it 'knife download / does not change anything' do
603
+ knife('download /').should_succeed ''
604
+ knife('diff --name-status /').should_succeed ''
605
+ end
606
+ end
607
+
608
+ context 'as well as one extra copy of each thing' do
609
+ file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
610
+ file 'cookbooks/x-1.0.0/blah.rb', ''
611
+ file 'cookbooks/x-2.0.0/metadata.rb', 'version "2.0.0"'
612
+ file 'cookbooks/y-1.0.0/metadata.rb', 'version "1.0.0"'
613
+ file 'data_bags/x/z.json', {}
614
+ file 'data_bags/y/zz.json', {}
615
+ file 'environments/y.json', {}
616
+ file 'nodes/y.json', {}
617
+ file 'roles/y.json', {}
618
+ file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
619
+
620
+ it 'knife download does nothing' do
621
+ knife('download /').should_succeed ''
622
+ knife('diff --name-status /').should_succeed <<EOM
623
+ A\t/clients/y.json
624
+ A\t/cookbooks/x-1.0.0/blah.rb
625
+ A\t/cookbooks/x-2.0.0
626
+ A\t/cookbooks/y-1.0.0
627
+ A\t/data_bags/x/z.json
628
+ A\t/data_bags/y
629
+ A\t/environments/y.json
630
+ A\t/nodes/y.json
631
+ A\t/roles/y.json
632
+ A\t/users/y.json
633
+ EOM
634
+ end
635
+
636
+ it 'knife download --purge deletes the extra files' do
637
+ knife('download --purge /').should_succeed <<EOM
638
+ Deleted extra entry /clients/y.json (purge is on)
639
+ Deleted extra entry /cookbooks/x-1.0.0/blah.rb (purge is on)
640
+ Deleted extra entry /cookbooks/x-2.0.0 (purge is on)
641
+ Deleted extra entry /cookbooks/y-1.0.0 (purge is on)
642
+ Deleted extra entry /data_bags/x/z.json (purge is on)
643
+ Deleted extra entry /data_bags/y (purge is on)
644
+ Deleted extra entry /environments/y.json (purge is on)
645
+ Deleted extra entry /nodes/y.json (purge is on)
646
+ Deleted extra entry /roles/y.json (purge is on)
647
+ Deleted extra entry /users/y.json (purge is on)
648
+ EOM
649
+ knife('diff --name-status /').should_succeed ''
650
+ end
651
+ end
652
+ end
653
+
654
+ when_the_repository 'is empty' do
655
+ it 'knife download creates the extra files' do
656
+ knife('download /').should_succeed <<EOM
657
+ Created /clients
658
+ Created /clients/chef-validator.json
659
+ Created /clients/chef-webui.json
660
+ Created /clients/x.json
661
+ Created /cookbooks
662
+ Created /cookbooks/x-1.0.0
663
+ Created /cookbooks/x-1.0.0/metadata.rb
664
+ Created /data_bags
665
+ Created /data_bags/x
666
+ Created /data_bags/x/y.json
667
+ Created /environments
668
+ Created /environments/_default.json
669
+ Created /environments/x.json
670
+ Created /nodes
671
+ Created /nodes/x.json
672
+ Created /roles
673
+ Created /roles/x.json
674
+ Created /users
675
+ Created /users/admin.json
676
+ Created /users/x.json
677
+ EOM
678
+ knife('diff --name-status /').should_succeed ''
679
+ end
680
+
681
+ context 'when current directory is top level' do
682
+ cwd '.'
683
+ it 'knife download with no parameters reports an error' do
684
+ knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
685
+ end
686
+ end
687
+ end
688
+ end
689
+
690
+ # Test download of an item when the other end doesn't even have the container
691
+ when_the_repository 'is empty' do
692
+ when_the_chef_server 'has two data bag items' do
693
+ data_bag 'x', { 'y' => {}, 'z' => {} }
694
+
695
+ it 'knife download of one data bag item itself succeeds' do
696
+ knife('download /data_bags/x/y.json').should_succeed <<EOM
697
+ Created /data_bags
698
+ Created /data_bags/x
699
+ Created /data_bags/x/y.json
700
+ EOM
701
+ knife('diff --name-status /data_bags').should_succeed <<EOM
702
+ D\t/data_bags/x/z.json
703
+ EOM
704
+ end
705
+ end
706
+ end
707
+
708
+ when_the_repository 'has three data bag items' do
709
+ file 'data_bags/x/deleted.json', <<EOM
710
+ {
711
+ "id": "deleted"
712
+ }
713
+ EOM
714
+ file 'data_bags/x/modified.json', <<EOM
715
+ {
716
+ "id": "modified"
717
+ }
718
+ EOM
719
+ file 'data_bags/x/unmodified.json', <<EOM
720
+ {
721
+ "id": "unmodified"
722
+ }
723
+ EOM
724
+
725
+ when_the_chef_server 'has a modified, unmodified, added and deleted data bag item' do
726
+ data_bag 'x', {
727
+ 'added' => {},
728
+ 'modified' => { 'foo' => 'bar' },
729
+ 'unmodified' => {}
730
+ }
731
+
732
+ it 'knife download of the modified file succeeds' do
733
+ knife('download /data_bags/x/modified.json').should_succeed <<EOM
734
+ Updated /data_bags/x/modified.json
735
+ EOM
736
+ knife('diff --name-status /data_bags').should_succeed <<EOM
737
+ D\t/data_bags/x/added.json
738
+ A\t/data_bags/x/deleted.json
739
+ EOM
740
+ end
741
+ it 'knife download of the unmodified file does nothing' do
742
+ knife('download /data_bags/x/unmodified.json').should_succeed ''
743
+ knife('diff --name-status /data_bags').should_succeed <<EOM
744
+ D\t/data_bags/x/added.json
745
+ M\t/data_bags/x/modified.json
746
+ A\t/data_bags/x/deleted.json
747
+ EOM
748
+ end
749
+ it 'knife download of the added file succeeds' do
750
+ knife('download /data_bags/x/added.json').should_succeed <<EOM
751
+ Created /data_bags/x/added.json
752
+ EOM
753
+ knife('diff --name-status /data_bags').should_succeed <<EOM
754
+ M\t/data_bags/x/modified.json
755
+ A\t/data_bags/x/deleted.json
756
+ EOM
757
+ end
758
+ it 'knife download of the deleted file does nothing' do
759
+ knife('download /data_bags/x/deleted.json').should_succeed ''
760
+ knife('diff --name-status /data_bags').should_succeed <<EOM
761
+ D\t/data_bags/x/added.json
762
+ M\t/data_bags/x/modified.json
763
+ A\t/data_bags/x/deleted.json
764
+ EOM
765
+ end
766
+ it 'knife download --purge of the deleted file deletes it' do
767
+ knife('download --purge /data_bags/x/deleted.json').should_succeed <<EOM
768
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
769
+ EOM
770
+ knife('diff --name-status /data_bags').should_succeed <<EOM
771
+ D\t/data_bags/x/added.json
772
+ M\t/data_bags/x/modified.json
773
+ EOM
774
+ end
775
+ it 'knife download of the entire data bag downloads everything' do
776
+ knife('download /data_bags/x').should_succeed <<EOM
777
+ Created /data_bags/x/added.json
778
+ Updated /data_bags/x/modified.json
779
+ EOM
780
+ knife('diff --name-status /data_bags').should_succeed <<EOM
781
+ A\t/data_bags/x/deleted.json
782
+ EOM
783
+ end
784
+ it 'knife download --purge of the entire data bag downloads everything' do
785
+ knife('download --purge /data_bags/x').should_succeed <<EOM
786
+ Created /data_bags/x/added.json
787
+ Updated /data_bags/x/modified.json
788
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
789
+ EOM
790
+ knife('diff --name-status /data_bags').should_succeed ''
791
+ end
792
+ context 'when cwd is the /data_bags directory' do
793
+ cwd 'data_bags'
794
+ it 'knife download fails' do
795
+ knife('download').should_fail "FATAL: Must specify at least one argument. If you want to download everything in this directory, type \"knife download .\"\n", :stdout => /USAGE/
796
+ end
797
+ it 'knife download --purge . downloads everything' do
798
+ knife('download --purge .').should_succeed <<EOM
799
+ Created x/added.json
800
+ Updated x/modified.json
801
+ Deleted extra entry x/deleted.json (purge is on)
802
+ EOM
803
+ knife('diff --name-status /data_bags').should_succeed ''
804
+ end
805
+ it 'knife download --purge * downloads everything' do
806
+ knife('download --purge *').should_succeed <<EOM
807
+ Created x/added.json
808
+ Updated x/modified.json
809
+ Deleted extra entry x/deleted.json (purge is on)
810
+ EOM
811
+ knife('diff --name-status /data_bags').should_succeed ''
812
+ end
813
+ end
814
+ end
815
+ end
816
+
817
+ when_the_repository 'has a cookbook' do
818
+ file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
819
+ file 'cookbooks/x-1.0.0/z.rb', ''
820
+
821
+ when_the_chef_server 'has a modified, added and deleted file for the cookbook' do
822
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'y.rb' => 'hi' }
823
+
824
+ it 'knife download of a modified file succeeds' do
825
+ knife('download /cookbooks/x-1.0.0/metadata.rb').should_succeed "Updated /cookbooks/x-1.0.0/metadata.rb\n"
826
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
827
+ D\t/cookbooks/x-1.0.0/y.rb
828
+ A\t/cookbooks/x-1.0.0/z.rb
829
+ EOM
830
+ end
831
+ it 'knife download of a deleted file does nothing' do
832
+ knife('download /cookbooks/x-1.0.0/z.rb').should_succeed ''
833
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
834
+ M\t/cookbooks/x-1.0.0/metadata.rb
835
+ D\t/cookbooks/x-1.0.0/y.rb
836
+ A\t/cookbooks/x-1.0.0/z.rb
837
+ EOM
838
+ end
839
+ it 'knife download --purge of a deleted file succeeds' do
840
+ knife('download --purge /cookbooks/x-1.0.0/z.rb').should_succeed "Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)\n"
841
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
842
+ M\t/cookbooks/x-1.0.0/metadata.rb
843
+ D\t/cookbooks/x-1.0.0/y.rb
844
+ EOM
845
+ end
846
+ it 'knife download of an added file succeeds' do
847
+ knife('download /cookbooks/x-1.0.0/y.rb').should_succeed "Created /cookbooks/x-1.0.0/y.rb\n"
848
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
849
+ M\t/cookbooks/x-1.0.0/metadata.rb
850
+ A\t/cookbooks/x-1.0.0/z.rb
851
+ EOM
852
+ end
853
+ it 'knife download of the cookbook itself succeeds' do
854
+ knife('download /cookbooks/x-1.0.0').should_succeed <<EOM
855
+ Updated /cookbooks/x-1.0.0/metadata.rb
856
+ Created /cookbooks/x-1.0.0/y.rb
857
+ EOM
858
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
859
+ A\t/cookbooks/x-1.0.0/z.rb
860
+ EOM
861
+ end
862
+ it 'knife download --purge of the cookbook itself succeeds' do
863
+ knife('download --purge /cookbooks/x-1.0.0').should_succeed <<EOM
864
+ Updated /cookbooks/x-1.0.0/metadata.rb
865
+ Created /cookbooks/x-1.0.0/y.rb
866
+ Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)
867
+ EOM
868
+ knife('diff --name-status /cookbooks').should_succeed ''
869
+ end
870
+ end
871
+ end
872
+
873
+ when_the_repository 'has a cookbook' do
874
+ file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
875
+ file 'cookbooks/x-1.0.0/onlyin1.0.0.rb', 'old_text'
876
+
877
+ when_the_chef_server 'has a later version for the cookbook' do
878
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
879
+ cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
880
+
881
+ it 'knife download /cookbooks/x downloads the latest version' do
882
+ knife('download --purge /cookbooks').should_succeed <<EOM
883
+ Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb
884
+ Created /cookbooks/x-1.0.1
885
+ Created /cookbooks/x-1.0.1/metadata.rb
886
+ Created /cookbooks/x-1.0.1/onlyin1.0.1.rb
887
+ EOM
888
+ knife('diff --name-status /cookbooks').should_succeed ''
889
+ end
890
+ end
891
+
892
+ when_the_chef_server 'has an earlier version for the cookbook' do
893
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
894
+ cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
895
+ it 'knife download /cookbooks downloads the updated file' do
896
+ knife('download --purge /cookbooks').should_succeed <<EOM
897
+ Created /cookbooks/x-0.9.9
898
+ Created /cookbooks/x-0.9.9/metadata.rb
899
+ Created /cookbooks/x-0.9.9/onlyin0.9.9.rb
900
+ Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb
901
+ EOM
902
+ knife('diff --name-status /cookbooks').should_succeed ''
903
+ end
904
+ end
905
+
906
+ when_the_chef_server 'has a later version for the cookbook, and no current version' do
907
+ cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
908
+
909
+ it 'knife download /cookbooks/x downloads the latest version' do
910
+ knife('download --purge /cookbooks').should_succeed <<EOM
911
+ Created /cookbooks/x-1.0.1
912
+ Created /cookbooks/x-1.0.1/metadata.rb
913
+ Created /cookbooks/x-1.0.1/onlyin1.0.1.rb
914
+ Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
915
+ EOM
916
+ knife('diff --name-status /cookbooks').should_succeed ''
917
+ end
918
+ end
919
+
920
+ when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
921
+ cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
922
+
923
+ it 'knife download --purge /cookbooks downloads the old version and deletes the new version' do
924
+ knife('download --purge /cookbooks').should_succeed <<EOM
925
+ Created /cookbooks/x-0.9.9
926
+ Created /cookbooks/x-0.9.9/metadata.rb
927
+ Created /cookbooks/x-0.9.9/onlyin0.9.9.rb
928
+ Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
929
+ EOM
930
+ knife('diff --name-status /cookbooks').should_succeed ''
931
+ end
932
+ end
933
+ end
934
+
935
+ when_the_chef_server 'has an environment' do
936
+ environment 'x', {}
937
+ when_the_repository 'has an environment with bad JSON' do
938
+ file 'environments/x.json', '{'
939
+ it 'knife download succeeds' do
940
+ knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n", :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n"
941
+ knife('diff --name-status /environments/x.json').should_succeed ''
942
+ end
943
+ end
944
+
945
+ when_the_repository 'has the same environment with the wrong name in the file' do
946
+ file 'environments/x.json', { 'name' => 'y' }
947
+ it 'knife download succeeds' do
948
+ knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n"
949
+ knife('diff --name-status /environments/x.json').should_succeed ''
950
+ end
951
+ end
952
+
953
+ when_the_repository 'has the same environment with no name in the file' do
954
+ file 'environments/x.json', { 'description' => 'hi' }
955
+ it 'knife download succeeds' do
956
+ knife('download /environments/x.json').should_succeed "Updated /environments/x.json\n"
957
+ knife('diff --name-status /environments/x.json').should_succeed ''
958
+ end
959
+ end
960
+ end
961
+ end # with versioned cookbooks
962
+ end