chef 11.4.4 → 11.6.0.hotfix.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. data/README.md +1 -1
  2. data/Rakefile +18 -1
  3. data/bin/chef-service-manager +37 -0
  4. data/distro/common/html/chef-client.8.html +4 -4
  5. data/distro/common/html/chef-expander.8.html +4 -4
  6. data/distro/common/html/chef-expanderctl.8.html +4 -4
  7. data/distro/common/html/chef-server-webui.8.html +4 -4
  8. data/distro/common/html/chef-server.8.html +4 -4
  9. data/distro/common/html/chef-shell.1.html +4 -4
  10. data/distro/common/html/chef-solo.8.html +12 -18
  11. data/distro/common/html/chef-solr.8.html +4 -4
  12. data/distro/common/html/knife-bootstrap.1.html +4 -4
  13. data/distro/common/html/knife-client.1.html +4 -4
  14. data/distro/common/html/knife-configure.1.html +4 -4
  15. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  16. data/distro/common/html/knife-cookbook.1.html +7 -10
  17. data/distro/common/html/knife-data-bag.1.html +7 -10
  18. data/distro/common/html/knife-environment.1.html +6 -8
  19. data/distro/common/html/knife-exec.1.html +4 -4
  20. data/distro/common/html/knife-index.1.html +4 -4
  21. data/distro/common/html/knife-node.1.html +4 -4
  22. data/distro/common/html/knife-role.1.html +4 -4
  23. data/distro/common/html/knife-search.1.html +4 -4
  24. data/distro/common/html/knife-ssh.1.html +4 -4
  25. data/distro/common/html/knife-status.1.html +4 -4
  26. data/distro/common/html/knife-tag.1.html +4 -4
  27. data/distro/common/html/knife.1.html +4 -4
  28. data/distro/common/man/man1/chef-shell.1 +1 -1
  29. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  30. data/distro/common/man/man1/knife-client.1 +1 -1
  31. data/distro/common/man/man1/knife-configure.1 +1 -1
  32. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  33. data/distro/common/man/man1/knife-cookbook.1 +2 -15
  34. data/distro/common/man/man1/knife-data-bag.1 +2 -15
  35. data/distro/common/man/man1/knife-environment.1 +2 -12
  36. data/distro/common/man/man1/knife-exec.1 +1 -1
  37. data/distro/common/man/man1/knife-index.1 +1 -1
  38. data/distro/common/man/man1/knife-node.1 +1 -1
  39. data/distro/common/man/man1/knife-role.1 +1 -1
  40. data/distro/common/man/man1/knife-search.1 +1 -1
  41. data/distro/common/man/man1/knife-ssh.1 +1 -1
  42. data/distro/common/man/man1/knife-status.1 +1 -1
  43. data/distro/common/man/man1/knife-tag.1 +1 -1
  44. data/distro/common/man/man1/knife.1 +1 -1
  45. data/distro/common/man/man8/chef-client.8 +1 -1
  46. data/distro/common/man/man8/chef-expander.8 +1 -1
  47. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  48. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  49. data/distro/common/man/man8/chef-server.8 +1 -1
  50. data/distro/common/man/man8/chef-solo.8 +4 -36
  51. data/distro/common/man/man8/chef-solr.8 +1 -1
  52. data/distro/debian/etc/init.d/chef-client +4 -2
  53. data/distro/windows/service_manager.rb +2 -146
  54. data/lib/chef.rb +1 -1
  55. data/lib/chef/application.rb +5 -12
  56. data/lib/chef/application/apply.rb +2 -0
  57. data/lib/chef/application/client.rb +12 -12
  58. data/lib/chef/application/knife.rb +2 -2
  59. data/lib/chef/application/solo.rb +4 -5
  60. data/lib/chef/application/windows_service.rb +113 -56
  61. data/lib/chef/application/windows_service_manager.rb +179 -0
  62. data/lib/chef/chef_fs.rb +2 -4
  63. data/lib/chef/chef_fs/chef_fs_data_store.rb +371 -0
  64. data/lib/chef/chef_fs/command_line.rb +145 -93
  65. data/lib/chef/chef_fs/config.rb +205 -0
  66. data/lib/chef/chef_fs/data_handler/acl_data_handler.rb +26 -0
  67. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +38 -0
  68. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +29 -0
  69. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +38 -0
  70. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +56 -0
  71. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +128 -0
  72. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +40 -0
  73. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +51 -0
  74. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +36 -0
  75. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +40 -0
  76. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +27 -0
  77. data/lib/chef/chef_fs/file_system.rb +195 -127
  78. data/lib/chef/chef_fs/file_system/acl_dir.rb +64 -0
  79. data/lib/chef/chef_fs/file_system/acl_entry.rb +58 -0
  80. data/lib/chef/chef_fs/file_system/acls_dir.rb +68 -0
  81. data/lib/chef/chef_fs/file_system/already_exists_error.rb +31 -0
  82. data/lib/chef/chef_fs/file_system/base_fs_object.rb +98 -39
  83. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_dir.rb +85 -0
  84. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbook_entry.rb +71 -0
  85. data/lib/chef/chef_fs/file_system/chef_repository_file_system_cookbooks_dir.rb +55 -0
  86. data/lib/chef/chef_fs/file_system/chef_repository_file_system_data_bags_dir.rb +36 -0
  87. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +14 -63
  88. data/lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb +93 -3
  89. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +35 -9
  90. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +67 -32
  91. data/lib/chef/chef_fs/file_system/cookbook_file.rb +13 -6
  92. data/lib/chef/chef_fs/file_system/cookbook_frozen_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/cookbooks_acl_dir.rb +41 -0
  94. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +102 -21
  95. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +12 -21
  96. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +14 -8
  97. data/lib/chef/chef_fs/file_system/default_environment_cannot_be_modified_error.rb +36 -0
  98. data/lib/chef/chef_fs/file_system/environments_dir.rb +60 -0
  99. data/lib/chef/chef_fs/file_system/file_system_entry.rb +8 -8
  100. data/lib/chef/chef_fs/file_system/file_system_error.rb +3 -1
  101. data/lib/chef/chef_fs/file_system/memory_dir.rb +52 -0
  102. data/lib/chef/chef_fs/file_system/memory_file.rb +17 -0
  103. data/lib/chef/chef_fs/file_system/memory_root.rb +21 -0
  104. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +48 -0
  105. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +2 -2
  106. data/lib/chef/chef_fs/file_system/nodes_dir.rb +17 -9
  107. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
  108. data/lib/chef/chef_fs/file_system/not_found_error.rb +2 -2
  109. data/lib/chef/chef_fs/file_system/operation_failed_error.rb +34 -0
  110. data/lib/chef/chef_fs/file_system/operation_not_allowed_error.rb +48 -0
  111. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +42 -13
  112. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +81 -27
  113. data/lib/chef/chef_fs/knife.rb +68 -29
  114. data/lib/chef/chef_fs/parallelizer.rb +129 -0
  115. data/lib/chef/chef_fs/path_utils.rb +29 -3
  116. data/lib/chef/chef_fs/raw_request.rb +79 -0
  117. data/lib/chef/client.rb +46 -20
  118. data/lib/chef/config.rb +59 -61
  119. data/lib/chef/cookbook/chefignore.rb +2 -1
  120. data/lib/chef/cookbook/synchronizer.rb +8 -6
  121. data/lib/chef/cookbook/syntax_check.rb +17 -2
  122. data/lib/chef/cookbook_uploader.rb +10 -1
  123. data/lib/chef/cookbook_version.rb +0 -109
  124. data/lib/chef/data_bag.rb +15 -6
  125. data/lib/chef/deprecation/mixin/template.rb +49 -0
  126. data/lib/chef/deprecation/provider/cookbook_file.rb +55 -0
  127. data/lib/chef/deprecation/provider/file.rb +197 -0
  128. data/lib/chef/deprecation/provider/remote_file.rb +86 -0
  129. data/lib/chef/deprecation/provider/template.rb +63 -0
  130. data/lib/chef/deprecation/warnings.rb +38 -0
  131. data/lib/chef/encrypted_data_bag_item.rb +153 -61
  132. data/lib/chef/environment.rb +34 -3
  133. data/lib/chef/event_dispatch/base.rb +3 -0
  134. data/lib/chef/exceptions.rb +27 -2
  135. data/lib/chef/file_access_control/unix.rb +64 -7
  136. data/lib/chef/file_access_control/windows.rb +22 -11
  137. data/lib/chef/file_content_management/content_base.rb +56 -0
  138. data/lib/chef/file_content_management/deploy.rb +38 -0
  139. data/lib/chef/file_content_management/deploy/cp.rb +48 -0
  140. data/lib/chef/file_content_management/deploy/mv_unix.rb +77 -0
  141. data/lib/chef/file_content_management/deploy/mv_windows.rb +95 -0
  142. data/lib/chef/file_content_management/tempfile.rb +61 -0
  143. data/lib/chef/formatters/doc.rb +1 -1
  144. data/lib/chef/formatters/error_descriptor.rb +5 -4
  145. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +23 -3
  146. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +4 -0
  147. data/lib/chef/json_compat.rb +3 -0
  148. data/lib/chef/knife.rb +12 -3
  149. data/lib/chef/knife/bootstrap.rb +46 -2
  150. data/lib/chef/knife/bootstrap/archlinux-gems.erb +3 -3
  151. data/lib/chef/knife/bootstrap/centos5-gems.erb +3 -3
  152. data/lib/chef/knife/bootstrap/chef-full.erb +4 -4
  153. data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -3
  154. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +3 -3
  155. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +3 -3
  156. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +3 -3
  157. data/lib/chef/knife/client_show.rb +2 -5
  158. data/lib/chef/knife/configure.rb +3 -3
  159. data/lib/chef/knife/cookbook_create.rb +6 -5
  160. data/lib/chef/knife/cookbook_download.rb +13 -5
  161. data/lib/chef/knife/cookbook_site_share.rb +1 -0
  162. data/lib/chef/knife/cookbook_test.rb +1 -0
  163. data/lib/chef/knife/cookbook_upload.rb +4 -9
  164. data/lib/chef/knife/core/bootstrap_context.rb +10 -4
  165. data/lib/chef/knife/core/generic_presenter.rb +16 -0
  166. data/lib/chef/knife/core/node_editor.rb +1 -1
  167. data/lib/chef/knife/core/subcommand_loader.rb +43 -12
  168. data/lib/chef/knife/core/ui.rb +19 -4
  169. data/lib/chef/knife/delete.rb +76 -9
  170. data/lib/chef/knife/deps.rb +139 -0
  171. data/lib/chef/knife/diff.rb +22 -5
  172. data/lib/chef/knife/download.rb +16 -3
  173. data/lib/chef/knife/edit.rb +76 -0
  174. data/lib/chef/knife/environment_show.rb +2 -7
  175. data/lib/chef/knife/list.rb +91 -47
  176. data/lib/chef/knife/node_run_list_set.rb +66 -0
  177. data/lib/chef/knife/node_show.rb +1 -7
  178. data/lib/chef/knife/raw.rb +20 -64
  179. data/lib/chef/knife/role_show.rb +2 -4
  180. data/lib/chef/knife/search.rb +5 -6
  181. data/lib/chef/knife/show.rb +34 -11
  182. data/lib/chef/knife/ssh.rb +8 -0
  183. data/lib/chef/knife/upload.rb +23 -4
  184. data/lib/chef/knife/user_show.rb +2 -5
  185. data/lib/chef/knife/xargs.rb +265 -0
  186. data/lib/chef/log.rb +2 -2
  187. data/lib/chef/mixin/file_class.rb +0 -9
  188. data/lib/chef/mixin/language_include_recipe.rb +1 -1
  189. data/lib/chef/mixin/params_validate.rb +19 -9
  190. data/lib/chef/mixin/template.rb +126 -36
  191. data/lib/chef/mixin/windows_architecture_helper.rb +91 -0
  192. data/lib/chef/monkey_patches/file.rb +26 -0
  193. data/lib/chef/monkey_patches/net-ssh-multi.rb +140 -0
  194. data/lib/chef/monkey_patches/securerandom.rb +44 -0
  195. data/lib/chef/monologger.rb +93 -0
  196. data/lib/chef/node.rb +4 -0
  197. data/lib/chef/platform.rb +4 -490
  198. data/lib/chef/platform/provider_mapping.rb +529 -0
  199. data/lib/chef/{monkey_patches/dir.rb → platform/query_helpers.rb} +25 -19
  200. data/lib/chef/provider.rb +12 -9
  201. data/lib/chef/provider/batch.rb +35 -0
  202. data/lib/chef/provider/cookbook_file.rb +9 -78
  203. data/lib/chef/provider/cookbook_file/content.rb +49 -0
  204. data/lib/chef/provider/deploy.rb +24 -20
  205. data/lib/chef/provider/deploy/revision.rb +27 -0
  206. data/lib/chef/provider/directory.rb +19 -22
  207. data/lib/chef/provider/execute.rb +22 -5
  208. data/lib/chef/provider/file.rb +299 -217
  209. data/lib/chef/provider/file/content.rb +39 -0
  210. data/lib/chef/provider/git.rb +76 -43
  211. data/lib/chef/provider/group/usermod.rb +2 -2
  212. data/lib/chef/provider/ifconfig.rb +25 -35
  213. data/lib/chef/provider/ifconfig/debian.rb +71 -0
  214. data/lib/chef/provider/ifconfig/redhat.rb +47 -0
  215. data/lib/chef/provider/link.rb +10 -3
  216. data/lib/chef/provider/mount.rb +1 -1
  217. data/lib/chef/provider/mount/mount.rb +8 -3
  218. data/lib/chef/provider/mount/windows.rb +4 -1
  219. data/lib/chef/provider/package/portage.rb +9 -4
  220. data/lib/chef/provider/package/rubygems.rb +45 -10
  221. data/lib/chef/provider/package/smartos.rb +47 -36
  222. data/lib/chef/provider/package/yum.rb +19 -12
  223. data/lib/chef/provider/package/zypper.rb +45 -55
  224. data/lib/chef/provider/powershell_script.rb +77 -0
  225. data/lib/chef/provider/remote_directory.rb +5 -6
  226. data/lib/chef/provider/remote_file.rb +12 -108
  227. data/lib/chef/provider/remote_file/cache_control_data.rb +165 -0
  228. data/lib/chef/provider/remote_file/content.rb +75 -0
  229. data/lib/chef/provider/remote_file/fetcher.rb +43 -0
  230. data/lib/chef/provider/remote_file/ftp.rb +183 -0
  231. data/lib/chef/provider/remote_file/http.rb +124 -0
  232. data/lib/chef/provider/remote_file/local_file.rb +47 -0
  233. data/lib/chef/provider/route.rb +6 -2
  234. data/lib/chef/provider/script.rb +14 -2
  235. data/lib/chef/provider/service/macosx.rb +16 -10
  236. data/lib/chef/provider/service/solaris.rb +6 -5
  237. data/lib/chef/provider/template.rb +16 -78
  238. data/lib/chef/provider/template/content.rb +61 -0
  239. data/lib/chef/provider/user/solaris.rb +90 -0
  240. data/lib/chef/provider/user/useradd.rb +76 -63
  241. data/lib/chef/provider/windows_script.rb +73 -0
  242. data/lib/chef/providers.rb +16 -0
  243. data/lib/chef/resource.rb +23 -2
  244. data/lib/chef/resource/batch.rb +31 -0
  245. data/lib/chef/resource/conditional.rb +4 -0
  246. data/lib/chef/resource/conditional_action_not_nothing.rb +48 -0
  247. data/lib/chef/resource/file.rb +31 -3
  248. data/lib/chef/resource/link.rb +17 -0
  249. data/lib/chef/resource/lwrp_base.rb +1 -1
  250. data/lib/chef/resource/mount.rb +29 -2
  251. data/lib/chef/resource/powershell_script.rb +31 -0
  252. data/lib/chef/resource/remote_file.rb +47 -1
  253. data/lib/chef/resource/route.rb +1 -1
  254. data/lib/chef/resource/template.rb +145 -0
  255. data/lib/chef/resource/windows_script.rb +62 -0
  256. data/lib/chef/resource_collection.rb +45 -11
  257. data/lib/chef/resource_reporter.rb +81 -52
  258. data/lib/chef/resources.rb +2 -0
  259. data/lib/chef/rest.rb +13 -4
  260. data/lib/chef/rest/rest_request.rb +5 -1
  261. data/lib/chef/run_context/cookbook_compiler.rb +3 -3
  262. data/lib/chef/run_list/run_list_expansion.rb +1 -1
  263. data/lib/chef/run_lock.rb +7 -1
  264. data/lib/chef/runner.rb +0 -1
  265. data/lib/chef/scan_access_control.rb +6 -1
  266. data/lib/chef/search/query.rb +2 -2
  267. data/lib/chef/shell/shell_session.rb +2 -2
  268. data/lib/chef/util/backup.rb +84 -0
  269. data/lib/chef/util/diff.rb +145 -0
  270. data/lib/chef/util/file_edit.rb +1 -1
  271. data/lib/chef/util/selinux.rb +100 -0
  272. data/lib/chef/util/windows/net_user.rb +14 -1
  273. data/lib/chef/util/windows/volume.rb +2 -2
  274. data/lib/chef/version.rb +1 -1
  275. data/lib/chef/version/platform.rb +42 -0
  276. data/lib/chef/version_class.rb +1 -1
  277. data/lib/chef/version_constraint.rb +6 -5
  278. data/lib/chef/version_constraint/platform.rb +26 -0
  279. data/lib/chef/win32/api/file.rb +8 -2
  280. data/lib/chef/win32/version.rb +25 -8
  281. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -0
  282. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -0
  283. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -0
  284. data/spec/data/apt/chef-integration-test-1.0/debian/copyright +34 -0
  285. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -0
  286. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -0
  287. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -0
  288. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -0
  289. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -0
  290. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -0
  291. data/spec/data/apt/chef-integration-test-1.1/debian/copyright +34 -0
  292. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -0
  293. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -0
  294. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -0
  295. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -0
  296. data/spec/data/apt/chef-integration-test_1.0-1_amd64.deb +0 -0
  297. data/spec/data/apt/chef-integration-test_1.0.orig.tar.gz +0 -0
  298. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -0
  299. data/spec/data/apt/chef-integration-test_1.1-1_amd64.deb +0 -0
  300. data/spec/data/apt/chef-integration-test_1.1.orig.tar.gz +0 -0
  301. data/spec/data/apt/var/www/apt/conf/distributions +7 -0
  302. data/spec/data/apt/var/www/apt/conf/incoming +4 -0
  303. data/spec/data/apt/var/www/apt/conf/pulls +3 -0
  304. data/spec/data/apt/var/www/apt/db/checksums.db +0 -0
  305. data/spec/data/apt/var/www/apt/db/contents.cache.db +0 -0
  306. data/spec/data/apt/var/www/apt/db/packages.db +0 -0
  307. data/spec/data/apt/var/www/apt/db/references.db +0 -0
  308. data/spec/data/apt/var/www/apt/db/release.caches.db +0 -0
  309. data/spec/data/apt/var/www/apt/db/version +4 -0
  310. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -0
  311. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -0
  312. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages.gz +0 -0
  313. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -0
  314. data/spec/data/apt/var/www/apt/dists/sid/main/binary-i386/Packages +0 -0
  315. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.0-1_amd64.deb +0 -0
  316. data/spec/data/apt/var/www/apt/pool/main/c/chef-integration-test/chef-integration-test_1.1-1_amd64.deb +0 -0
  317. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -0
  318. data/spec/data/bootstrap/secret.erb +9 -0
  319. data/spec/data/cookbooks/ignorken/recipes/default.rb +1 -0
  320. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +2 -0
  321. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
  322. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
  323. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
  324. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
  325. data/spec/data/cookbooks/openldap/templates/default/all_windows_line_endings.erb +4 -0
  326. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -0
  327. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -0
  328. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -0
  329. data/spec/data/cookbooks/openldap/templates/default/some_windows_line_endings.erb +4 -0
  330. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -0
  331. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -0
  332. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -0
  333. data/spec/data/git_bundles/example-repo.gitbundle +0 -0
  334. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  335. data/spec/data/knife_subcommand/test_yourself.rb +8 -0
  336. data/spec/data/null_config.rb +1 -0
  337. data/spec/data/partial_one.erb +1 -1
  338. data/spec/data/remote_file/nyan_cat.png.gz +0 -0
  339. data/spec/functional/file_content_management/deploy_strategies_spec.rb +238 -0
  340. data/spec/functional/knife/exec_spec.rb +2 -2
  341. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +101 -0
  342. data/spec/functional/resource/batch_spec.rb +64 -0
  343. data/spec/functional/resource/cookbook_file_spec.rb +2 -3
  344. data/spec/functional/resource/deploy_revision_spec.rb +180 -0
  345. data/spec/functional/resource/directory_spec.rb +2 -2
  346. data/spec/functional/resource/file_spec.rb +17 -1
  347. data/spec/functional/resource/git_spec.rb +259 -0
  348. data/spec/functional/resource/link_spec.rb +422 -388
  349. data/spec/functional/resource/package_spec.rb +297 -0
  350. data/spec/functional/resource/powershell_spec.rb +188 -0
  351. data/spec/functional/resource/registry_spec.rb +8 -4
  352. data/spec/functional/resource/remote_directory_spec.rb +2 -2
  353. data/spec/functional/resource/remote_file_spec.rb +97 -29
  354. data/spec/functional/resource/template_spec.rb +173 -17
  355. data/spec/functional/resource/user_spec.rb +547 -0
  356. data/spec/functional/run_lock_spec.rb +5 -0
  357. data/spec/functional/shell_spec.rb +2 -1
  358. data/spec/functional/win32/service_manager_spec.rb +269 -0
  359. data/spec/functional/win32/versions_spec.rb +78 -0
  360. data/spec/integration/knife/chef_repo_path_spec.rb +805 -0
  361. data/spec/integration/knife/chef_repository_file_system_spec.rb +276 -0
  362. data/spec/integration/knife/chefignore_spec.rb +271 -0
  363. data/spec/integration/knife/delete_spec.rb +944 -0
  364. data/spec/integration/knife/deps_spec.rb +648 -0
  365. data/spec/integration/knife/diff_spec.rb +536 -0
  366. data/spec/integration/knife/download_spec.rb +962 -0
  367. data/spec/integration/knife/list_spec.rb +633 -0
  368. data/spec/integration/knife/raw_spec.rb +166 -0
  369. data/spec/integration/knife/redirection_spec.rb +57 -0
  370. data/spec/integration/knife/show_spec.rb +158 -0
  371. data/spec/integration/knife/upload_spec.rb +1060 -0
  372. data/spec/integration/solo/solo_spec.rb +41 -0
  373. data/spec/spec_helper.rb +55 -1
  374. data/spec/support/chef_helpers.rb +32 -0
  375. data/spec/support/platform_helpers.rb +40 -0
  376. data/spec/support/platforms/win32/spec_service.rb +59 -0
  377. data/spec/support/shared/functional/directory_resource.rb +43 -16
  378. data/spec/support/shared/functional/file_resource.rb +661 -20
  379. data/spec/support/shared/functional/securable_resource.rb +109 -8
  380. data/spec/support/shared/functional/securable_resource_with_reporting.rb +39 -31
  381. data/spec/support/shared/integration/integration_helper.rb +166 -0
  382. data/spec/support/shared/integration/knife_support.rb +171 -0
  383. data/spec/support/shared/unit/execute_resource.rb +125 -0
  384. data/spec/support/shared/unit/file_system_support.rb +8 -48
  385. data/spec/support/shared/unit/provider/file.rb +609 -0
  386. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +407 -0
  387. data/spec/support/shared/unit/script_resource.rb +52 -0
  388. data/spec/support/shared/unit/windows_script_resource.rb +48 -0
  389. data/spec/tiny_server.rb +13 -11
  390. data/spec/unit/application/client_spec.rb +39 -1
  391. data/spec/unit/application/knife_spec.rb +12 -0
  392. data/spec/unit/application/solo_spec.rb +1 -1
  393. data/spec/unit/application_spec.rb +57 -2
  394. data/spec/unit/chef_fs/diff_spec.rb +30 -31
  395. data/spec/unit/chef_fs/file_pattern_spec.rb +2 -2
  396. data/spec/unit/chef_fs/file_system_spec.rb +2 -3
  397. data/spec/unit/client_spec.rb +20 -1
  398. data/spec/unit/config_spec.rb +70 -52
  399. data/spec/unit/cookbook/synchronizer_spec.rb +49 -1
  400. data/spec/unit/cookbook/syntax_check_spec.rb +28 -3
  401. data/spec/unit/cookbook_loader_spec.rb +3 -2
  402. data/spec/unit/daemon_spec.rb +7 -7
  403. data/spec/unit/data_bag_spec.rb +7 -0
  404. data/spec/unit/deprecation_spec.rb +86 -0
  405. data/spec/unit/encrypted_data_bag_item_spec.rb +183 -88
  406. data/spec/unit/environment_spec.rb +98 -0
  407. data/spec/unit/exceptions_spec.rb +6 -1
  408. data/spec/unit/file_access_control_spec.rb +21 -1
  409. data/spec/unit/file_content_management/deploy/cp_spec.rb +46 -0
  410. data/spec/unit/file_content_management/deploy/mv_unix_spec.rb +103 -0
  411. data/spec/unit/file_content_management/deploy/mv_windows_spec.rb +179 -0
  412. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +38 -2
  413. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -2
  414. data/spec/unit/knife/bootstrap_spec.rb +128 -29
  415. data/spec/unit/knife/configure_spec.rb +42 -26
  416. data/spec/unit/knife/cookbook_download_spec.rb +24 -3
  417. data/spec/unit/knife/cookbook_upload_spec.rb +8 -4
  418. data/spec/unit/knife/core/bootstrap_context_spec.rb +78 -61
  419. data/spec/unit/knife/core/subcommand_loader_spec.rb +20 -0
  420. data/spec/unit/knife/core/ui_spec.rb +41 -0
  421. data/spec/unit/knife/node_run_list_set_spec.rb +140 -0
  422. data/spec/unit/knife_spec.rb +21 -0
  423. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +1 -0
  424. data/spec/unit/mixin/params_validate_spec.rb +35 -0
  425. data/spec/unit/mixin/template_spec.rb +69 -57
  426. data/spec/unit/mixin/windows_architecture_helper_spec.rb +83 -0
  427. data/spec/unit/node_spec.rb +7 -0
  428. data/spec/unit/platform_spec.rb +15 -1
  429. data/spec/unit/provider/cookbook_file/content_spec.rb +40 -0
  430. data/spec/unit/provider/cookbook_file_spec.rb +26 -183
  431. data/spec/unit/provider/cron/solaris_spec.rb +1 -1
  432. data/spec/unit/provider/deploy/revision_spec.rb +19 -11
  433. data/spec/unit/provider/deploy_spec.rb +2 -2
  434. data/spec/unit/provider/directory_spec.rb +23 -23
  435. data/spec/unit/provider/execute_spec.rb +27 -1
  436. data/spec/unit/provider/file/content_spec.rb +101 -0
  437. data/spec/unit/provider/file_spec.rb +25 -484
  438. data/spec/unit/provider/git_spec.rb +224 -28
  439. data/spec/unit/provider/group/usermod_spec.rb +3 -1
  440. data/spec/unit/provider/ifconfig/debian_spec.rb +89 -0
  441. data/spec/unit/provider/ifconfig/redhat_spec.rb +71 -0
  442. data/spec/unit/provider/ifconfig_spec.rb +0 -33
  443. data/spec/unit/provider/mount/mount_spec.rb +33 -2
  444. data/spec/unit/provider/mount/windows_spec.rb +4 -1
  445. data/spec/unit/provider/mount_spec.rb +16 -6
  446. data/spec/unit/provider/package/portage_spec.rb +44 -0
  447. data/spec/unit/provider/package/rubygems_spec.rb +44 -1
  448. data/spec/unit/provider/package/smartos_spec.rb +3 -2
  449. data/spec/unit/provider/package/yum_spec.rb +36 -39
  450. data/spec/unit/provider/package/zypper_spec.rb +84 -22
  451. data/spec/unit/provider/package_spec.rb +0 -4
  452. data/spec/unit/provider/powershell_spec.rb +38 -0
  453. data/spec/unit/provider/remote_directory_spec.rb +0 -4
  454. data/spec/unit/provider/remote_file/cache_control_data_spec.rb +211 -0
  455. data/spec/unit/provider/remote_file/content_spec.rb +230 -0
  456. data/spec/unit/provider/remote_file/fetcher_spec.rb +75 -0
  457. data/spec/unit/provider/remote_file/ftp_spec.rb +224 -0
  458. data/spec/unit/provider/remote_file/http_spec.rb +319 -0
  459. data/spec/unit/provider/remote_file/local_file_spec.rb +60 -0
  460. data/spec/unit/provider/remote_file_spec.rb +33 -295
  461. data/spec/unit/provider/route_spec.rb +25 -9
  462. data/spec/unit/provider/service/macosx_spec.rb +176 -152
  463. data/spec/unit/provider/service/solaris_smf_service_spec.rb +21 -18
  464. data/spec/unit/provider/service/systemd_service_spec.rb +2 -2
  465. data/spec/unit/provider/service/upstart_service_spec.rb +2 -2
  466. data/spec/unit/provider/service_spec.rb +3 -3
  467. data/spec/unit/provider/template/content_spec.rb +78 -0
  468. data/spec/unit/provider/template_spec.rb +52 -184
  469. data/spec/unit/provider/user/solaris_spec.rb +80 -0
  470. data/spec/unit/provider/user/useradd_spec.rb +12 -358
  471. data/spec/unit/resource/batch_spec.rb +48 -0
  472. data/spec/unit/resource/conditional_action_not_nothing_spec.rb +45 -0
  473. data/spec/unit/resource/execute_spec.rb +3 -101
  474. data/spec/unit/resource/file_spec.rb +0 -5
  475. data/spec/unit/resource/group_spec.rb +9 -0
  476. data/spec/unit/resource/ifconfig_spec.rb +60 -1
  477. data/spec/unit/resource/link_spec.rb +1 -0
  478. data/spec/unit/resource/mount_spec.rb +37 -0
  479. data/spec/unit/resource/powershell_spec.rb +48 -0
  480. data/spec/unit/resource/remote_file_spec.rb +44 -4
  481. data/spec/unit/resource/route_spec.rb +1 -1
  482. data/spec/unit/resource/script_spec.rb +13 -36
  483. data/spec/unit/resource/template_spec.rb +111 -8
  484. data/spec/unit/resource/user_spec.rb +7 -0
  485. data/spec/unit/resource_collection_spec.rb +61 -32
  486. data/spec/unit/resource_reporter_spec.rb +115 -102
  487. data/spec/unit/resource_spec.rb +170 -1
  488. data/spec/unit/rest/auth_credentials_spec.rb +2 -2
  489. data/spec/unit/rest_spec.rb +6 -2
  490. data/spec/unit/run_context/cookbook_compiler_spec.rb +9 -0
  491. data/spec/unit/runner_spec.rb +1 -1
  492. data/spec/unit/scan_access_control_spec.rb +4 -2
  493. data/spec/unit/shell/shell_session_spec.rb +15 -2
  494. data/spec/unit/util/backup_spec.rb +149 -0
  495. data/spec/unit/util/diff_spec.rb +596 -0
  496. data/spec/unit/util/selinux_spec.rb +172 -0
  497. data/spec/unit/version/platform_spec.rb +61 -0
  498. data/spec/unit/version_constraint/platform_spec.rb +46 -0
  499. data/spec/unit/version_constraint_spec.rb +5 -0
  500. metadata +233 -10
  501. data/lib/chef/chef_fs/file_system/data_bag_item.rb +0 -59
  502. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +0 -237
  503. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +0 -568
  504. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +0 -220
