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,166 @@
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/raw'
20
+ require 'chef/knife/show'
21
+
22
+ describe 'knife raw' do
23
+ extend IntegrationSupport
24
+ include KnifeSupport
25
+
26
+ when_the_chef_server "has one of each thing" do
27
+ client 'x', '{}'
28
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
29
+ data_bag 'x', { 'y' => '{}' }
30
+ environment 'x', '{}'
31
+ node 'x', '{}'
32
+ role 'x', '{}'
33
+ user 'x', '{}'
34
+
35
+ it 'knife raw /nodes/x returns the node', :pending => (RUBY_VERSION < "1.9") do
36
+ knife('raw /nodes/x').should_succeed <<EOM
37
+ {
38
+ "name": "x",
39
+ "json_class": "Chef::Node",
40
+ "chef_type": "node",
41
+ "chef_environment": "_default",
42
+ "override": {
43
+ },
44
+ "normal": {
45
+ },
46
+ "default": {
47
+ },
48
+ "automatic": {
49
+ },
50
+ "run_list": [
51
+
52
+ ]
53
+ }
54
+ EOM
55
+ end
56
+
57
+ it 'knife raw /blarghle returns 404' do
58
+ knife('raw /blarghle').should_fail(/ERROR: Server responded with error 404 "Not Found"/)
59
+ end
60
+
61
+ it 'knife raw -m DELETE /roles/x succeeds', :pending => (RUBY_VERSION < "1.9") do
62
+ knife('raw -m DELETE /roles/x').should_succeed <<EOM
63
+ {
64
+ "name": "x",
65
+ "description": "",
66
+ "json_class": "Chef::Role",
67
+ "chef_type": "role",
68
+ "default_attributes": {
69
+ },
70
+ "override_attributes": {
71
+ },
72
+ "run_list": [
73
+
74
+ ],
75
+ "env_run_lists": {
76
+ }
77
+ }
78
+ EOM
79
+ knife('show /roles/x.json').should_fail "ERROR: /roles/x.json: No such file or directory\n"
80
+ end
81
+
82
+ it 'knife raw -m PUT -i blah.txt /roles/x succeeds', :pending => (RUBY_VERSION < "1.9") do
83
+ Tempfile.open('raw_put_input') do |file|
84
+ file.write <<EOM
85
+ {
86
+ "name": "x",
87
+ "description": "eek",
88
+ "json_class": "Chef::Role",
89
+ "chef_type": "role",
90
+ "default_attributes": {
91
+ },
92
+ "override_attributes": {
93
+ },
94
+ "run_list": [
95
+
96
+ ],
97
+ "env_run_lists": {
98
+ }
99
+ }
100
+ EOM
101
+ file.close
102
+
103
+ knife("raw -m PUT -i #{file.path} /roles/x").should_succeed <<EOM
104
+ {
105
+ "name": "x",
106
+ "description": "eek",
107
+ "json_class": "Chef::Role",
108
+ "chef_type": "role",
109
+ "default_attributes": {
110
+ },
111
+ "override_attributes": {
112
+ },
113
+ "run_list": [
114
+
115
+ ],
116
+ "env_run_lists": {
117
+ }
118
+ }
119
+ EOM
120
+ knife('show /roles/x.json').should_succeed <<EOM
121
+ /roles/x.json:
122
+ {
123
+ "name": "x",
124
+ "description": "eek"
125
+ }
126
+ EOM
127
+ end
128
+ end
129
+
130
+ it 'knife raw -m POST -i blah.txt /roles succeeds', :pending => (RUBY_VERSION < "1.9") do
131
+ Tempfile.open('raw_put_input') do |file|
132
+ file.write <<EOM
133
+ {
134
+ "name": "y",
135
+ "description": "eek",
136
+ "json_class": "Chef::Role",
137
+ "chef_type": "role",
138
+ "default_attributes": {
139
+ },
140
+ "override_attributes": {
141
+ },
142
+ "run_list": [
143
+
144
+ ],
145
+ "env_run_lists": {
146
+ }
147
+ }
148
+ EOM
149
+ file.close
150
+
151
+ knife("raw -m POST -i #{file.path} /roles").should_succeed <<EOM
152
+ {
153
+ "uri": "#{ChefZero::RSpec.server.url}/roles/y"
154
+ }
155
+ EOM
156
+ knife('show /roles/y.json').should_succeed <<EOM
157
+ /roles/y.json:
158
+ {
159
+ "name": "y",
160
+ "description": "eek"
161
+ }
162
+ EOM
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,57 @@
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 'puma'
19
+ require 'support/shared/integration/integration_helper'
20
+ require 'chef/knife/list'
21
+
22
+ describe 'redirection' do
23
+ extend IntegrationSupport
24
+ include KnifeSupport
25
+
26
+ when_the_chef_server 'has a role' do
27
+ role 'x', {}
28
+
29
+ context 'and another server redirects to it with 302' do
30
+ before :each do
31
+ @real_chef_server_url = Chef::Config.chef_server_url
32
+ Chef::Config.chef_server_url = "http://127.0.0.1:9018"
33
+ app = lambda do |env|
34
+ [302, {'Content-Type' => 'text','Location' => "#{@real_chef_server_url}#{env['PATH_INFO']}" }, ['302 found'] ]
35
+ end
36
+ @redirector_server = Puma::Server.new(app, Puma::Events.new(STDERR, STDOUT))
37
+ @redirector_server.add_tcp_listener("127.0.0.1", 9018)
38
+ @redirector_server.run
39
+ Timeout::timeout(5) do
40
+ until @redirector_server.running
41
+ sleep(0.01)
42
+ end
43
+ raise @server_error if @server_error
44
+ end
45
+ end
46
+
47
+ after :each do
48
+ Chef::Config.chef_server_url = @real_chef_server_url
49
+ @redirector_server.stop(true)
50
+ end
51
+
52
+ it 'knife list /roles returns the role' do
53
+ knife('list /roles').should_succeed "/roles/x.json\n"
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,158 @@
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/show'
20
+
21
+ describe 'knife show' do
22
+ extend IntegrationSupport
23
+ include KnifeSupport
24
+
25
+ when_the_chef_server "has one of each thing" do
26
+ client 'x', '{}'
27
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
28
+ data_bag 'x', { 'y' => '{}' }
29
+ environment 'x', '{}'
30
+ node 'x', '{}'
31
+ role 'x', '{}'
32
+ user 'x', '{}'
33
+
34
+ when_the_repository 'also has one of each thing' do
35
+ file 'clients/x.json', { 'foo' => 'bar' }
36
+ file 'cookbooks/x/metadata.rb', 'version "1.0.1"'
37
+ file 'data_bags/x/y.json', { 'foo' => 'bar' }
38
+ file 'environments/_default.json', { 'foo' => 'bar' }
39
+ file 'environments/x.json', { 'foo' => 'bar' }
40
+ file 'nodes/x.json', { 'foo' => 'bar' }
41
+ file 'roles/x.json', { 'foo' => 'bar' }
42
+ file 'users/x.json', { 'foo' => 'bar' }
43
+
44
+ it 'knife show /cookbooks/x/metadata.rb shows the remote version' do
45
+ knife('show /cookbooks/x/metadata.rb').should_succeed <<EOM
46
+ /cookbooks/x/metadata.rb:
47
+ version "1.0.0"
48
+ EOM
49
+ end
50
+ it 'knife show --local /cookbooks/x/metadata.rb shows the local version' do
51
+ knife('show --local /cookbooks/x/metadata.rb').should_succeed <<EOM
52
+ /cookbooks/x/metadata.rb:
53
+ version "1.0.1"
54
+ EOM
55
+ end
56
+ it 'knife show /data_bags/x/y.json shows the remote version' do
57
+ knife('show /data_bags/x/y.json').should_succeed <<EOM
58
+ /data_bags/x/y.json:
59
+ {
60
+ "id": "y"
61
+ }
62
+ EOM
63
+ end
64
+ it 'knife show --local /data_bags/x/y.json shows the local version' do
65
+ knife('show --local /data_bags/x/y.json').should_succeed <<EOM
66
+ /data_bags/x/y.json:
67
+ {
68
+ "foo": "bar"
69
+ }
70
+ EOM
71
+ end
72
+ it 'knife show /environments/x.json shows the remote version', :pending => (RUBY_VERSION < "1.9") do
73
+ knife('show /environments/x.json').should_succeed <<EOM
74
+ /environments/x.json:
75
+ {
76
+ "name": "x"
77
+ }
78
+ EOM
79
+ end
80
+ it 'knife show --local /environments/x.json shows the local version' do
81
+ knife('show --local /environments/x.json').should_succeed <<EOM
82
+ /environments/x.json:
83
+ {
84
+ "foo": "bar"
85
+ }
86
+ EOM
87
+ end
88
+ it 'knife show /roles/x.json shows the remote version', :pending => (RUBY_VERSION < "1.9") do
89
+ knife('show /roles/x.json').should_succeed <<EOM
90
+ /roles/x.json:
91
+ {
92
+ "name": "x"
93
+ }
94
+ EOM
95
+ end
96
+ it 'knife show --local /roles/x.json shows the local version' do
97
+ knife('show --local /roles/x.json').should_succeed <<EOM
98
+ /roles/x.json:
99
+ {
100
+ "foo": "bar"
101
+ }
102
+ EOM
103
+ end
104
+ # show directory
105
+ it 'knife show /data_bags/x fails' do
106
+ knife('show /data_bags/x').should_fail "ERROR: /data_bags/x: is a directory\n"
107
+ end
108
+ it 'knife show --local /data_bags/x fails' do
109
+ knife('show --local /data_bags/x').should_fail "ERROR: /data_bags/x: is a directory\n"
110
+ end
111
+ # show nonexistent file
112
+ it 'knife show /environments/nonexistent.json fails' do
113
+ knife('show /environments/nonexistent.json').should_fail "ERROR: /environments/nonexistent.json: No such file or directory\n"
114
+ end
115
+ it 'knife show --local /environments/nonexistent.json fails' do
116
+ knife('show --local /environments/nonexistent.json').should_fail "ERROR: /environments/nonexistent.json: No such file or directory\n"
117
+ end
118
+ end
119
+ end
120
+
121
+ when_the_chef_server 'has a hash with multiple keys' do
122
+ environment 'x', {
123
+ 'default_attributes' => { 'foo' => 'bar' },
124
+ 'cookbook_versions' => { 'blah' => '= 1.0.0'},
125
+ 'override_attributes' => { 'x' => 'y' },
126
+ 'description' => 'woo',
127
+ 'name' => 'x'
128
+ }
129
+ it 'knife show shows the attributes in a predetermined order', :pending => (RUBY_VERSION < "1.9") do
130
+ knife('show /environments/x.json').should_succeed <<EOM
131
+ /environments/x.json:
132
+ {
133
+ "name": "x",
134
+ "description": "woo",
135
+ "cookbook_versions": {
136
+ "blah": "= 1.0.0"
137
+ },
138
+ "default_attributes": {
139
+ "foo": "bar"
140
+ },
141
+ "override_attributes": {
142
+ "x": "y"
143
+ }
144
+ }
145
+ EOM
146
+ end
147
+ end
148
+
149
+ when_the_repository 'has an environment with bad JSON' do
150
+ file 'environments/x.json', '{'
151
+ it 'knife show succeeds' do
152
+ knife('show --local /environments/x.json').should_succeed <<EOM
153
+ /environments/x.json:
154
+ {
155
+ EOM
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,1060 @@
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/upload'
20
+ require 'chef/knife/diff'
21
+ require 'chef/knife/raw'
22
+
23
+ describe 'knife upload' do
24
+ extend IntegrationSupport
25
+ include KnifeSupport
26
+
27
+ context 'without versioned cookbooks' do
28
+ when_the_chef_server "has one of each thing" do
29
+ client 'x', {}
30
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
31
+ data_bag 'x', { 'y' => {} }
32
+ environment 'x', {}
33
+ node 'x', {}
34
+ role 'x', {}
35
+ user 'x', {}
36
+
37
+ when_the_repository 'has only top-level directories' do
38
+ directory 'clients'
39
+ directory 'cookbooks'
40
+ directory 'data_bags'
41
+ directory 'environments'
42
+ directory 'nodes'
43
+ directory 'roles'
44
+ directory 'users'
45
+
46
+ it 'knife upload does nothing' do
47
+ knife('upload /').should_succeed ''
48
+ knife('diff --name-status /').should_succeed <<EOM
49
+ D\t/clients/chef-validator.json
50
+ D\t/clients/chef-webui.json
51
+ D\t/clients/x.json
52
+ D\t/cookbooks/x
53
+ D\t/data_bags/x
54
+ D\t/environments/_default.json
55
+ D\t/environments/x.json
56
+ D\t/nodes/x.json
57
+ D\t/roles/x.json
58
+ D\t/users/admin.json
59
+ D\t/users/x.json
60
+ EOM
61
+ end
62
+
63
+ it 'knife upload --purge deletes everything' do
64
+ knife('upload --purge /').should_succeed(<<EOM, :stderr => "WARNING: /environments/_default.json cannot be deleted (default environment cannot be modified).\n")
65
+ Deleted extra entry /clients/chef-validator.json (purge is on)
66
+ Deleted extra entry /clients/chef-webui.json (purge is on)
67
+ Deleted extra entry /clients/x.json (purge is on)
68
+ Deleted extra entry /cookbooks/x (purge is on)
69
+ Deleted extra entry /data_bags/x (purge is on)
70
+ Deleted extra entry /environments/x.json (purge is on)
71
+ Deleted extra entry /nodes/x.json (purge is on)
72
+ Deleted extra entry /roles/x.json (purge is on)
73
+ Deleted extra entry /users/admin.json (purge is on)
74
+ Deleted extra entry /users/x.json (purge is on)
75
+ EOM
76
+ knife('diff --name-status /').should_succeed <<EOM
77
+ D\t/environments/_default.json
78
+ EOM
79
+ end
80
+ end
81
+
82
+ when_the_repository 'has an identical copy of each thing' do
83
+ file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
84
+ file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
85
+ file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
86
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
87
+ file 'data_bags/x/y.json', {}
88
+ file 'environments/_default.json', { "description" => "The default Chef environment" }
89
+ file 'environments/x.json', {}
90
+ file 'nodes/x.json', {}
91
+ file 'roles/x.json', {}
92
+ file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
93
+ file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
94
+
95
+ it 'knife upload makes no changes' do
96
+ knife('upload /cookbooks/x').should_succeed ''
97
+ knife('diff --name-status /').should_succeed ''
98
+ end
99
+
100
+ it 'knife upload --purge makes no changes' do
101
+ knife('upload --purge /').should_succeed ''
102
+ knife('diff --name-status /').should_succeed ''
103
+ end
104
+
105
+ context 'except the role file' do
106
+ file 'roles/x.json', { 'description' => 'blarghle' }
107
+ it 'knife upload changes the role' do
108
+ knife('upload /').should_succeed "Updated /roles/x.json\n"
109
+ knife('diff --name-status /').should_succeed ''
110
+ end
111
+ it 'knife upload --no-diff does not change the role' do
112
+ knife('upload --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 upload / does not change anything' do
136
+ knife('upload /').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 upload adds the new files' do
153
+ knife('upload /').should_succeed <<EOM
154
+ Created /clients/y.json
155
+ Updated /cookbooks/x
156
+ Created /cookbooks/y
157
+ Created /data_bags/x/z.json
158
+ Created /data_bags/y
159
+ Created /data_bags/y/zz.json
160
+ Created /environments/y.json
161
+ Created /nodes/y.json
162
+ Created /roles/y.json
163
+ Created /users/y.json
164
+ EOM
165
+ knife('diff --name-status /').should_succeed ''
166
+ end
167
+
168
+ it 'knife upload --no-diff adds the new files' do
169
+ knife('upload --no-diff /').should_succeed <<EOM
170
+ Created /clients/y.json
171
+ Updated /cookbooks/x
172
+ Created /cookbooks/y
173
+ Created /data_bags/x/z.json
174
+ Created /data_bags/y
175
+ Created /data_bags/y/zz.json
176
+ Created /environments/y.json
177
+ Created /nodes/y.json
178
+ Created /roles/y.json
179
+ Created /users/y.json
180
+ EOM
181
+ knife('diff --name-status /').should_succeed ''
182
+ end
183
+ end
184
+ end
185
+
186
+ when_the_repository 'is empty' do
187
+ it 'knife upload does nothing' do
188
+ knife('upload /').should_succeed ''
189
+ knife('diff --name-status /').should_succeed <<EOM
190
+ D\t/clients
191
+ D\t/cookbooks
192
+ D\t/data_bags
193
+ D\t/environments
194
+ D\t/nodes
195
+ D\t/roles
196
+ D\t/users
197
+ EOM
198
+ end
199
+
200
+ it 'knife upload --purge deletes nothing' do
201
+ knife('upload --purge /').should_fail <<EOM
202
+ ERROR: /clients cannot be deleted.
203
+ ERROR: /cookbooks cannot be deleted.
204
+ ERROR: /data_bags cannot be deleted.
205
+ ERROR: /environments cannot be deleted.
206
+ ERROR: /nodes cannot be deleted.
207
+ ERROR: /roles cannot be deleted.
208
+ ERROR: /users cannot be deleted.
209
+ EOM
210
+ knife('diff --name-status /').should_succeed <<EOM
211
+ D\t/clients
212
+ D\t/cookbooks
213
+ D\t/data_bags
214
+ D\t/environments
215
+ D\t/nodes
216
+ D\t/roles
217
+ D\t/users
218
+ EOM
219
+ end
220
+
221
+ context 'when current directory is top level' do
222
+ cwd '.'
223
+ it 'knife upload with no parameters reports an error' do
224
+ knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
225
+ end
226
+ end
227
+ end
228
+ end
229
+
230
+ when_the_chef_server 'is empty' do
231
+ when_the_repository 'has a data bag item' do
232
+ file 'data_bags/x/y.json', { 'foo' => 'bar' }
233
+ it 'knife upload of the data bag uploads only the values in the data bag item and no other' do
234
+ knife('upload /data_bags/x/y.json').should_succeed <<EOM
235
+ Created /data_bags/x
236
+ Created /data_bags/x/y.json
237
+ EOM
238
+ knife('diff --name-status /data_bags').should_succeed <<EOM
239
+ EOM
240
+ JSON.parse(knife('raw /data/x/y').stdout, :create_additions => false).keys.sort.should == [ 'foo', 'id' ]
241
+ end
242
+ end
243
+
244
+ when_the_repository 'has a data bag item with keys chef_type and data_bag' do
245
+ file 'data_bags/x/y.json', { 'chef_type' => 'aaa', 'data_bag' => 'bbb' }
246
+ it 'upload preserves chef_type and data_bag' do
247
+ knife('upload /data_bags/x/y.json').should_succeed <<EOM
248
+ Created /data_bags/x
249
+ Created /data_bags/x/y.json
250
+ EOM
251
+ knife('diff --name-status /data_bags').should_succeed ''
252
+ result = JSON.parse(knife('raw /data/x/y').stdout, :create_additions => false)
253
+ result.keys.sort.should == [ 'chef_type', 'data_bag', 'id' ]
254
+ result['chef_type'].should == 'aaa'
255
+ result['data_bag'].should == 'bbb'
256
+ end
257
+ end
258
+
259
+ # Test upload of an item when the other end doesn't even have the container
260
+ when_the_repository 'has two data bag items' do
261
+ file 'data_bags/x/y.json', {}
262
+ file 'data_bags/x/z.json', {}
263
+ it 'knife upload of one data bag item itself succeeds' do
264
+ knife('upload /data_bags/x/y.json').should_succeed <<EOM
265
+ Created /data_bags/x
266
+ Created /data_bags/x/y.json
267
+ EOM
268
+ knife('diff --name-status /data_bags').should_succeed <<EOM
269
+ A\t/data_bags/x/z.json
270
+ EOM
271
+ end
272
+ end
273
+ end
274
+
275
+ when_the_chef_server 'has three data bag items' do
276
+ data_bag 'x', { 'deleted' => {}, 'modified' => {}, 'unmodified' => {} }
277
+
278
+ when_the_repository 'has a modified, unmodified, added and deleted data bag item' do
279
+ file 'data_bags/x/added.json', {}
280
+ file 'data_bags/x/modified.json', { 'foo' => 'bar' }
281
+ file 'data_bags/x/unmodified.json', {}
282
+
283
+ it 'knife upload of the modified file succeeds' do
284
+ knife('upload /data_bags/x/modified.json').should_succeed <<EOM
285
+ Updated /data_bags/x/modified.json
286
+ EOM
287
+ knife('diff --name-status /data_bags').should_succeed <<EOM
288
+ D\t/data_bags/x/deleted.json
289
+ A\t/data_bags/x/added.json
290
+ EOM
291
+ end
292
+ it 'knife upload of the unmodified file does nothing' do
293
+ knife('upload /data_bags/x/unmodified.json').should_succeed ''
294
+ knife('diff --name-status /data_bags').should_succeed <<EOM
295
+ D\t/data_bags/x/deleted.json
296
+ M\t/data_bags/x/modified.json
297
+ A\t/data_bags/x/added.json
298
+ EOM
299
+ end
300
+ it 'knife upload of the added file succeeds' do
301
+ knife('upload /data_bags/x/added.json').should_succeed <<EOM
302
+ Created /data_bags/x/added.json
303
+ EOM
304
+ knife('diff --name-status /data_bags').should_succeed <<EOM
305
+ D\t/data_bags/x/deleted.json
306
+ M\t/data_bags/x/modified.json
307
+ EOM
308
+ end
309
+ it 'knife upload of the deleted file does nothing' do
310
+ knife('upload /data_bags/x/deleted.json').should_succeed ''
311
+ knife('diff --name-status /data_bags').should_succeed <<EOM
312
+ D\t/data_bags/x/deleted.json
313
+ M\t/data_bags/x/modified.json
314
+ A\t/data_bags/x/added.json
315
+ EOM
316
+ end
317
+ it 'knife upload --purge of the deleted file deletes it' do
318
+ knife('upload --purge /data_bags/x/deleted.json').should_succeed <<EOM
319
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
320
+ EOM
321
+ knife('diff --name-status /data_bags').should_succeed <<EOM
322
+ M\t/data_bags/x/modified.json
323
+ A\t/data_bags/x/added.json
324
+ EOM
325
+ end
326
+ it 'knife upload of the entire data bag uploads everything' do
327
+ knife('upload /data_bags/x').should_succeed <<EOM
328
+ Created /data_bags/x/added.json
329
+ Updated /data_bags/x/modified.json
330
+ EOM
331
+ knife('diff --name-status /data_bags').should_succeed <<EOM
332
+ D\t/data_bags/x/deleted.json
333
+ EOM
334
+ end
335
+ it 'knife upload --purge of the entire data bag uploads everything' do
336
+ knife('upload --purge /data_bags/x').should_succeed <<EOM
337
+ Created /data_bags/x/added.json
338
+ Updated /data_bags/x/modified.json
339
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
340
+ EOM
341
+ knife('diff --name-status /data_bags').should_succeed ''
342
+ end
343
+ context 'when cwd is the /data_bags directory' do
344
+ cwd 'data_bags'
345
+ it 'knife upload fails' do
346
+ knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
347
+ end
348
+ it 'knife upload --purge . uploads everything' do
349
+ knife('upload --purge .').should_succeed <<EOM
350
+ Created x/added.json
351
+ Updated x/modified.json
352
+ Deleted extra entry x/deleted.json (purge is on)
353
+ EOM
354
+ knife('diff --name-status /data_bags').should_succeed ''
355
+ end
356
+ it 'knife upload --purge * uploads everything' do
357
+ knife('upload --purge *').should_succeed <<EOM
358
+ Created x/added.json
359
+ Updated x/modified.json
360
+ Deleted extra entry x/deleted.json (purge is on)
361
+ EOM
362
+ knife('diff --name-status /data_bags').should_succeed ''
363
+ end
364
+ end
365
+ end
366
+ end
367
+
368
+ # Cookbook upload is a funny thing ... direct cookbook upload works, but
369
+ # upload of a file is designed not to work at present. Make sure that is the
370
+ # case.
371
+ when_the_chef_server 'has a cookbook' do
372
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'z.rb' => '' }
373
+ when_the_repository 'has a modified, extra and missing file for the cookbook' do
374
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
375
+ file 'cookbooks/x/y.rb', 'hi'
376
+ it 'knife upload of any individual file fails' do
377
+ knife('upload /cookbooks/x/metadata.rb').should_fail "ERROR: /cookbooks/x/metadata.rb cannot be updated.\n"
378
+ knife('upload /cookbooks/x/y.rb').should_fail "ERROR: /cookbooks/x cannot have a child created under it.\n"
379
+ knife('upload --purge /cookbooks/x/z.rb').should_fail "ERROR: /cookbooks/x/z.rb cannot be deleted.\n"
380
+ end
381
+ # TODO this is a bit of an inconsistency: if we didn't specify --purge,
382
+ # technically we shouldn't have deleted missing files. But ... cookbooks
383
+ # are a special case.
384
+ it 'knife upload of the cookbook itself succeeds' do
385
+ knife('upload /cookbooks/x').should_succeed <<EOM
386
+ Updated /cookbooks/x
387
+ EOM
388
+ knife('diff --name-status /cookbooks').should_succeed ''
389
+ end
390
+ it 'knife upload --purge of the cookbook itself succeeds' do
391
+ knife('upload /cookbooks/x').should_succeed <<EOM
392
+ Updated /cookbooks/x
393
+ EOM
394
+ knife('diff --name-status /cookbooks').should_succeed ''
395
+ end
396
+ end
397
+ when_the_repository 'has a missing file for the cookbook' do
398
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
399
+ it 'knife upload of the cookbook succeeds' do
400
+ knife('upload /cookbooks/x').should_succeed <<EOM
401
+ Updated /cookbooks/x
402
+ EOM
403
+ knife('diff --name-status /cookbooks').should_succeed ''
404
+ end
405
+ end
406
+ when_the_repository 'has an extra file for the cookbook' do
407
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
408
+ file 'cookbooks/x/z.rb', ''
409
+ file 'cookbooks/x/blah.rb', ''
410
+ it 'knife upload of the cookbook succeeds' do
411
+ knife('upload /cookbooks/x').should_succeed <<EOM
412
+ Updated /cookbooks/x
413
+ EOM
414
+ knife('diff --name-status /cookbooks').should_succeed ''
415
+ end
416
+ end
417
+
418
+ when_the_repository 'has a different file in the cookbook' do
419
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
420
+
421
+ it 'knife upload --freeze freezes the cookbook' do
422
+ knife('upload --freeze /cookbooks/x').should_succeed <<EOM
423
+ Updated /cookbooks/x
424
+ EOM
425
+ # Modify a file and attempt to upload
426
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0" # This is different'
427
+ knife('upload /cookbooks/x').should_fail "ERROR: /cookbooks failed to write: Cookbook x is frozen\n"
428
+ end
429
+ end
430
+ end
431
+
432
+ when_the_chef_server 'has a frozen cookbook' do
433
+ cookbook 'frozencook', '1.0.0', {
434
+ 'metadata.rb' => 'version "1.0.0"'
435
+ }, :frozen => true
436
+
437
+ when_the_repository 'has an update to said cookbook' do
438
+ file 'cookbooks/frozencook/metadata.rb', 'version "1.0.0" # This is different'
439
+
440
+ it 'knife upload fails to upload the frozen cookbook' do
441
+ knife('upload /cookbooks/frozencook').should_fail "ERROR: /cookbooks failed to write: Cookbook frozencook is frozen\n"
442
+ end
443
+ it 'knife upload --force uploads the frozen cookbook' do
444
+ knife('upload --force /cookbooks/frozencook').should_succeed <<EOM
445
+ Updated /cookbooks/frozencook
446
+ EOM
447
+ end
448
+ end
449
+ end
450
+
451
+ when_the_repository 'has a cookbook' do
452
+ file 'cookbooks/x/metadata.rb', 'version "1.0.0"'
453
+ file 'cookbooks/x/onlyin1.0.0.rb', 'old_text'
454
+
455
+ when_the_chef_server 'has a later version for the cookbook' do
456
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
457
+ cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
458
+
459
+ it 'knife upload /cookbooks/x uploads the local version' do
460
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
461
+ M\t/cookbooks/x/metadata.rb
462
+ D\t/cookbooks/x/onlyin1.0.1.rb
463
+ A\t/cookbooks/x/onlyin1.0.0.rb
464
+ EOM
465
+ knife('upload --purge /cookbooks/x').should_succeed <<EOM
466
+ Updated /cookbooks/x
467
+ EOM
468
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
469
+ M\t/cookbooks/x/metadata.rb
470
+ D\t/cookbooks/x/onlyin1.0.1.rb
471
+ A\t/cookbooks/x/onlyin1.0.0.rb
472
+ EOM
473
+ end
474
+ end
475
+
476
+ when_the_chef_server 'has an earlier version for the cookbook' do
477
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
478
+ cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
479
+ it 'knife upload /cookbooks/x uploads the local version' do
480
+ knife('upload --purge /cookbooks/x').should_succeed <<EOM
481
+ Updated /cookbooks/x
482
+ EOM
483
+ knife('diff --name-status /cookbooks').should_succeed ''
484
+ end
485
+ end
486
+
487
+ when_the_chef_server 'has a later version for the cookbook, and no current version' do
488
+ cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
489
+
490
+ it 'knife upload /cookbooks/x uploads the local version' do
491
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
492
+ M\t/cookbooks/x/metadata.rb
493
+ D\t/cookbooks/x/onlyin1.0.1.rb
494
+ A\t/cookbooks/x/onlyin1.0.0.rb
495
+ EOM
496
+ knife('upload --purge /cookbooks/x').should_succeed <<EOM
497
+ Updated /cookbooks/x
498
+ EOM
499
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
500
+ M\t/cookbooks/x/metadata.rb
501
+ D\t/cookbooks/x/onlyin1.0.1.rb
502
+ A\t/cookbooks/x/onlyin1.0.0.rb
503
+ EOM
504
+ end
505
+ end
506
+
507
+ when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
508
+ cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
509
+
510
+ it 'knife upload /cookbooks/x uploads the new version' do
511
+ knife('upload --purge /cookbooks/x').should_succeed <<EOM
512
+ Updated /cookbooks/x
513
+ EOM
514
+ knife('diff --name-status /cookbooks').should_succeed ''
515
+ end
516
+ end
517
+ end
518
+
519
+ when_the_chef_server 'has an environment' do
520
+ environment 'x', {}
521
+ when_the_repository 'has an environment with bad JSON' do
522
+ file 'environments/x.json', '{'
523
+ it 'knife upload tries and fails' do
524
+ knife('upload /environments/x.json').should_fail "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\nERROR: /environments/x.json failed to write: Parse error reading JSON: A JSON text must at least contain two octets!\n"
525
+ knife('diff --name-status /environments/x.json').should_succeed "M\t/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"
526
+ end
527
+ end
528
+
529
+ when_the_repository 'has the same environment with the wrong name in the file' do
530
+ file 'environments/x.json', { 'name' => 'y' }
531
+ it 'knife upload fails' do
532
+ knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name must be 'x' (is 'y')\n"
533
+ knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n"
534
+ end
535
+ end
536
+
537
+ when_the_repository 'has the same environment with no name in the file' do
538
+ file 'environments/x.json', { 'description' => 'hi' }
539
+ it 'knife upload succeeds' do
540
+ knife('upload /environments/x.json').should_succeed "Updated /environments/x.json\n"
541
+ knife('diff --name-status /environments/x.json').should_succeed ''
542
+ end
543
+ end
544
+ end
545
+
546
+ when_the_chef_server 'is empty' do
547
+ when_the_repository 'has an environment with bad JSON' do
548
+ file 'environments/x.json', '{'
549
+ it 'knife upload tries and fails' do
550
+ knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Parse error reading JSON creating child 'x.json': A JSON text must at least contain two octets!\n"
551
+ knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
552
+ end
553
+ end
554
+
555
+ when_the_repository 'has an environment with the wrong name in the file' do
556
+ file 'environments/x.json', { 'name' => 'y' }
557
+ it 'knife upload fails' do
558
+ knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Error creating 'x.json': Name must be 'x' (is 'y')\n"
559
+ knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
560
+ end
561
+ end
562
+
563
+ when_the_repository 'has an environment with no name in the file' do
564
+ file 'environments/x.json', { 'description' => 'hi' }
565
+ it 'knife upload succeeds' do
566
+ knife('upload /environments/x.json').should_succeed "Created /environments/x.json\n"
567
+ knife('diff --name-status /environments/x.json').should_succeed ''
568
+ end
569
+ end
570
+
571
+ when_the_repository 'has a data bag with no id in the file' do
572
+ file 'data_bags/bag/x.json', { 'foo' => 'bar' }
573
+ it 'knife upload succeeds' do
574
+ knife('upload /data_bags/bag/x.json').should_succeed "Created /data_bags/bag\nCreated /data_bags/bag/x.json\n"
575
+ knife('diff --name-status /data_bags/bag/x.json').should_succeed ''
576
+ end
577
+ end
578
+ end
579
+ end # without versioned cookbooks
580
+
581
+ with_versioned_cookbooks do
582
+ when_the_chef_server "has one of each thing" do
583
+ client 'x', {}
584
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' }
585
+ data_bag 'x', { 'y' => {} }
586
+ environment 'x', {}
587
+ node 'x', {}
588
+ role 'x', {}
589
+ user 'x', {}
590
+
591
+ when_the_repository 'has only top-level directories' do
592
+ directory 'clients'
593
+ directory 'cookbooks'
594
+ directory 'data_bags'
595
+ directory 'environments'
596
+ directory 'nodes'
597
+ directory 'roles'
598
+ directory 'users'
599
+
600
+ it 'knife upload does nothing' do
601
+ knife('upload /').should_succeed ''
602
+ knife('diff --name-status /').should_succeed <<EOM
603
+ D\t/clients/chef-validator.json
604
+ D\t/clients/chef-webui.json
605
+ D\t/clients/x.json
606
+ D\t/cookbooks/x-1.0.0
607
+ D\t/data_bags/x
608
+ D\t/environments/_default.json
609
+ D\t/environments/x.json
610
+ D\t/nodes/x.json
611
+ D\t/roles/x.json
612
+ D\t/users/admin.json
613
+ D\t/users/x.json
614
+ EOM
615
+ end
616
+
617
+ it 'knife upload --purge deletes everything' do
618
+ knife('upload --purge /').should_succeed(<<EOM, :stderr => "WARNING: /environments/_default.json cannot be deleted (default environment cannot be modified).\n")
619
+ Deleted extra entry /clients/chef-validator.json (purge is on)
620
+ Deleted extra entry /clients/chef-webui.json (purge is on)
621
+ Deleted extra entry /clients/x.json (purge is on)
622
+ Deleted extra entry /cookbooks/x-1.0.0 (purge is on)
623
+ Deleted extra entry /data_bags/x (purge is on)
624
+ Deleted extra entry /environments/x.json (purge is on)
625
+ Deleted extra entry /nodes/x.json (purge is on)
626
+ Deleted extra entry /roles/x.json (purge is on)
627
+ Deleted extra entry /users/admin.json (purge is on)
628
+ Deleted extra entry /users/x.json (purge is on)
629
+ EOM
630
+ knife('diff --name-status /').should_succeed <<EOM
631
+ D\t/environments/_default.json
632
+ EOM
633
+ end
634
+ end
635
+
636
+ when_the_repository 'has an identical copy of each thing' do
637
+ file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY }
638
+ file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
639
+ file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
640
+ file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
641
+ file 'data_bags/x/y.json', {}
642
+ file 'environments/_default.json', { 'description' => 'The default Chef environment' }
643
+ file 'environments/x.json', {}
644
+ file 'nodes/x.json', {}
645
+ file 'roles/x.json', {}
646
+ file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY }
647
+ file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY }
648
+
649
+ it 'knife upload makes no changes' do
650
+ knife('upload /cookbooks/x-1.0.0').should_succeed ''
651
+ knife('diff --name-status /').should_succeed ''
652
+ end
653
+
654
+ it 'knife upload --purge makes no changes' do
655
+ knife('upload --purge /').should_succeed ''
656
+ knife('diff --name-status /').should_succeed ''
657
+ end
658
+
659
+ context 'except the role file' do
660
+ file 'roles/x.json', { 'description' => 'blarghle' }
661
+
662
+ it 'knife upload changes the role' do
663
+ knife('upload /').should_succeed "Updated /roles/x.json\n"
664
+ knife('diff --name-status /').should_succeed ''
665
+ end
666
+ end
667
+
668
+ context 'except the role file is textually different, but not ACTUALLY different' do
669
+ file 'roles/x.json', <<EOM
670
+ {
671
+ "chef_type": "role",
672
+ "default_attributes": {
673
+ },
674
+ "env_run_lists": {
675
+ },
676
+ "json_class": "Chef::Role",
677
+ "name": "x",
678
+ "description": "",
679
+ "override_attributes": {
680
+ },
681
+ "run_list": [
682
+
683
+ ]
684
+ }
685
+ EOM
686
+ it 'knife upload / does not change anything' do
687
+ knife('upload /').should_succeed ''
688
+ knife('diff --name-status /').should_succeed ''
689
+ end
690
+ end
691
+
692
+ context 'as well as one extra copy of each thing' do
693
+ file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
694
+ file 'cookbooks/x-1.0.0/blah.rb', ''
695
+ file 'cookbooks/x-2.0.0/metadata.rb', 'version "2.0.0"'
696
+ file 'cookbooks/y-1.0.0/metadata.rb', 'version "1.0.0"'
697
+ file 'data_bags/x/z.json', {}
698
+ file 'data_bags/y/zz.json', {}
699
+ file 'environments/y.json', {}
700
+ file 'nodes/y.json', {}
701
+ file 'roles/y.json', {}
702
+ file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY }
703
+
704
+ it 'knife upload adds the new files' do
705
+ knife('upload /').should_succeed <<EOM
706
+ Created /clients/y.json
707
+ Updated /cookbooks/x-1.0.0
708
+ Created /cookbooks/x-2.0.0
709
+ Created /cookbooks/y-1.0.0
710
+ Created /data_bags/x/z.json
711
+ Created /data_bags/y
712
+ Created /data_bags/y/zz.json
713
+ Created /environments/y.json
714
+ Created /nodes/y.json
715
+ Created /roles/y.json
716
+ Created /users/y.json
717
+ EOM
718
+ knife('diff --name-status /').should_succeed ''
719
+ end
720
+ end
721
+ end
722
+
723
+ when_the_repository 'is empty' do
724
+ it 'knife upload does nothing' do
725
+ knife('upload /').should_succeed ''
726
+ knife('diff --name-status /').should_succeed <<EOM
727
+ D\t/clients
728
+ D\t/cookbooks
729
+ D\t/data_bags
730
+ D\t/environments
731
+ D\t/nodes
732
+ D\t/roles
733
+ D\t/users
734
+ EOM
735
+ end
736
+
737
+ it 'knife upload --purge deletes nothing' do
738
+ knife('upload --purge /').should_fail <<EOM
739
+ ERROR: /clients cannot be deleted.
740
+ ERROR: /cookbooks cannot be deleted.
741
+ ERROR: /data_bags cannot be deleted.
742
+ ERROR: /environments cannot be deleted.
743
+ ERROR: /nodes cannot be deleted.
744
+ ERROR: /roles cannot be deleted.
745
+ ERROR: /users cannot be deleted.
746
+ EOM
747
+ knife('diff --name-status /').should_succeed <<EOM
748
+ D\t/clients
749
+ D\t/cookbooks
750
+ D\t/data_bags
751
+ D\t/environments
752
+ D\t/nodes
753
+ D\t/roles
754
+ D\t/users
755
+ EOM
756
+ end
757
+
758
+ context 'when current directory is top level' do
759
+ cwd '.'
760
+ it 'knife upload with no parameters reports an error' do
761
+ knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
762
+ end
763
+ end
764
+ end
765
+ end
766
+
767
+ # Test upload of an item when the other end doesn't even have the container
768
+ when_the_chef_server 'is empty' do
769
+ when_the_repository 'has two data bag items' do
770
+ file 'data_bags/x/y.json', {}
771
+ file 'data_bags/x/z.json', {}
772
+
773
+ it 'knife upload of one data bag item itself succeeds' do
774
+ knife('upload /data_bags/x/y.json').should_succeed <<EOM
775
+ Created /data_bags/x
776
+ Created /data_bags/x/y.json
777
+ EOM
778
+ knife('diff --name-status /data_bags').should_succeed <<EOM
779
+ A\t/data_bags/x/z.json
780
+ EOM
781
+ end
782
+ end
783
+ end
784
+
785
+ when_the_chef_server 'has three data bag items' do
786
+ data_bag 'x', { 'deleted' => {}, 'modified' => {}, 'unmodified' => {} }
787
+ when_the_repository 'has a modified, unmodified, added and deleted data bag item' do
788
+ file 'data_bags/x/added.json', {}
789
+ file 'data_bags/x/modified.json', { 'foo' => 'bar' }
790
+ file 'data_bags/x/unmodified.json', {}
791
+
792
+ it 'knife upload of the modified file succeeds' do
793
+ knife('upload /data_bags/x/modified.json').should_succeed <<EOM
794
+ Updated /data_bags/x/modified.json
795
+ EOM
796
+ knife('diff --name-status /data_bags').should_succeed <<EOM
797
+ D\t/data_bags/x/deleted.json
798
+ A\t/data_bags/x/added.json
799
+ EOM
800
+ end
801
+ it 'knife upload of the unmodified file does nothing' do
802
+ knife('upload /data_bags/x/unmodified.json').should_succeed ''
803
+ knife('diff --name-status /data_bags').should_succeed <<EOM
804
+ D\t/data_bags/x/deleted.json
805
+ M\t/data_bags/x/modified.json
806
+ A\t/data_bags/x/added.json
807
+ EOM
808
+ end
809
+ it 'knife upload of the added file succeeds' do
810
+ knife('upload /data_bags/x/added.json').should_succeed <<EOM
811
+ Created /data_bags/x/added.json
812
+ EOM
813
+ knife('diff --name-status /data_bags').should_succeed <<EOM
814
+ D\t/data_bags/x/deleted.json
815
+ M\t/data_bags/x/modified.json
816
+ EOM
817
+ end
818
+ it 'knife upload of the deleted file does nothing' do
819
+ knife('upload /data_bags/x/deleted.json').should_succeed ''
820
+ knife('diff --name-status /data_bags').should_succeed <<EOM
821
+ D\t/data_bags/x/deleted.json
822
+ M\t/data_bags/x/modified.json
823
+ A\t/data_bags/x/added.json
824
+ EOM
825
+ end
826
+ it 'knife upload --purge of the deleted file deletes it' do
827
+ knife('upload --purge /data_bags/x/deleted.json').should_succeed <<EOM
828
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
829
+ EOM
830
+ knife('diff --name-status /data_bags').should_succeed <<EOM
831
+ M\t/data_bags/x/modified.json
832
+ A\t/data_bags/x/added.json
833
+ EOM
834
+ end
835
+ it 'knife upload of the entire data bag uploads everything' do
836
+ knife('upload /data_bags/x').should_succeed <<EOM
837
+ Created /data_bags/x/added.json
838
+ Updated /data_bags/x/modified.json
839
+ EOM
840
+ knife('diff --name-status /data_bags').should_succeed <<EOM
841
+ D\t/data_bags/x/deleted.json
842
+ EOM
843
+ end
844
+ it 'knife upload --purge of the entire data bag uploads everything' do
845
+ knife('upload --purge /data_bags/x').should_succeed <<EOM
846
+ Created /data_bags/x/added.json
847
+ Updated /data_bags/x/modified.json
848
+ Deleted extra entry /data_bags/x/deleted.json (purge is on)
849
+ EOM
850
+ knife('diff --name-status /data_bags').should_succeed ''
851
+ end
852
+ context 'when cwd is the /data_bags directory' do
853
+ cwd 'data_bags'
854
+ it 'knife upload fails' do
855
+ knife('upload').should_fail "FATAL: Must specify at least one argument. If you want to upload everything in this directory, type \"knife upload .\"\n", :stdout => /USAGE/
856
+ end
857
+ it 'knife upload --purge . uploads everything' do
858
+ knife('upload --purge .').should_succeed <<EOM
859
+ Created x/added.json
860
+ Updated x/modified.json
861
+ Deleted extra entry x/deleted.json (purge is on)
862
+ EOM
863
+ knife('diff --name-status /data_bags').should_succeed ''
864
+ end
865
+ it 'knife upload --purge * uploads everything' do
866
+ knife('upload --purge *').should_succeed <<EOM
867
+ Created x/added.json
868
+ Updated x/modified.json
869
+ Deleted extra entry x/deleted.json (purge is on)
870
+ EOM
871
+ knife('diff --name-status /data_bags').should_succeed ''
872
+ end
873
+ end
874
+ end
875
+ end
876
+
877
+ # Cookbook upload is a funny thing ... direct cookbook upload works, but
878
+ # upload of a file is designed not to work at present. Make sure that is the
879
+ # case.
880
+ when_the_chef_server 'has a cookbook' do
881
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'z.rb' => '' }
882
+
883
+ when_the_repository 'has a modified, extra and missing file for the cookbook' do
884
+ file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
885
+ file 'cookbooks/x-1.0.0/y.rb', 'hi'
886
+
887
+ it 'knife upload of any individual file fails' do
888
+ knife('upload /cookbooks/x-1.0.0/metadata.rb').should_fail "ERROR: /cookbooks/x-1.0.0/metadata.rb cannot be updated.\n"
889
+ knife('upload /cookbooks/x-1.0.0/y.rb').should_fail "ERROR: /cookbooks/x-1.0.0 cannot have a child created under it.\n"
890
+ knife('upload --purge /cookbooks/x-1.0.0/z.rb').should_fail "ERROR: /cookbooks/x-1.0.0/z.rb cannot be deleted.\n"
891
+ end
892
+
893
+ # TODO this is a bit of an inconsistency: if we didn't specify --purge,
894
+ # technically we shouldn't have deleted missing files. But ... cookbooks
895
+ # are a special case.
896
+ it 'knife upload of the cookbook itself succeeds' do
897
+ knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
898
+ Updated /cookbooks/x-1.0.0
899
+ EOM
900
+ knife('diff --name-status /cookbooks').should_succeed ''
901
+ end
902
+
903
+ it 'knife upload --purge of the cookbook itself succeeds' do
904
+ knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
905
+ Updated /cookbooks/x-1.0.0
906
+ EOM
907
+ knife('diff --name-status /cookbooks').should_succeed ''
908
+ end
909
+ end
910
+
911
+ when_the_repository 'has a missing file for the cookbook' do
912
+ file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
913
+
914
+ it 'knife upload of the cookbook succeeds' do
915
+ knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
916
+ Updated /cookbooks/x-1.0.0
917
+ EOM
918
+ knife('diff --name-status /cookbooks').should_succeed ''
919
+ end
920
+ end
921
+
922
+ when_the_repository 'has an extra file for the cookbook' do
923
+ file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
924
+ file 'cookbooks/x-1.0.0/z.rb', ''
925
+ file 'cookbooks/x-1.0.0/blah.rb', ''
926
+
927
+ it 'knife upload of the cookbook succeeds' do
928
+ knife('upload /cookbooks/x-1.0.0').should_succeed <<EOM
929
+ Updated /cookbooks/x-1.0.0
930
+ EOM
931
+ knife('diff --name-status /cookbooks').should_succeed ''
932
+ end
933
+ end
934
+ end
935
+
936
+ when_the_repository 'has a cookbook' do
937
+ file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"'
938
+ file 'cookbooks/x-1.0.0/onlyin1.0.0.rb', 'old_text'
939
+
940
+ when_the_chef_server 'has a later version for the cookbook' do
941
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' }
942
+ cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
943
+
944
+ it 'knife upload /cookbooks uploads the local version' do
945
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
946
+ M\t/cookbooks/x-1.0.0/onlyin1.0.0.rb
947
+ D\t/cookbooks/x-1.0.1
948
+ EOM
949
+ knife('upload --purge /cookbooks').should_succeed <<EOM
950
+ Updated /cookbooks/x-1.0.0
951
+ Deleted extra entry /cookbooks/x-1.0.1 (purge is on)
952
+ EOM
953
+ knife('diff --name-status /cookbooks').should_succeed ''
954
+ end
955
+ end
956
+
957
+ when_the_chef_server 'has an earlier version for the cookbook' do
958
+ cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''}
959
+ cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
960
+ it 'knife upload /cookbooks uploads the local version' do
961
+ knife('upload --purge /cookbooks').should_succeed <<EOM
962
+ Updated /cookbooks/x-1.0.0
963
+ Deleted extra entry /cookbooks/x-0.9.9 (purge is on)
964
+ EOM
965
+ knife('diff --name-status /cookbooks').should_succeed ''
966
+ end
967
+ end
968
+
969
+ when_the_chef_server 'has a later version for the cookbook, and no current version' do
970
+ cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => 'hi' }
971
+
972
+ it 'knife upload /cookbooks/x uploads the local version' do
973
+ knife('diff --name-status /cookbooks').should_succeed <<EOM
974
+ D\t/cookbooks/x-1.0.1
975
+ A\t/cookbooks/x-1.0.0
976
+ EOM
977
+ knife('upload --purge /cookbooks').should_succeed <<EOM
978
+ Created /cookbooks/x-1.0.0
979
+ Deleted extra entry /cookbooks/x-1.0.1 (purge is on)
980
+ EOM
981
+ knife('diff --name-status /cookbooks').should_succeed ''
982
+ end
983
+ end
984
+
985
+ when_the_chef_server 'has an earlier version for the cookbook, and no current version' do
986
+ cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => 'hi' }
987
+
988
+ it 'knife upload /cookbooks/x uploads the new version' do
989
+ knife('upload --purge /cookbooks').should_succeed <<EOM
990
+ Created /cookbooks/x-1.0.0
991
+ Deleted extra entry /cookbooks/x-0.9.9 (purge is on)
992
+ EOM
993
+ knife('diff --name-status /cookbooks').should_succeed ''
994
+ end
995
+ end
996
+ end
997
+
998
+ when_the_chef_server 'has an environment' do
999
+ environment 'x', {}
1000
+ when_the_repository 'has an environment with bad JSON' do
1001
+ file 'environments/x.json', '{'
1002
+ it 'knife upload tries and fails' do
1003
+ knife('upload /environments/x.json').should_fail "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\nERROR: /environments/x.json failed to write: Parse error reading JSON: A JSON text must at least contain two octets!\n"
1004
+ knife('diff --name-status /environments/x.json').should_succeed "M\t/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"
1005
+ end
1006
+ end
1007
+
1008
+ when_the_repository 'has the same environment with the wrong name in the file' do
1009
+ file 'environments/x.json', { 'name' => 'y' }
1010
+ it 'knife upload fails' do
1011
+ knife('upload /environments/x.json').should_fail "ERROR: /environments/x.json failed to write: Name must be 'x' (is 'y')\n"
1012
+ knife('diff --name-status /environments/x.json').should_succeed "M\t/environments/x.json\n"
1013
+ end
1014
+ end
1015
+
1016
+ when_the_repository 'has the same environment with no name in the file' do
1017
+ file 'environments/x.json', { 'description' => 'hi' }
1018
+ it 'knife upload succeeds' do
1019
+ knife('upload /environments/x.json').should_succeed "Updated /environments/x.json\n"
1020
+ knife('diff --name-status /environments/x.json').should_succeed ''
1021
+ end
1022
+ end
1023
+ end
1024
+
1025
+ when_the_chef_server 'is empty' do
1026
+ when_the_repository 'has an environment with bad JSON' do
1027
+ file 'environments/x.json', '{'
1028
+ it 'knife upload tries and fails' do
1029
+ knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Parse error reading JSON creating child 'x.json': A JSON text must at least contain two octets!\n"
1030
+ knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
1031
+ end
1032
+ end
1033
+
1034
+ when_the_repository 'has an environment with the wrong name in the file' do
1035
+ file 'environments/x.json', { 'name' => 'y' }
1036
+ it 'knife upload fails' do
1037
+ knife('upload /environments/x.json').should_fail "ERROR: /environments failed to create_child: Error creating 'x.json': Name must be 'x' (is 'y')\n"
1038
+ knife('diff --name-status /environments/x.json').should_succeed "A\t/environments/x.json\n"
1039
+ end
1040
+ end
1041
+
1042
+ when_the_repository 'has an environment with no name in the file' do
1043
+ file 'environments/x.json', { 'description' => 'hi' }
1044
+ it 'knife upload succeeds' do
1045
+ knife('upload /environments/x.json').should_succeed "Created /environments/x.json\n"
1046
+ knife('diff --name-status /environments/x.json').should_succeed ''
1047
+ end
1048
+ end
1049
+
1050
+ when_the_repository 'has a data bag with no id in the file' do
1051
+ file 'data_bags/bag/x.json', { 'foo' => 'bar' }
1052
+ it 'knife upload succeeds' do
1053
+ knife('upload /data_bags/bag/x.json').should_succeed "Created /data_bags/bag\nCreated /data_bags/bag/x.json\n"
1054
+ knife('diff --name-status /data_bags/bag/x.json').should_succeed ''
1055
+ end
1056
+ end
1057
+ end
1058
+ end # with versioned cookbooks
1059
+
1060
+ end