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,37 @@
1
+ #
2
+ # Author:: Serdar Sutay (<serdar@opscode.com>)
3
+ # Copyright:: Copyright (c) 2012 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+ if Chef::Platform.windows?
21
+ require 'chef/win32/security'
22
+ end
23
+
24
+ describe 'Chef::Win32::Security', :windows_only do
25
+ it "has_admin_privileges? returns true when running as admin" do
26
+ Chef::ReservedNames::Win32::Security.has_admin_privileges?.should == true
27
+ end
28
+
29
+ # We've done some investigation adding a negative test and it turned
30
+ # out to be a lot of work since mixlib-shellout doesn't have user
31
+ # support for windows.
32
+ #
33
+ # TODO - Add negative tests once mixlib-shellout has user support
34
+ it "has_admin_privileges? returns false when running as non-admin" do
35
+ pending "requires user support in mixlib-shellout"
36
+ end
37
+ end
@@ -0,0 +1,269 @@
1
+ #
2
+ # Author:: Serdar Sutay (<serdar@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
+
19
+ require 'spec_helper'
20
+ if Chef::Platform.windows?
21
+ require 'chef/application/windows_service_manager'
22
+ end
23
+
24
+ #
25
+ # ATTENTION:
26
+ # This test creates a windows service for testing purposes and runs it
27
+ # as Local System on windows boxes.
28
+ # This test will fail if you run the tests inside a Windows VM by
29
+ # sharing the code from your host since Local System account by
30
+ # default can't see the mounted partitions.
31
+ # Run this test by copying the code to a local VM directory or setup
32
+ # Local System account to see the maunted partitions for the shared
33
+ # directories.
34
+ #
35
+
36
+ describe "Chef::Application::WindowsServiceManager", :windows_only, :system_windows_service_gem_only do
37
+
38
+ # Some helper methods.
39
+
40
+ def test_service_exists?
41
+ ::Win32::Service.exists?("spec-service")
42
+ end
43
+
44
+ def test_service_state
45
+ ::Win32::Service.status("spec-service").current_state
46
+ end
47
+
48
+ def service_manager
49
+ Chef::Application::WindowsServiceManager.new(test_service)
50
+ end
51
+
52
+ def cleanup
53
+ # Uninstall if the test service is installed.
54
+ if test_service_exists?
55
+
56
+ # We can only uninstall when the service is stopped.
57
+ if test_service_state != "stopped"
58
+ ::Win32::Service.send("stop", "spec-service")
59
+ while test_service_state != "stopped"
60
+ sleep 1
61
+ end
62
+ end
63
+
64
+ ::Win32::Service.delete("spec-service")
65
+ end
66
+
67
+ # Delete the test_service_file if it exists
68
+ if File.exists?(test_service_file)
69
+ File.delete(test_service_file)
70
+ end
71
+
72
+ end
73
+
74
+
75
+ # Definition for the test-service
76
+
77
+ let(:test_service) {
78
+ {
79
+ :service_name => "spec-service",
80
+ :service_display_name => "Spec Test Service",
81
+ :service_description => "Service for testing Chef::Application::WindowsServiceManager.",
82
+ :service_file_path => File.expand_path(File.join(File.dirname(__FILE__), '../../support/platforms/win32/spec_service.rb'))
83
+ }
84
+ }
85
+
86
+ # Test service creates a file for us to verify that it is running.
87
+ # Since our test service is running as Local System we should look
88
+ # for the file it creates under SYSTEM temp directory
89
+
90
+ let(:test_service_file) {
91
+ "#{ENV['SystemDrive']}\\windows\\temp\\spec_service_file"
92
+ }
93
+
94
+ context "with invalid service definition" do
95
+ it "throws an error when initialized with no service definition" do
96
+ lambda { Chef::Application::WindowsServiceManager.new(nil) }.should raise_error(ArgumentError)
97
+ end
98
+
99
+ it "throws an error with required missing options" do
100
+ test_service.each do |key,value|
101
+ service_def = test_service.dup
102
+ service_def.delete(key)
103
+
104
+ lambda { Chef::Application::WindowsServiceManager.new(service_def) }.should raise_error(ArgumentError)
105
+ end
106
+ end
107
+ end
108
+
109
+ context "with valid definition" do
110
+ before(:each) do
111
+ @service_manager_output = [ ]
112
+ # Uncomment below lines to debug this test
113
+ # original_puts = $stdout.method(:puts)
114
+ $stdout.stub(:puts) do |message|
115
+ @service_manager_output << message
116
+ # original_puts.call(message)
117
+ end
118
+ end
119
+
120
+ after(:each) do
121
+ cleanup
122
+ end
123
+
124
+ context "when service doesn't exist" do
125
+ it "default => should say service don't exist" do
126
+ service_manager.run
127
+
128
+ @service_manager_output.grep(/doesn't exist on the system/).length.should > 0
129
+ end
130
+
131
+ it "install => should install the service" do
132
+ service_manager.run(["-a", "install"])
133
+
134
+ test_service_exists?.should be_true
135
+ end
136
+
137
+ it "other actions => should say service doesn't exist" do
138
+ ["delete", "start", "stop", "pause", "resume", "uninstall"].each do |action|
139
+ service_manager.run(["-a", action])
140
+ @service_manager_output.grep(/doesn't exist on the system/).length.should > 0
141
+ @service_manager_output = [ ]
142
+ end
143
+ end
144
+ end
145
+
146
+ context "when service exists" do
147
+ before(:each) do
148
+ service_manager.run(["-a", "install"])
149
+ end
150
+
151
+ it "install => should say service already exists" do
152
+ service_manager.run(["-a", "install"])
153
+ @service_manager_output.grep(/already exists/).length.should > 0
154
+ end
155
+
156
+ context "and service is stopped" do
157
+ ["delete", "uninstall"].each do |action|
158
+ it "#{action} => should remove the service", :volatile do
159
+ service_manager.run(["-a", action])
160
+ test_service_exists?.should be_false
161
+ end
162
+ end
163
+
164
+ it "default, status => should say service is stopped" do
165
+ service_manager.run([ ])
166
+ @service_manager_output.grep(/stopped/).length.should > 0
167
+ @service_manager_output = [ ]
168
+
169
+ service_manager.run(["-a", "status"])
170
+ @service_manager_output.grep(/stopped/).length.should > 0
171
+ end
172
+
173
+ it "start should start the service", :volatile do
174
+ service_manager.run(["-a", "start"])
175
+ test_service_state.should == "running"
176
+ File.exists?(test_service_file).should be_true
177
+ end
178
+
179
+ it "stop should not affect the service" do
180
+ service_manager.run(["-a", "stop"])
181
+ test_service_state.should == "stopped"
182
+ end
183
+
184
+
185
+ ["pause", "resume"].each do |action|
186
+ it "#{action} => should raise error" do
187
+ lambda {service_manager.run(["-a", action])}.should raise_error(::Win32::Service::Error)
188
+ end
189
+ end
190
+
191
+ context "and service is started", :volatile do
192
+ before(:each) do
193
+ service_manager.run(["-a", "start"])
194
+ end
195
+
196
+ ["delete", "uninstall"].each do |action|
197
+ it "#{action} => should remove the service", :volatile do
198
+ service_manager.run(["-a", action])
199
+ test_service_exists?.should be_false
200
+ end
201
+ end
202
+
203
+ it "default, status => should say service is running" do
204
+ service_manager.run([ ])
205
+ @service_manager_output.grep(/running/).length.should > 0
206
+ @service_manager_output = [ ]
207
+
208
+ service_manager.run(["-a", "status"])
209
+ @service_manager_output.grep(/running/).length.should > 0
210
+ end
211
+
212
+ it "stop should stop the service" do
213
+ service_manager.run(["-a", "stop"])
214
+ test_service_state.should == "stopped"
215
+ end
216
+
217
+ it "pause should pause the service" do
218
+ service_manager.run(["-a", "pause"])
219
+ test_service_state.should == "paused"
220
+ end
221
+
222
+ it "resume should have no affect" do
223
+ service_manager.run(["-a", "resume"])
224
+ test_service_state.should == "running"
225
+ end
226
+ end
227
+
228
+ context "and service is paused", :volatile do
229
+ before(:each) do
230
+ service_manager.run(["-a", "start"])
231
+ service_manager.run(["-a", "pause"])
232
+ end
233
+
234
+ actions = ["delete", "uninstall"]
235
+ actions.each do |action|
236
+ it "#{action} => should remove the service" do
237
+ service_manager.run(["-a", action])
238
+ test_service_exists?.should be_false
239
+ end
240
+ end
241
+
242
+ it "default, status => should say service is paused" do
243
+ service_manager.run([ ])
244
+ @service_manager_output.grep(/paused/).length.should > 0
245
+ @service_manager_output = [ ]
246
+
247
+ service_manager.run(["-a", "status"])
248
+ @service_manager_output.grep(/paused/).length.should > 0
249
+ end
250
+
251
+ it "stop should stop the service" do
252
+ service_manager.run(["-a", "stop"])
253
+ test_service_state.should == "stopped"
254
+ end
255
+
256
+ it "pause should not affect the service" do
257
+ service_manager.run(["-a", "pause"])
258
+ test_service_state.should == "paused"
259
+ end
260
+
261
+ it "start should raise an error" do
262
+ lambda {service_manager.run(["-a", "start"])}.should raise_error(::Win32::Service::Error)
263
+ end
264
+
265
+ end
266
+ end
267
+ end
268
+ end
269
+ end
@@ -0,0 +1,78 @@
1
+ #
2
+ # Author:: Chirag Jog (<chirag@clogeny.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
+
19
+ require 'spec_helper'
20
+ if Chef::Platform.windows?
21
+ require 'chef/win32/version'
22
+ require 'ruby-wmi'
23
+ end
24
+
25
+ describe "Chef::ReservedNames::Win32::Version", :windows_only do
26
+ before do
27
+
28
+ host = WMI::Win32_OperatingSystem.find(:first)
29
+
30
+ # Use WMI to determine current OS version.
31
+ # On Win2k8R2 and later, we can dynamically obtain marketing
32
+ # names for comparison from WMI so the test should not
33
+ # need to be modified when new Windows releases arise.
34
+ # For Win2k3 and Win2k8, we use static names in this test
35
+ # based on the version number information from WMI. The names
36
+ # from WMI contain extended characters such as registered
37
+ # trademark on Win2k8 and Win2k3 that we're not using in our
38
+ # library, so we have to set the expectation statically.
39
+ if Chef::Platform::windows_server_2003?
40
+ @current_os_version = 'Windows Server 2003 R2'
41
+ elsif is_windows_server_2008?(host)
42
+ @current_os_version = 'Windows Server 2008'
43
+ else
44
+ # The name from WMI is actually what we want in Win2k8R2+.
45
+ # So this expectation sould continue to hold without modification
46
+ # as new versions of Windows are released.
47
+ @current_os_version = host.caption
48
+ end
49
+
50
+ @version = Chef::ReservedNames::Win32::Version.new
51
+ end
52
+
53
+ context "Windows Operating System version" do
54
+ it "should match the version from WMI" do
55
+ @current_os_version.should include(@version.marketing_name)
56
+ end
57
+ end
58
+
59
+ def is_windows_server_2008?(wmi_host)
60
+ is_win2k8 = false
61
+
62
+ os_version = wmi_host.send('Version')
63
+
64
+ # The operating system version is a string in the following form
65
+ # that can be split into components based on the '.' delimiter:
66
+ # MajorVersionNumber.MinorVersionNumber.BuildNumber
67
+ os_version_components = os_version.split('.')
68
+
69
+ if os_version_components.length < 2
70
+ raise 'WMI returned a Windows version from Win32_OperatingSystem.Version ' +
71
+ 'with an unexpected format. The Windows version could not be determined.'
72
+ end
73
+
74
+ # Windows 6.0 is Windows Server 2008, so test the major and
75
+ # minor version components
76
+ is_win2k8 = os_version_components[0] == '6' && os_version_components[1] == '0'
77
+ end
78
+ end
@@ -0,0 +1,805 @@
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/list'
20
+ require 'chef/knife/show'
21
+
22
+ describe 'chef_repo_path tests' do
23
+ extend IntegrationSupport
24
+ include KnifeSupport
25
+
26
+ # TODO alternate repo_path / *_path
27
+ context 'alternate *_path' do
28
+ when_the_repository 'has clients and clients2, cookbooks and cookbooks2, etc.' do
29
+ file 'clients/client1.json', {}
30
+ file 'cookbooks/cookbook1/metadata.rb', ''
31
+ file 'data_bags/bag/item.json', {}
32
+ file 'environments/env1.json', {}
33
+ file 'nodes/node1.json', {}
34
+ file 'roles/role1.json', {}
35
+ file 'users/user1.json', {}
36
+
37
+ file 'clients2/client2.json', {}
38
+ file 'cookbooks2/cookbook2/metadata.rb', ''
39
+ file 'data_bags2/bag2/item2.json', {}
40
+ file 'environments2/env2.json', {}
41
+ file 'nodes2/node2.json', {}
42
+ file 'roles2/role2.json', {}
43
+ file 'users2/user2.json', {}
44
+
45
+ directory 'chef_repo2' do
46
+ file 'clients/client3.json', {}
47
+ file 'cookbooks/cookbook3/metadata.rb', ''
48
+ file 'data_bags/bag3/item3.json', {}
49
+ file 'environments/env3.json', {}
50
+ file 'nodes/node3.json', {}
51
+ file 'roles/role3.json', {}
52
+ file 'users/user3.json', {}
53
+ end
54
+
55
+ context 'when all _paths are set to alternates' do
56
+ before :each do
57
+ %w(client cookbook data_bag environment node role user).each do |object_name|
58
+ Chef::Config["#{object_name}_path".to_sym] = File.join(Chef::Config.chef_repo_path, "#{object_name}s2")
59
+ end
60
+ Chef::Config.chef_repo_path = File.join(Chef::Config.chef_repo_path, 'chef_repo2')
61
+ end
62
+
63
+ context 'when cwd is at the top level' do
64
+ cwd '.'
65
+ it 'knife list --local -Rfp fails' do
66
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
67
+ end
68
+ end
69
+
70
+ context 'when cwd is inside the data_bags directory' do
71
+ cwd 'data_bags'
72
+ it 'knife list --local -Rfp fails' do
73
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
74
+ end
75
+ end
76
+
77
+ context 'when cwd is inside chef_repo2' do
78
+ cwd 'chef_repo2'
79
+ it 'knife list --local -Rfp lists everything' do
80
+ knife('list --local -Rfp').should_succeed <<EOM
81
+ clients/
82
+ clients/client2.json
83
+ cookbooks/
84
+ cookbooks/cookbook2/
85
+ cookbooks/cookbook2/metadata.rb
86
+ data_bags/
87
+ data_bags/bag2/
88
+ data_bags/bag2/item2.json
89
+ environments/
90
+ environments/env2.json
91
+ nodes/
92
+ nodes/node2.json
93
+ roles/
94
+ roles/role2.json
95
+ users/
96
+ users/user2.json
97
+ EOM
98
+ end
99
+ end
100
+
101
+ context 'when cwd is inside data_bags2' do
102
+ cwd 'data_bags2'
103
+ it 'knife list --local -Rfp lists data bags' do
104
+ knife('list --local -Rfp').should_succeed <<EOM
105
+ bag2/
106
+ bag2/item2.json
107
+ EOM
108
+ end
109
+ it 'knife list --local -Rfp ../roles lists roles' do
110
+ knife('list --local -Rfp ../roles').should_succeed "/roles/role2.json\n"
111
+ end
112
+ end
113
+ end
114
+
115
+ context 'when all _paths except chef_repo_path are set to alternates' do
116
+ before :each do
117
+ %w(client cookbook data_bag environment node role user).each do |object_name|
118
+ Chef::Config["#{object_name}_path".to_sym] = File.join(Chef::Config.chef_repo_path, "#{object_name}s2")
119
+ end
120
+ end
121
+
122
+ context 'when cwd is at the top level' do
123
+ cwd '.'
124
+ it 'knife list --local -Rfp lists everything' do
125
+ knife('list --local -Rfp').should_succeed <<EOM
126
+ clients/
127
+ clients/client2.json
128
+ cookbooks/
129
+ cookbooks/cookbook2/
130
+ cookbooks/cookbook2/metadata.rb
131
+ data_bags/
132
+ data_bags/bag2/
133
+ data_bags/bag2/item2.json
134
+ environments/
135
+ environments/env2.json
136
+ nodes/
137
+ nodes/node2.json
138
+ roles/
139
+ roles/role2.json
140
+ users/
141
+ users/user2.json
142
+ EOM
143
+ end
144
+ end
145
+
146
+ context 'when cwd is inside the data_bags directory' do
147
+ cwd 'data_bags'
148
+ it 'knife list --local -Rfp fails' do
149
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
150
+ end
151
+ end
152
+
153
+ context 'when cwd is inside chef_repo2' do
154
+ cwd 'chef_repo2'
155
+ it 'knife list -Rfp fails' do
156
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
157
+ end
158
+ end
159
+
160
+ context 'when cwd is inside data_bags2' do
161
+ cwd 'data_bags2'
162
+ it 'knife list --local -Rfp lists data bags' do
163
+ knife('list --local -Rfp').should_succeed <<EOM
164
+ bag2/
165
+ bag2/item2.json
166
+ EOM
167
+ end
168
+ end
169
+ end
170
+
171
+ context 'when only chef_repo_path is set to its alternate' do
172
+ before :each do
173
+ %w(client cookbook data_bag environment node role user).each do |object_name|
174
+ Chef::Config["#{object_name}_path".to_sym] = nil
175
+ end
176
+ Chef::Config.chef_repo_path = File.join(Chef::Config.chef_repo_path, 'chef_repo2')
177
+ end
178
+
179
+ context 'when cwd is at the top level' do
180
+ cwd '.'
181
+ it 'knife list --local -Rfp fails' do
182
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
183
+ end
184
+ end
185
+
186
+ context 'when cwd is inside the data_bags directory' do
187
+ cwd 'data_bags'
188
+ it 'knife list --local -Rfp fails' do
189
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
190
+ end
191
+ end
192
+
193
+ context 'when cwd is inside chef_repo2' do
194
+ cwd 'chef_repo2'
195
+ it 'knife list --local -Rfp lists everything' do
196
+ knife('list --local -Rfp').should_succeed <<EOM
197
+ clients/
198
+ clients/client3.json
199
+ cookbooks/
200
+ cookbooks/cookbook3/
201
+ cookbooks/cookbook3/metadata.rb
202
+ data_bags/
203
+ data_bags/bag3/
204
+ data_bags/bag3/item3.json
205
+ environments/
206
+ environments/env3.json
207
+ nodes/
208
+ nodes/node3.json
209
+ roles/
210
+ roles/role3.json
211
+ users/
212
+ users/user3.json
213
+ EOM
214
+ end
215
+ end
216
+
217
+ context 'when cwd is inside chef_repo2/data_bags' do
218
+ cwd 'chef_repo2/data_bags'
219
+ it 'knife list --local -Rfp lists data bags' do
220
+ knife('list --local -Rfp').should_succeed <<EOM
221
+ bag3/
222
+ bag3/item3.json
223
+ EOM
224
+ end
225
+ end
226
+ end
227
+
228
+ context 'when paths are set to point to both versions of each' do
229
+ before :each do
230
+ %w(client cookbook data_bag environment node role user).each do |object_name|
231
+ Chef::Config["#{object_name}_path".to_sym] = [
232
+ File.join(Chef::Config.chef_repo_path, "#{object_name}s"),
233
+ File.join(Chef::Config.chef_repo_path, "#{object_name}s2")
234
+ ]
235
+ end
236
+ Chef::Config.chef_repo_path = File.join(Chef::Config.chef_repo_path, 'chef_repo2')
237
+ end
238
+
239
+ context 'when there is a directory in clients1 and file in clients2 with the same name' do
240
+ directory 'clients/blah.json'
241
+ file 'clients2/blah.json', {}
242
+ it 'knife show /clients/blah.json succeeds' do
243
+ knife('show --local /clients/blah.json').should_succeed <<EOM
244
+ /clients/blah.json:
245
+ {
246
+ }
247
+ EOM
248
+ end
249
+ end
250
+
251
+ context 'when there is a file in cookbooks1 and directory in cookbooks2 with the same name' do
252
+ file 'cookbooks/blah', ''
253
+ file 'cookbooks2/blah/metadata.rb', ''
254
+ it 'knife list -Rfp cookbooks shows files in blah' do
255
+ knife('list --local -Rfp /cookbooks').should_succeed <<EOM
256
+ /cookbooks/blah/
257
+ /cookbooks/blah/metadata.rb
258
+ /cookbooks/cookbook1/
259
+ /cookbooks/cookbook1/metadata.rb
260
+ /cookbooks/cookbook2/
261
+ /cookbooks/cookbook2/metadata.rb
262
+ EOM
263
+ end
264
+ end
265
+
266
+ context 'when there is an empty directory in cookbooks1 and a real cookbook in cookbooks2 with the same name' do
267
+ directory 'cookbooks/blah'
268
+ file 'cookbooks2/blah/metadata.rb', ''
269
+ it 'knife list -Rfp cookbooks shows files in blah' do
270
+ knife('list --local -Rfp /cookbooks').should_succeed(<<EOM, :stderr => "WARN: Cookbook 'blah' is empty or entirely chefignored at #{Chef::Config.cookbook_path[0]}/blah\n")
271
+ /cookbooks/blah/
272
+ /cookbooks/blah/metadata.rb
273
+ /cookbooks/cookbook1/
274
+ /cookbooks/cookbook1/metadata.rb
275
+ /cookbooks/cookbook2/
276
+ /cookbooks/cookbook2/metadata.rb
277
+ EOM
278
+ end
279
+ end
280
+
281
+ context 'when there is a cookbook in cookbooks1 and a cookbook in cookbooks2 with the same name' do
282
+ file 'cookbooks/blah/metadata.json', {}
283
+ file 'cookbooks2/blah/metadata.rb', ''
284
+ it 'knife list -Rfp cookbooks shows files in the first cookbook and not the second' do
285
+ knife('list --local -Rfp /cookbooks').should_succeed(<<EOM, :stderr => "WARN: Child with name 'blah' found in multiple directories: #{Chef::Config.cookbook_path[0]}/blah and #{Chef::Config.cookbook_path[1]}/blah\n")
286
+ /cookbooks/blah/
287
+ /cookbooks/blah/metadata.json
288
+ /cookbooks/cookbook1/
289
+ /cookbooks/cookbook1/metadata.rb
290
+ /cookbooks/cookbook2/
291
+ /cookbooks/cookbook2/metadata.rb
292
+ EOM
293
+ end
294
+ end
295
+
296
+ context 'when there is a file in data_bags1 and a directory in data_bags2 with the same name' do
297
+ file 'data_bags/blah', ''
298
+ file 'data_bags2/blah/item.json', ''
299
+ it 'knife list -Rfp data_bags shows files in blah' do
300
+ knife('list --local -Rfp /data_bags').should_succeed <<EOM
301
+ /data_bags/bag/
302
+ /data_bags/bag/item.json
303
+ /data_bags/bag2/
304
+ /data_bags/bag2/item2.json
305
+ /data_bags/blah/
306
+ /data_bags/blah/item.json
307
+ EOM
308
+ end
309
+ end
310
+
311
+ context 'when there is a data bag in data_bags1 and a data bag in data_bags2 with the same name' do
312
+ file 'data_bags/blah/item1.json', ''
313
+ file 'data_bags2/blah/item2.json', ''
314
+ it 'knife list -Rfp data_bags shows only items in data_bags1' do
315
+ knife('list --local -Rfp /data_bags').should_succeed(<<EOM, :stderr => "WARN: Child with name 'blah' found in multiple directories: #{Chef::Config.data_bag_path[0]}/blah and #{Chef::Config.data_bag_path[1]}/blah\n")
316
+ /data_bags/bag/
317
+ /data_bags/bag/item.json
318
+ /data_bags/bag2/
319
+ /data_bags/bag2/item2.json
320
+ /data_bags/blah/
321
+ /data_bags/blah/item1.json
322
+ EOM
323
+ end
324
+ end
325
+
326
+ context 'when there is a directory in environments1 and file in environments2 with the same name' do
327
+ directory 'environments/blah.json'
328
+ file 'environments2/blah.json', {}
329
+ it 'knife show /environments/blah.json succeeds' do
330
+ knife('show --local /environments/blah.json').should_succeed <<EOM
331
+ /environments/blah.json:
332
+ {
333
+ }
334
+ EOM
335
+ end
336
+ end
337
+
338
+ context 'when there is a directory in nodes1 and file in nodes2 with the same name' do
339
+ directory 'nodes/blah.json'
340
+ file 'nodes2/blah.json', {}
341
+ it 'knife show /nodes/blah.json succeeds' do
342
+ knife('show --local /nodes/blah.json').should_succeed <<EOM
343
+ /nodes/blah.json:
344
+ {
345
+ }
346
+ EOM
347
+ end
348
+ end
349
+
350
+ context 'when there is a directory in roles1 and file in roles2 with the same name' do
351
+ directory 'roles/blah.json'
352
+ file 'roles2/blah.json', {}
353
+ it 'knife show /roles/blah.json succeeds' do
354
+ knife('show --local /roles/blah.json').should_succeed <<EOM
355
+ /roles/blah.json:
356
+ {
357
+ }
358
+ EOM
359
+ end
360
+ end
361
+
362
+ context 'when there is a directory in users1 and file in users2 with the same name' do
363
+ directory 'users/blah.json'
364
+ file 'users2/blah.json', {}
365
+ it 'knife show /users/blah.json succeeds' do
366
+ knife('show --local /users/blah.json').should_succeed <<EOM
367
+ /users/blah.json:
368
+ {
369
+ }
370
+ EOM
371
+ end
372
+ end
373
+
374
+ context 'when cwd is at the top level' do
375
+ cwd '.'
376
+ it 'knife list --local -Rfp fails' do
377
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
378
+ end
379
+ end
380
+
381
+ context 'when cwd is inside the data_bags directory' do
382
+ cwd 'data_bags'
383
+ it 'knife list --local -Rfp lists data bags' do
384
+ knife('list --local -Rfp').should_succeed <<EOM
385
+ bag/
386
+ bag/item.json
387
+ bag2/
388
+ bag2/item2.json
389
+ EOM
390
+ end
391
+ end
392
+
393
+ context 'when cwd is inside chef_repo2' do
394
+ cwd 'chef_repo2'
395
+ it 'knife list --local -Rfp lists everything' do
396
+ knife('list --local -Rfp').should_succeed <<EOM
397
+ clients/
398
+ clients/client1.json
399
+ clients/client2.json
400
+ cookbooks/
401
+ cookbooks/cookbook1/
402
+ cookbooks/cookbook1/metadata.rb
403
+ cookbooks/cookbook2/
404
+ cookbooks/cookbook2/metadata.rb
405
+ data_bags/
406
+ data_bags/bag/
407
+ data_bags/bag/item.json
408
+ data_bags/bag2/
409
+ data_bags/bag2/item2.json
410
+ environments/
411
+ environments/env1.json
412
+ environments/env2.json
413
+ nodes/
414
+ nodes/node1.json
415
+ nodes/node2.json
416
+ roles/
417
+ roles/role1.json
418
+ roles/role2.json
419
+ users/
420
+ users/user1.json
421
+ users/user2.json
422
+ EOM
423
+ end
424
+ end
425
+
426
+ context 'when cwd is inside data_bags2' do
427
+ cwd 'data_bags2'
428
+ it 'knife list --local -Rfp lists data bags' do
429
+ knife('list --local -Rfp').should_succeed <<EOM
430
+ bag/
431
+ bag/item.json
432
+ bag2/
433
+ bag2/item2.json
434
+ EOM
435
+ end
436
+ end
437
+ end
438
+
439
+ context 'when when chef_repo_path is set to both places and no other _path is set' do
440
+ before :each do
441
+ %w(client cookbook data_bag environment node role user).each do |object_name|
442
+ Chef::Config["#{object_name}_path".to_sym] = nil
443
+ end
444
+ Chef::Config.chef_repo_path = [
445
+ Chef::Config.chef_repo_path,
446
+ File.join(Chef::Config.chef_repo_path, 'chef_repo2')
447
+ ]
448
+ end
449
+
450
+ context 'when cwd is at the top level' do
451
+ cwd '.'
452
+ it 'knife list --local -Rfp lists everything' do
453
+ knife('list --local -Rfp').should_succeed <<EOM
454
+ clients/
455
+ clients/client1.json
456
+ clients/client3.json
457
+ cookbooks/
458
+ cookbooks/cookbook1/
459
+ cookbooks/cookbook1/metadata.rb
460
+ cookbooks/cookbook3/
461
+ cookbooks/cookbook3/metadata.rb
462
+ data_bags/
463
+ data_bags/bag/
464
+ data_bags/bag/item.json
465
+ data_bags/bag3/
466
+ data_bags/bag3/item3.json
467
+ environments/
468
+ environments/env1.json
469
+ environments/env3.json
470
+ nodes/
471
+ nodes/node1.json
472
+ nodes/node3.json
473
+ roles/
474
+ roles/role1.json
475
+ roles/role3.json
476
+ users/
477
+ users/user1.json
478
+ users/user3.json
479
+ EOM
480
+ end
481
+ end
482
+
483
+ context 'when cwd is inside the data_bags directory' do
484
+ cwd 'data_bags'
485
+ it 'knife list --local -Rfp lists data bags' do
486
+ knife('list --local -Rfp').should_succeed <<EOM
487
+ bag/
488
+ bag/item.json
489
+ bag3/
490
+ bag3/item3.json
491
+ EOM
492
+ end
493
+ end
494
+
495
+ context 'when cwd is inside chef_repo2' do
496
+ cwd 'chef_repo2'
497
+ it 'knife list --local -Rfp lists everything' do
498
+ knife('list --local -Rfp').should_succeed <<EOM
499
+ clients/
500
+ clients/client1.json
501
+ clients/client3.json
502
+ cookbooks/
503
+ cookbooks/cookbook1/
504
+ cookbooks/cookbook1/metadata.rb
505
+ cookbooks/cookbook3/
506
+ cookbooks/cookbook3/metadata.rb
507
+ data_bags/
508
+ data_bags/bag/
509
+ data_bags/bag/item.json
510
+ data_bags/bag3/
511
+ data_bags/bag3/item3.json
512
+ environments/
513
+ environments/env1.json
514
+ environments/env3.json
515
+ nodes/
516
+ nodes/node1.json
517
+ nodes/node3.json
518
+ roles/
519
+ roles/role1.json
520
+ roles/role3.json
521
+ users/
522
+ users/user1.json
523
+ users/user3.json
524
+ EOM
525
+ end
526
+ end
527
+
528
+ context 'when cwd is inside chef_repo2/data_bags' do
529
+ cwd 'chef_repo2/data_bags'
530
+ it 'knife list --local -Rfp lists data bags' do
531
+ knife('list --local -Rfp').should_succeed <<EOM
532
+ bag/
533
+ bag/item.json
534
+ bag3/
535
+ bag3/item3.json
536
+ EOM
537
+ end
538
+ end
539
+ end
540
+
541
+ context 'when cookbook_path is set and nothing else' do
542
+ before :each do
543
+ %w(client data_bag environment node role user).each do |object_name|
544
+ Chef::Config["#{object_name}_path".to_sym] = nil
545
+ end
546
+ Chef::Config.cookbook_path = File.join(Chef::Config.chef_repo_path, 'chef_repo2', 'cookbooks')
547
+ Chef::Config.chef_repo_path = nil
548
+ end
549
+
550
+ context 'when cwd is at the top level' do
551
+ cwd '.'
552
+ it 'knife list --local -Rfp fails' do
553
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
554
+ end
555
+ end
556
+
557
+ context 'when cwd is inside the data_bags directory' do
558
+ cwd 'data_bags'
559
+ it 'knife list --local -Rfp fails' do
560
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
561
+ end
562
+ end
563
+
564
+ context 'when cwd is inside chef_repo2' do
565
+ cwd 'chef_repo2'
566
+ it 'knife list --local -Rfp lists everything' do
567
+ knife('list --local -Rfp').should_succeed <<EOM
568
+ clients/
569
+ clients/client3.json
570
+ cookbooks/
571
+ cookbooks/cookbook3/
572
+ cookbooks/cookbook3/metadata.rb
573
+ data_bags/
574
+ data_bags/bag3/
575
+ data_bags/bag3/item3.json
576
+ environments/
577
+ environments/env3.json
578
+ nodes/
579
+ nodes/node3.json
580
+ roles/
581
+ roles/role3.json
582
+ users/
583
+ users/user3.json
584
+ EOM
585
+ end
586
+ end
587
+
588
+ context 'when cwd is inside chef_repo2/data_bags' do
589
+ cwd 'chef_repo2/data_bags'
590
+ it 'knife list --local -Rfp lists data bags' do
591
+ knife('list --local -Rfp').should_succeed <<EOM
592
+ bag3/
593
+ bag3/item3.json
594
+ EOM
595
+ end
596
+ end
597
+ end
598
+
599
+ context 'when cookbook_path is set to multiple places and nothing else is set' do
600
+ before :each do
601
+ %w(client data_bag environment node role user).each do |object_name|
602
+ Chef::Config["#{object_name}_path".to_sym] = nil
603
+ end
604
+ Chef::Config.cookbook_path = [
605
+ File.join(Chef::Config.chef_repo_path, 'cookbooks'),
606
+ File.join(Chef::Config.chef_repo_path, 'chef_repo2', 'cookbooks')
607
+ ]
608
+ Chef::Config.chef_repo_path = nil
609
+ end
610
+
611
+ context 'when cwd is at the top level' do
612
+ cwd '.'
613
+ it 'knife list --local -Rfp lists everything' do
614
+ knife('list --local -Rfp').should_succeed <<EOM
615
+ clients/
616
+ clients/client1.json
617
+ clients/client3.json
618
+ cookbooks/
619
+ cookbooks/cookbook1/
620
+ cookbooks/cookbook1/metadata.rb
621
+ cookbooks/cookbook3/
622
+ cookbooks/cookbook3/metadata.rb
623
+ data_bags/
624
+ data_bags/bag/
625
+ data_bags/bag/item.json
626
+ data_bags/bag3/
627
+ data_bags/bag3/item3.json
628
+ environments/
629
+ environments/env1.json
630
+ environments/env3.json
631
+ nodes/
632
+ nodes/node1.json
633
+ nodes/node3.json
634
+ roles/
635
+ roles/role1.json
636
+ roles/role3.json
637
+ users/
638
+ users/user1.json
639
+ users/user3.json
640
+ EOM
641
+ end
642
+ end
643
+
644
+ context 'when cwd is inside the data_bags directory' do
645
+ cwd 'data_bags'
646
+ it 'knife list --local -Rfp lists data bags' do
647
+ knife('list --local -Rfp').should_succeed <<EOM
648
+ bag/
649
+ bag/item.json
650
+ bag3/
651
+ bag3/item3.json
652
+ EOM
653
+ end
654
+ end
655
+
656
+ context 'when cwd is inside chef_repo2' do
657
+ cwd 'chef_repo2'
658
+ it 'knife list --local -Rfp lists everything' do
659
+ knife('list --local -Rfp').should_succeed <<EOM
660
+ clients/
661
+ clients/client1.json
662
+ clients/client3.json
663
+ cookbooks/
664
+ cookbooks/cookbook1/
665
+ cookbooks/cookbook1/metadata.rb
666
+ cookbooks/cookbook3/
667
+ cookbooks/cookbook3/metadata.rb
668
+ data_bags/
669
+ data_bags/bag/
670
+ data_bags/bag/item.json
671
+ data_bags/bag3/
672
+ data_bags/bag3/item3.json
673
+ environments/
674
+ environments/env1.json
675
+ environments/env3.json
676
+ nodes/
677
+ nodes/node1.json
678
+ nodes/node3.json
679
+ roles/
680
+ roles/role1.json
681
+ roles/role3.json
682
+ users/
683
+ users/user1.json
684
+ users/user3.json
685
+ EOM
686
+ end
687
+ end
688
+
689
+ context 'when cwd is inside chef_repo2/data_bags' do
690
+ cwd 'chef_repo2/data_bags'
691
+ it 'knife list --local -Rfp lists data bags' do
692
+ knife('list --local -Rfp').should_succeed <<EOM
693
+ bag/
694
+ bag/item.json
695
+ bag3/
696
+ bag3/item3.json
697
+ EOM
698
+ end
699
+ end
700
+ end
701
+
702
+ context 'when data_bag_path and chef_repo_path are set, and nothing else' do
703
+ before :each do
704
+ %w(client cookbook environment node role user).each do |object_name|
705
+ Chef::Config["#{object_name}_path".to_sym] = nil
706
+ end
707
+ Chef::Config.data_bag_path = File.join(Chef::Config.chef_repo_path, 'data_bags')
708
+ Chef::Config.chef_repo_path = File.join(Chef::Config.chef_repo_path, 'chef_repo2')
709
+ end
710
+
711
+ context 'when cwd is at the top level' do
712
+ cwd '.'
713
+ it 'knife list --local -Rfp fails' do
714
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
715
+ end
716
+ end
717
+
718
+ context 'when cwd is inside the data_bags directory' do
719
+ cwd 'data_bags'
720
+ it 'knife list --local -Rfp lists data bags' do
721
+ knife('list --local -Rfp').should_succeed <<EOM
722
+ bag/
723
+ bag/item.json
724
+ EOM
725
+ end
726
+ end
727
+
728
+ context 'when cwd is inside chef_repo2' do
729
+ cwd 'chef_repo2'
730
+ it 'knife list --local -Rfp lists everything' do
731
+ knife('list --local -Rfp').should_succeed <<EOM
732
+ clients/
733
+ clients/client3.json
734
+ cookbooks/
735
+ cookbooks/cookbook3/
736
+ cookbooks/cookbook3/metadata.rb
737
+ data_bags/
738
+ data_bags/bag/
739
+ data_bags/bag/item.json
740
+ environments/
741
+ environments/env3.json
742
+ nodes/
743
+ nodes/node3.json
744
+ roles/
745
+ roles/role3.json
746
+ users/
747
+ users/user3.json
748
+ EOM
749
+ end
750
+ end
751
+
752
+ context 'when cwd is inside chef_repo2/data_bags' do
753
+ cwd 'chef_repo2/data_bags'
754
+ it 'knife list --local -Rfp fails' do
755
+ knife('list --local -Rfp').should_fail("ERROR: Attempt to use relative path '' when current directory is outside the repository path\n")
756
+ end
757
+ end
758
+ end
759
+
760
+ context 'when data_bag_path is set and nothing else' do
761
+ before :each do
762
+ %w(client cookbook environment node role user).each do |object_name|
763
+ Chef::Config["#{object_name}_path".to_sym] = nil
764
+ end
765
+ Chef::Config.data_bag_path = File.join(Chef::Config.chef_repo_path, 'data_bags')
766
+ Chef::Config.chef_repo_path = nil
767
+ end
768
+
769
+ it 'knife list --local -Rfp / fails' do
770
+ knife('list --local -Rfp /').should_fail("ERROR: Must specify either chef_repo_path or cookbook_path in Chef config file\n")
771
+ end
772
+
773
+ it 'knife list --local -Rfp /data_bags fails' do
774
+ knife('list --local -Rfp /data_bags').should_fail("ERROR: Must specify either chef_repo_path or cookbook_path in Chef config file\n")
775
+ end
776
+
777
+ context 'when cwd is inside the data_bags directory' do
778
+ cwd 'data_bags'
779
+ it 'knife list --local -Rfp fails' do
780
+ knife('list --local -Rfp').should_fail("ERROR: Must specify either chef_repo_path or cookbook_path in Chef config file\n")
781
+ end
782
+ end
783
+ end
784
+ end
785
+
786
+ when_the_repository 'is empty' do
787
+ context 'when the repository _paths point to places that do not exist' do
788
+ before :each do
789
+ %w(client cookbook data_bag environment node role user).each do |object_name|
790
+ Chef::Config["#{object_name}_path".to_sym] = File.join(Chef::Config.chef_repo_path, 'nowhere', object_name)
791
+ end
792
+ Chef::Config.chef_repo_path = File.join(Chef::Config.chef_repo_path, 'nowhere')
793
+ end
794
+
795
+ it 'knife list --local -Rfp / fails' do
796
+ knife('list --local -Rfp /').should_succeed ''
797
+ end
798
+
799
+ it 'knife list --local -Rfp /data_bags fails' do
800
+ knife('list --local -Rfp /data_bags').should_fail("ERROR: /data_bags: No such file or directory\n")
801
+ end
802
+ end
803
+ end
804
+ end
805
+ end