@@ -6,9 +6,9 @@
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
8
8
  # You may obtain a copy of the License at
9
- #
9
+ #
10
10
  # http://www.apache.org/licenses/LICENSE-2.0
11
- #
11
+ #
12
12
  # Unless required by applicable law or agreed to in writing, software
13
13
  # distributed under the License is distributed on an "AS IS" BASIS,
14
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -22,7 +22,7 @@ describe Chef::Resource::Template do
22
22
 
23
23
  before(:each) do
24
24
  @resource = Chef::Resource::Template.new("fakey_fakerton")
25
- end
25
+ end
26
26
 
27
27
  describe "initialize" do
28
28
  it "should create a new Chef::Resource::Template" do
@@ -47,20 +47,20 @@ describe Chef::Resource::Template do
47
47
  r.source.should eql("fakey_fakerton.erb")
48
48
  end
49
49
  end
50
-
50
+
51
51
  describe "variables" do
52
52
  it "should accept a hash for the variable list" do
53
53
  @resource.variables({ :reluctance => :awkward })
54
54
  @resource.variables.should == { :reluctance => :awkward }
55
55
  end
56
56
  end
57
-
57
+
58
58
  describe "cookbook" do
59
59
  it "should accept a string for the cookbook name" do
60
60
  @resource.cookbook("foo")
61
61
  @resource.cookbook.should == "foo"
62
62
  end
63
-
63
+
64
64
  it "should default to nil" do
65
65
  @resource.cookbook.should == nil
66
66
  end
@@ -76,7 +76,7 @@ describe Chef::Resource::Template do
76
76
  @resource.local.should == false
77
77
  end
78
78
  end
79
-
79
+
80
80
  describe "when it has a path, owner, group, mode, and checksum" do
81
81
  before do
82
82
  @resource.path("/tmp/foo.txt")
@@ -104,5 +104,108 @@ describe Chef::Resource::Template do
104
104
  it "returns the file path as its identity" do
105
105
  @resource.identity.should == "/tmp/foo.txt"
106
106
  end
107
- end
107
+ end
108
+
109
+ describe "defining helper methods" do
110
+
111
+ module ExampleHelpers
112
+ def static_example
113
+ "static_example"
114
+ end
115
+ end
116
+
117
+ it "collects helper method bodies as blocks" do
118
+ @resource.helper(:example_1) { "example_1" }
119
+ @resource.helper(:example_2) { "example_2" }
120
+ @resource.inline_helper_blocks[:example_1].call.should == "example_1"
121
+ @resource.inline_helper_blocks[:example_2].call.should == "example_2"
122
+ end
123
+
124
+ it "compiles helper methods into a module" do
125
+ @resource.helper(:example_1) { "example_1" }
126
+ @resource.helper(:example_2) { "example_2" }
127
+ modules = @resource.helper_modules
128
+ modules.should have(1).module
129
+ o = Object.new
130
+ modules.each {|m| o.extend(m)}
131
+ o.example_1.should == "example_1"
132
+ o.example_2.should == "example_2"
133
+ end
134
+
135
+ it "compiles helper methods with arguments into a module" do
136
+ @resource.helper(:shout) { |quiet| quiet.upcase }
137
+ modules = @resource.helper_modules
138
+ o = Object.new
139
+ modules.each {|m| o.extend(m)}
140
+ o.shout("shout").should == "SHOUT"
141
+ end
142
+
143
+ it "raises an error when attempting to define a helper method without a method body" do
144
+ lambda { @resource.helper(:example) }.should raise_error(Chef::Exceptions::ValidationFailed)
145
+ end
146
+
147
+ it "raises an error when attempting to define a helper method with a non-Symbod method name" do
148
+ lambda { @resource.helper("example") { "fail" } }.should raise_error(Chef::Exceptions::ValidationFailed)
149
+ end
150
+
151
+ it "collects helper module bodies as blocks" do
152
+ @resource.helpers do
153
+ def example_1
154
+ "example_1"
155
+ end
156
+ end
157
+ module_body = @resource.inline_helper_modules.first
158
+ module_body.should be_a(Proc)
159
+ end
160
+
161
+ it "compiles helper module bodies into modules" do
162
+ @resource.helpers do
163
+ def example_1
164
+ "example_1"
165
+ end
166
+ end
167
+ modules = @resource.helper_modules
168
+ modules.should have(1).module
169
+ o = Object.new
170
+ modules.each {|m| o.extend(m)}
171
+ o.example_1.should == "example_1"
172
+ end
173
+
174
+ it "raises an error when no block or module name is given for helpers definition" do
175
+ lambda { @resource.helpers() }.should raise_error(Chef::Exceptions::ValidationFailed)
176
+ end
177
+
178
+ it "raises an error when a non-module is given for helpers definition" do
179
+ lambda { @resource.helpers("NotAModule") }.should raise_error(Chef::Exceptions::ValidationFailed)
180
+ end
181
+
182
+ it "raises an error when a module name and block are both given for helpers definition" do
183
+ lambda { @resource.helpers(ExampleHelpers) { module_code } }.should raise_error(Chef::Exceptions::ValidationFailed)
184
+ end
185
+
186
+ it "collects helper modules" do
187
+ @resource.helpers(ExampleHelpers)
188
+ @resource.helper_modules.should include(ExampleHelpers)
189
+ end
190
+
191
+ it "combines all helpers into a set of compiled modules" do
192
+ @resource.helpers(ExampleHelpers)
193
+ @resource.helpers do
194
+ def inline_module
195
+ "inline_module"
196
+ end
197
+ end
198
+ @resource.helper(:inline_method) { "inline_method" }
199
+ @resource.should have(3).helper_modules
200
+
201
+ o = Object.new
202
+ @resource.helper_modules.each {|m| o.extend(m)}
203
+ o.static_example.should == "static_example"
204
+ o.inline_module.should == "inline_module"
205
+ o.inline_method.should == "inline_method"
206
+ end
207
+
208
+
209
+ end
210
+
108
211
  end
@@ -59,6 +59,13 @@ describe Chef::Resource::User, "initialize" do
59
59
  @resource.allowed_actions.detect { |a| a == action.to_sym }.should eql(action.to_sym)
60
60
  end
61
61
  end
62
+
63
+ it "should accept domain users (@ or \ separator) on non-windows" do
64
+ lambda { @resource.username "domain\@user" }.should_not raise_error(ArgumentError)
65
+ @resource.username.should == "domain\@user"
66
+ lambda { @resource.username "domain\\user" }.should_not raise_error(ArgumentError)
67
+ @resource.username.should == "domain\\user"
68
+ end
62
69
  end
63
70
 
64
71
  %w{username comment home shell password}.each do |attrib|
@@ -7,9 +7,9 @@
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
9
9
  # You may obtain a copy of the License at
10
- #
10
+ #
11
11
  # http://www.apache.org/licenses/LICENSE-2.0
12
- #
12
+ #
13
13
  # Unless required by applicable law or agreed to in writing, software
14
14
  # distributed under the License is distributed on an "AS IS" BASIS,
15
15
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,49 +20,49 @@
20
20
  require 'spec_helper'
21
21
 
22
22
  describe Chef::ResourceCollection do
23
-
23
+
24
24
  before(:each) do
25
25
  @rc = Chef::ResourceCollection.new()
26
26
  @resource = Chef::Resource::ZenMaster.new("makoto")
27
27
  end
28
-
28
+
29
29
  describe "initialize" do
30
30
  it "should return a Chef::ResourceCollection" do
31
31
  @rc.should be_kind_of(Chef::ResourceCollection)
32
32
  end
33
33
  end
34
-
34
+
35
35
  describe "[]" do
36
36
  it "should accept Chef::Resources through [index]" do
37
37
  lambda { @rc[0] = @resource }.should_not raise_error
38
38
  lambda { @rc[0] = "string" }.should raise_error
39
39
  end
40
-
40
+
41
41
  it "should allow you to fetch Chef::Resources by position" do
42
42
  @rc[0] = @resource
43
43
  @rc[0].should eql(@resource)
44
44
  end
45
45
  end
46
-
46
+
47
47
  describe "push" do
48
48
  it "should accept Chef::Resources through pushing" do
49
49
  lambda { @rc.push(@resource) }.should_not raise_error
50
50
  lambda { @rc.push("string") }.should raise_error
51
51
  end
52
52
  end
53
-
53
+
54
54
  describe "<<" do
55
55
  it "should accept the << operator" do
56
56
  lambda { @rc << @resource }.should_not raise_error
57
57
  end
58
58
  end
59
-
60
- describe "insert" do
59
+
60
+ describe "insert" do
61
61
  it "should accept only Chef::Resources" do
62
62
  lambda { @rc.insert(@resource) }.should_not raise_error
63
63
  lambda { @rc.insert("string") }.should raise_error
64
64
  end
65
-
65
+
66
66
  it "should append resources to the end of the collection when not executing a run" do
67
67
  zmr = Chef::Resource::ZenMaster.new("there is no spoon")
68
68
  @rc.insert(@resource)
@@ -70,18 +70,18 @@ describe Chef::ResourceCollection do
70
70
  @rc[0].should eql(@resource)
71
71
  @rc[1].should eql(zmr)
72
72
  end
73
-
73
+
74
74
  it "should insert resources to the middle of the collection if called while executing a run" do
75
75
  resource_to_inject = Chef::Resource::ZenMaster.new("there is no spoon")
76
76
  zmr = Chef::Resource::ZenMaster.new("morpheus")
77
77
  dummy = Chef::Resource::ZenMaster.new("keanu reeves")
78
78
  @rc.insert(zmr)
79
79
  @rc.insert(dummy)
80
-
80
+
81
81
  @rc.execute_each_resource do |resource|
82
82
  @rc.insert(resource_to_inject) if resource == zmr
83
83
  end
84
-
84
+
85
85
  @rc[0].should eql(zmr)
86
86
  @rc[1].should eql(resource_to_inject)
87
87
  @rc[2].should eql(dummy)
@@ -92,7 +92,7 @@ describe Chef::ResourceCollection do
92
92
  it "should allow you to iterate over every resource in the collection" do
93
93
  load_up_resources
94
94
  results = Array.new
95
- lambda {
95
+ lambda {
96
96
  @rc.each do |r|
97
97
  results << r.name
98
98
  end
@@ -109,15 +109,15 @@ describe Chef::ResourceCollection do
109
109
  end
110
110
  end
111
111
  end
112
-
112
+
113
113
  describe "each_index" do
114
114
  it "should allow you to iterate over every resource by index" do
115
115
  load_up_resources
116
116
  results = Array.new
117
- lambda {
117
+ lambda {
118
118
  @rc.each_index do |i|
119
119
  results << @rc[i].name
120
- end
120
+ end
121
121
  }.should_not raise_error()
122
122
  results.each_index do |i|
123
123
  case i
@@ -131,7 +131,7 @@ describe Chef::ResourceCollection do
131
131
  end
132
132
  end
133
133
  end
134
-
134
+
135
135
  describe "lookup" do
136
136
  it "should allow you to find resources by name via lookup" do
137
137
  zmr = Chef::Resource::ZenMaster.new("dog")
@@ -141,21 +141,21 @@ describe Chef::ResourceCollection do
141
141
  zmr = Chef::Resource::ZenMaster.new("cat")
142
142
  @rc[0] = zmr
143
143
  @rc.lookup(zmr).should eql(zmr)
144
-
144
+
145
145
  zmr = Chef::Resource::ZenMaster.new("monkey")
146
146
  @rc.push(zmr)
147
147
  @rc.lookup(zmr).should eql(zmr)
148
148
  end
149
-
149
+
150
150
  it "should raise an exception if you send something strange to lookup" do
151
151
  lambda { @rc.lookup(:symbol) }.should raise_error(ArgumentError)
152
152
  end
153
-
153
+
154
154
  it "should raise an exception if it cannot find a resource with lookup" do
155
155
  lambda { @rc.lookup("zen_master[dog]") }.should raise_error(Chef::Exceptions::ResourceNotFound)
156
156
  end
157
157
  end
158
-
158
+
159
159
  describe "resources" do
160
160
 
161
161
  it "should find a resource by symbol and name (:zen_master => monkey)" do
@@ -195,11 +195,11 @@ describe Chef::ResourceCollection do
195
195
  results.length.should eql(2)
196
196
  check_by_names(results, "monkey", "something")
197
197
  end
198
-
198
+
199
199
  it "should raise an exception if you pass a bad name to resources" do
200
- lambda { @rc.resources("michael jackson") }.should raise_error(ArgumentError)
200
+ lambda { @rc.resources("michael jackson") }.should raise_error(ArgumentError)
201
201
  end
202
-
202
+
203
203
  it "should raise an exception if you pass something other than a string or hash to resource" do
204
204
  lambda { @rc.resources([Array.new]) }.should raise_error(ArgumentError)
205
205
  end
@@ -209,7 +209,36 @@ describe Chef::ResourceCollection do
209
209
  end
210
210
 
211
211
  end
212
-
212
+
213
+ describe "when validating a resource query object" do
214
+ it "accepts a string of the form 'resource_type[resource_name]'" do
215
+ @rc.validate_lookup_spec!("resource_type[resource_name]").should be_true
216
+ end
217
+
218
+ it "accepts a single-element :resource_type => 'resource_name' Hash" do
219
+ @rc.validate_lookup_spec!(:service => "apache2").should be_true
220
+ end
221
+
222
+
223
+ it "accepts a chef resource object" do
224
+ res = Chef::Resource.new("foo", nil)
225
+ @rc.validate_lookup_spec!(res).should be_true
226
+ end
227
+
228
+ it "rejects a malformed query string" do
229
+ lambda do
230
+ @rc.validate_lookup_spec!("resource_type[missing-end-bracket")
231
+ end.should raise_error(Chef::Exceptions::InvalidResourceSpecification)
232
+ end
233
+
234
+ it "rejects an argument that is not a String, Hash, or Chef::Resource" do
235
+ lambda do
236
+ @rc.validate_lookup_spec!(Object.new)
237
+ end.should raise_error(Chef::Exceptions::InvalidResourceSpecification)
238
+ end
239
+
240
+ end
241
+
213
242
  describe "to_json" do
214
243
  it "should serialize to json" do
215
244
  json = @rc.to_json
@@ -217,7 +246,7 @@ describe Chef::ResourceCollection do
217
246
  json.should =~ /instance_vars/
218
247
  end
219
248
  end
220
-
249
+
221
250
  describe "self.from_json" do
222
251
  it "should deserialize itself from json" do
223
252
  @rc << @resource
@@ -227,13 +256,13 @@ describe Chef::ResourceCollection do
227
256
  s_rc[0].name.should eql(@resource.name)
228
257
  end
229
258
  end
230
-
259
+
231
260
  describe "provides access to the raw resources array" do
232
261
  it "returns the resources via the all_resources method" do
233
262
  @rc.all_resources.should equal(@rc.instance_variable_get(:@resources))
234
263
  end
235
264
  end
236
-
265
+
237
266
  describe "provides access to stepable iterator" do
238
267
  it "returns the iterator object" do
239
268
  @rc.instance_variable_set(:@iterator, :fooboar)
@@ -246,12 +275,12 @@ describe Chef::ResourceCollection do
246
275
  results.detect{ |res| res.name == res_name }.should_not eql(nil)
247
276
  end
248
277
  end
249
-
278
+
250
279
  def load_up_resources
251
280
  %w{dog cat monkey}.each do |n|
252
281
  @rc << Chef::Resource::ZenMaster.new(n)
253
282
  end
254
283
  @rc << Chef::Resource::File.new("something")
255
284
  end
256
-
285
+
257
286
  end
@@ -38,11 +38,18 @@ describe Chef::ResourceReporter do
38
38
  @rest_client = mock("Chef::REST (mock)")
39
39
  @rest_client.stub!(:post_rest).and_return(true)
40
40
  @resource_reporter = Chef::ResourceReporter.new(@rest_client)
41
+ @run_id = @resource_reporter.run_id
41
42
  @new_resource = Chef::Resource::File.new("/tmp/a-file.txt")
42
43
  @new_resource.cookbook_name = "monkey"
43
44
  @cookbook_version = mock("Cookbook::Version", :version => "1.2.3")
44
45
  @new_resource.stub!(:cookbook_version).and_return(@cookbook_version)
45
46
  @current_resource = Chef::Resource::File.new("/tmp/a-file.txt")
47
+ @start_time = Time.new
48
+ @end_time = Time.new + 20
49
+ @events = Chef::EventDispatch::Dispatcher.new
50
+ @run_context = Chef::RunContext.new(@node, {}, @events)
51
+ @run_status = Chef::RunStatus.new(@node, @events)
52
+ Time.stub!(:now).and_return(@start_time, @end_time)
46
53
  end
47
54
 
48
55
  context "when first created" do
@@ -80,23 +87,23 @@ describe Chef::ResourceReporter do
80
87
 
81
88
  context "when chef fails" do
82
89
  before do
83
- @rest_client.stub!(:create_url).and_return("reports/nodes/spitfire/runs/ABC123");
90
+ @rest_client.stub!(:create_url).and_return("reports/nodes/spitfire/runs/#{@run_id}");
84
91
  @rest_client.stub!(:raw_http_request).and_return({"result"=>"ok"});
85
- @rest_client.stub!(:post_rest).and_return({"uri"=>"https://example.com/reports/nodes/spitfire/runs/ABC123"});
92
+ @rest_client.stub!(:post_rest).and_return({"uri"=>"https://example.com/reports/nodes/spitfire/runs/#{@run_id}"});
86
93
 
87
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
88
94
  end
89
95
 
90
96
  context "before converging any resources" do
91
97
  before do
98
+ @resource_reporter.run_started(@run_status)
92
99
  @exception = Exception.new
93
100
  @resource_reporter.run_failed(@exception)
94
101
  end
95
-
102
+
96
103
  it "sets the run status to 'failure'" do
97
104
  @resource_reporter.status.should == "failure"
98
105
  end
99
-
106
+
100
107
  it "keeps the exception data" do
101
108
  @resource_reporter.exception.should == @exception
102
109
  end
@@ -117,13 +124,13 @@ describe Chef::ResourceReporter do
117
124
 
118
125
  it "collects the desired state of the resource" do
119
126
  update_record = @resource_reporter.updated_resources.first
120
- update_record.new_resource.should == @new_resource
127
+ update_record.new_resource.should == @new_resource
121
128
  end
122
129
  end
123
130
 
124
131
  # TODO: make sure a resource that is skipped because of `not_if` doesn't
125
132
  # leave us in a bad state.
126
-
133
+
127
134
  context "once the a resource's current state is loaded" do
128
135
  before do
129
136
  @resource_reporter.resource_action_start(@new_resource, :create)
@@ -151,12 +158,12 @@ describe Chef::ResourceReporter do
151
158
  it "collects the updated resource" do
152
159
  @resource_reporter.should have(1).updated_resources
153
160
  end
154
-
161
+
155
162
  it "collects the old state of the resource" do
156
- update_record = @resource_reporter.updated_resources.first
163
+ update_record = @resource_reporter.updated_resources.first
157
164
  update_record.current_resource.should == @current_resource
158
165
  end
159
-
166
+
160
167
  it "collects the new state of the resource" do
161
168
  update_record = @resource_reporter.updated_resources.first
162
169
  update_record.new_resource.should == @new_resource
@@ -170,19 +177,19 @@ describe Chef::ResourceReporter do
170
177
  @resource_reporter.resource_failed(@next_new_resource, :create, @exception)
171
178
  @resource_reporter.resource_completed(@next_new_resource)
172
179
  end
173
-
180
+
174
181
  it "collects the desired state of the failed resource" do
175
182
  failed_resource_update = @resource_reporter.updated_resources.last
176
183
  failed_resource_update.new_resource.should == @next_new_resource
177
184
  end
178
-
185
+
179
186
  it "does not have the current state of the failed resource" do
180
187
  failed_resource_update = @resource_reporter.updated_resources.last
181
188
  failed_resource_update.current_resource.should be_nil
182
189
  end
183
190
  end
184
191
  end
185
-
192
+
186
193
  # Some providers, such as RemoteDirectory and some LWRPs use other
187
194
  # resources for their implementation. These should be hidden from reporting
188
195
  # since we only care about the top-level resource and not the sub-resources
@@ -213,7 +220,7 @@ describe Chef::ResourceReporter do
213
220
  @resource_reporter.resource_updated(@new_resource, :create)
214
221
  @resource_reporter.resource_completed(@new_resource)
215
222
  end
216
-
223
+
217
224
  it "does not collect data about the nested resource" do
218
225
  @resource_reporter.should have(1).updated_resources
219
226
  end
@@ -226,16 +233,16 @@ describe Chef::ResourceReporter do
226
233
  @resource_reporter.resource_failed(@new_resource, :create, @exception)
227
234
  @resource_reporter.resource_completed(@new_resource)
228
235
  end
229
-
236
+
230
237
  it "collects the resource as an updated resource" do
231
238
  @resource_reporter.should have(1).updated_resources
232
239
  end
233
-
240
+
234
241
  it "collects the desired state of the resource" do
235
242
  update_record = @resource_reporter.updated_resources.first
236
243
  update_record.new_resource.should == @new_resource
237
244
  end
238
-
245
+
239
246
  it "collects the current state of the resource" do
240
247
  update_record = @resource_reporter.updated_resources.first
241
248
  update_record.current_resource.should == @current_resource
@@ -248,13 +255,13 @@ describe Chef::ResourceReporter do
248
255
  describe "when generating a report for the server" do
249
256
 
250
257
  before do
251
- @rest_client.stub!(:create_url).and_return("reports/nodes/spitfire/runs/ABC123");
258
+ @rest_client.stub!(:create_url).and_return("reports/nodes/spitfire/runs/#{@run_id}");
252
259
  @rest_client.stub!(:raw_http_request).and_return({"result"=>"ok"});
253
- @rest_client.stub!(:post_rest).and_return({"uri"=>"https://example.com/reports/nodes/spitfire/runs/ABC123"});
254
-
255
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
260
+ @rest_client.stub!(:post_rest).and_return({"uri"=>"https://example.com/reports/nodes/spitfire/runs/#{@run_id}"});
261
+
262
+ @resource_reporter.run_started(@run_status)
256
263
  end
257
-
264
+
258
265
  context "for a successful client run" do
259
266
  before do
260
267
  # TODO: add inputs to generate expected output.
@@ -291,6 +298,7 @@ describe Chef::ResourceReporter do
291
298
  @resource_reporter.resource_current_state_loaded(@new_resource, :create, @current_resource)
292
299
  @resource_reporter.resource_updated(@new_resource, :create)
293
300
  @resource_reporter.resource_completed(@new_resource)
301
+ @run_status.stop_clock
294
302
  @report = @resource_reporter.prepare_run_data
295
303
  @first_update_report = @report["resources"].first
296
304
  end
@@ -357,8 +365,14 @@ describe Chef::ResourceReporter do
357
365
 
358
366
  it "includes the run_list" do
359
367
  @report.should have_key("run_list")
360
- @report["run_list"].should == @node.run_list.to_json
368
+ @report["run_list"].should == @run_status.node.run_list.to_json
361
369
  end
370
+
371
+ it "includes the end_time" do
372
+ @report.should have_key("end_time")
373
+ @report["end_time"].should == @run_status.end_time.to_s
374
+ end
375
+
362
376
  end
363
377
 
364
378
  context "for an unsuccessful run" do
@@ -394,15 +408,68 @@ describe Chef::ResourceReporter do
394
408
 
395
409
  it "includes the error inspector output in the event data" do
396
410
  @report["data"]["exception"].should have_key("description")
397
- @report["data"]["exception"]["description"].should include({"title"=>"Error expanding the run_list:", "sections"=>[["Unexpected Error:", "RSpec::Mocks::Mock: Object not found"]]})
411
+ @report["data"]["exception"]["description"].should include({"title"=>"Error expanding the run_list:", "sections"=>[{"Unexpected Error:" => "RSpec::Mocks::Mock: Object not found"}]})
398
412
  end
399
413
 
400
414
  end
401
415
 
416
+ context "when new_resource does not have a cookbook_name" do
417
+ before do
418
+ @bad_resource = Chef::Resource::File.new("/tmp/a-file.txt")
419
+ @bad_resource.cookbook_name = nil
420
+
421
+ @resource_reporter.resource_action_start(@bad_resource, :create)
422
+ @resource_reporter.resource_current_state_loaded(@bad_resource, :create, @current_resource)
423
+ @resource_reporter.resource_updated(@bad_resource, :create)
424
+ @resource_reporter.resource_completed(@bad_resource)
425
+ @run_status.stop_clock
426
+ @report = @resource_reporter.prepare_run_data
427
+ @first_update_report = @report["resources"].first
428
+ end
429
+
430
+ it "includes an updated resource's initial state" do
431
+ @first_update_report["before"].should == @current_resource.state
432
+ end
433
+
434
+ it "includes an updated resource's final state" do
435
+ @first_update_report["after"].should == @new_resource.state
436
+ end
437
+
438
+ it "includes the resource's name" do
439
+ @first_update_report["name"].should == @new_resource.name
440
+ end
441
+
442
+ it "includes the resource's id attribute" do
443
+ @first_update_report["id"].should == @new_resource.identity
444
+ end
445
+
446
+ it "includes the elapsed time for the resource to converge" do
447
+ # TODO: API takes integer number of milliseconds as a string. This
448
+ # should be an int.
449
+ @first_update_report.should have_key("duration")
450
+ @first_update_report["duration"].to_i.should be_within(100).of(0)
451
+ end
452
+
453
+ it "includes the action executed by the resource" do
454
+ # TODO: rename as "action"
455
+ @first_update_report["result"].should == "create"
456
+ end
457
+
458
+ it "does not include a cookbook name for the resource" do
459
+ @first_update_report.should_not have_key("cookbook_name")
460
+ end
461
+
462
+ it "does not include a cookbook version for the resource" do
463
+ @first_update_report.should_not have_key("cookbook_version")
464
+ end
465
+ end
466
+
402
467
  end
403
468
 
404
469
  describe "when updating resource history on the server" do
405
470
  before do
471
+ @resource_reporter.run_started(@run_status)
472
+ @run_status.start_clock
406
473
  end
407
474
 
408
475
  context "when the server does not support storing resource history" do
@@ -411,24 +478,26 @@ describe Chef::ResourceReporter do
411
478
  @response = Net::HTTPNotFound.new("a response body", "404", "Not Found")
412
479
  @error = Net::HTTPServerException.new("404 message", @response)
413
480
  @rest_client.should_receive(:post_rest).
414
- with("reports/nodes/spitfire/runs", {:action => :begin}).
481
+ with("reports/nodes/spitfire/runs", {:action => :start, :run_id => @run_id,
482
+ :start_time => @start_time.to_s},
483
+ {'X-Ops-Reporting-Protocol-Version' => Chef::ResourceReporter::PROTOCOL_VERSION}).
415
484
  and_raise(@error)
416
485
  end
417
486
 
418
487
  it "assumes the feature is not enabled" do
419
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
488
+ @resource_reporter.run_started(@run_status)
420
489
  @resource_reporter.reporting_enabled?.should be_false
421
490
  end
422
491
 
423
492
  it "does not send a resource report to the server" do
424
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
493
+ @resource_reporter.run_started(@run_status)
425
494
  @rest_client.should_not_receive(:post_rest)
426
495
  @resource_reporter.run_completed(@node)
427
496
  end
428
497
 
429
498
  it "prints an error about the 404" do
430
499
  Chef::Log.should_receive(:debug).with(/404/)
431
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
500
+ @resource_reporter.run_started(@run_status)
432
501
  end
433
502
 
434
503
  end
@@ -439,24 +508,25 @@ describe Chef::ResourceReporter do
439
508
  @response = Net::HTTPInternalServerError.new("a response body", "500", "Internal Server Error")
440
509
  @error = Net::HTTPServerException.new("500 message", @response)
441
510
  @rest_client.should_receive(:post_rest).
442
- with("reports/nodes/spitfire/runs", {:action => :begin}).
511
+ with("reports/nodes/spitfire/runs", {:action => :start, :run_id => @run_id, :start_time => @start_time.to_s},
512
+ {'X-Ops-Reporting-Protocol-Version' => Chef::ResourceReporter::PROTOCOL_VERSION}).
443
513
  and_raise(@error)
444
514
  end
445
515
 
446
516
  it "assumes the feature is not enabled" do
447
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
517
+ @resource_reporter.run_started(@run_status)
448
518
  @resource_reporter.reporting_enabled?.should be_false
449
519
  end
450
520
 
451
521
  it "does not send a resource report to the server" do
452
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
522
+ @resource_reporter.run_started(@run_status)
453
523
  @rest_client.should_not_receive(:post_rest)
454
524
  @resource_reporter.run_completed(@node)
455
525
  end
456
526
 
457
527
  it "prints an error about the error" do
458
528
  Chef::Log.should_receive(:info).with(/500/)
459
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
529
+ @resource_reporter.run_started(@run_status)
460
530
  end
461
531
  end
462
532
 
@@ -468,7 +538,8 @@ describe Chef::ResourceReporter do
468
538
  @response = Net::HTTPInternalServerError.new("a response body", "500", "Internal Server Error")
469
539
  @error = Net::HTTPServerException.new("500 message", @response)
470
540
  @rest_client.should_receive(:post_rest).
471
- with("reports/nodes/spitfire/runs", {:action => :begin}).
541
+ with("reports/nodes/spitfire/runs", {:action => :start, :run_id => @run_id, :start_time => @start_time.to_s},
542
+ {'X-Ops-Reporting-Protocol-Version' => Chef::ResourceReporter::PROTOCOL_VERSION}).
472
543
  and_raise(@error)
473
544
  end
474
545
 
@@ -479,23 +550,23 @@ describe Chef::ResourceReporter do
479
550
  it "fails the run and prints an message about the error" do
480
551
  Chef::Log.should_receive(:error).with(/500/)
481
552
  lambda {
482
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
553
+ @resource_reporter.run_started(@run_status)
483
554
  }.should raise_error(Net::HTTPServerException)
484
555
  end
485
556
  end
486
557
 
487
558
  context "after creating the run history document" do
488
559
  before do
489
- response = {"uri"=>"https://example.com/reports/nodes/spitfire/runs/ABC123"}
560
+ response = {"uri"=>"https://example.com/reports/nodes/spitfire/runs/@run_id"}
490
561
  @rest_client.should_receive(:post_rest).
491
- with("reports/nodes/spitfire/runs", {:action => :begin}).
562
+ with("reports/nodes/spitfire/runs", {:action => :start, :run_id => @run_id, :start_time => @start_time.to_s},
563
+ {'X-Ops-Reporting-Protocol-Version' => Chef::ResourceReporter::PROTOCOL_VERSION}).
492
564
  and_return(response)
493
-
494
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
565
+ @resource_reporter.run_started(@run_status)
495
566
  end
496
567
 
497
568
  it "creates a run document on the server at the start of the run" do
498
- @resource_reporter.run_id.should == "ABC123"
569
+ @resource_reporter.run_id.should == @run_id
499
570
  end
500
571
 
501
572
  it "updates the run document with resource updates at the end of the run" do
@@ -504,19 +575,22 @@ describe Chef::ResourceReporter do
504
575
  @resource_reporter.resource_current_state_loaded(@new_resource, :create, @current_resource)
505
576
  @resource_reporter.resource_updated(@new_resource, :create)
506
577
 
578
+ @resource_reporter.stub!(:end_time).and_return(@end_time)
507
579
  @expected_data = @resource_reporter.prepare_run_data
508
580
 
509
581
  post_url = "https://chef_server/example_url"
510
582
  response = {"result"=>"ok"}
511
583
 
512
584
  @rest_client.should_receive(:create_url).
513
- with("reports/nodes/spitfire/runs/ABC123").
585
+ with("reports/nodes/spitfire/runs/#{@run_id}").
514
586
  ordered.
515
587
  and_return(post_url)
516
588
  @rest_client.should_receive(:raw_http_request).ordered do |method, url, headers, data|
517
589
  method.should eq(:POST)
518
590
  url.should eq(post_url)
519
- headers.should eq({'Content-Encoding' => 'gzip'})
591
+ headers.should eq({'Content-Encoding' => 'gzip',
592
+ 'X-Ops-Reporting-Protocol-Version' => Chef::ResourceReporter::PROTOCOL_VERSION
593
+ })
520
594
  data_stream = Zlib::GzipReader.new(StringIO.new(data))
521
595
  data = data_stream.read
522
596
  data.should eq(@expected_data.to_json)
@@ -526,66 +600,5 @@ describe Chef::ResourceReporter do
526
600
  @resource_reporter.run_completed(@node)
527
601
  end
528
602
  end
529
-
530
- context "after creating the run history document when summary_only is set to true" do
531
- before do
532
- response = {"uri"=>"https://example.com/reports/nodes/spitfire/runs/ABC123", "summary_only"=>"true"}
533
- @rest_client.should_receive(:post_rest).
534
- with("reports/nodes/spitfire/runs", {:action => :begin}).
535
- and_return(response)
536
-
537
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
538
- end
539
-
540
- it "enables summary only reporting" do
541
- @resource_reporter.summary_only.should == "true"
542
- end
543
-
544
- it "updates the run document with resource updates at the end of the run" do
545
- # update some resources...
546
- @resource_reporter.resource_action_start(@new_resource, :create)
547
- @resource_reporter.resource_current_state_loaded(@new_resource, :create, @current_resource)
548
- @resource_reporter.resource_updated(@new_resource, :create)
549
-
550
- post_url = "reports/nodes/spitfire/runs/ABC123"
551
- response = {"result"=>"ok"}
552
-
553
- @rest_client.should_receive(:post_rest).ordered do |url, data|
554
- url.should eq(post_url)
555
- data.should have_key("action")
556
- data["action"].should == "end"
557
- data.should have_key("status")
558
- data.should have_key("resources")
559
- data["resources"].should == []
560
- data.should have_key("total_res_count")
561
- data["total_res_count"].should == "1"
562
- data.should have_key("data")
563
- data["data"].should == {}
564
- data.should have_key("updated_res_count")
565
- data["updated_res_count"].should == "0"
566
- data.should have_key("post_size")
567
- response
568
- end
569
-
570
- @resource_reporter.run_completed(@node)
571
- end
572
- end
573
-
574
- context "after creating the run history document when summary_only is set to false" do
575
- before do
576
- response = {"uri"=>"https://example.com/reports/nodes/spitfire/runs/ABC123", "summary_only"=>"false"}
577
- @rest_client.should_receive(:post_rest).
578
- with("reports/nodes/spitfire/runs", {:action => :begin}).
579
- and_return(response)
580
-
581
- @resource_reporter.node_load_completed(@node, :expanded_run_list, :config)
582
- end
583
-
584
- it "disables summary_only reporting" do
585
- @resource_reporter.summary_only.should == "false"
586
- end
587
- end
588
-
589
603
  end
590
-
591
604
  end