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
@@ -32,7 +32,11 @@ class Chef
32
32
  super
33
33
  @resource_name = :remote_file
34
34
  @action = "create"
35
- @source = nil
35
+ @source = []
36
+ @use_etag = true
37
+ @use_last_modified = true
38
+ @ftp_active_mode = false
39
+ @headers = {}
36
40
  @provider = Chef::Provider::RemoteFile
37
41
  end
38
42
 
@@ -54,6 +58,48 @@ class Chef
54
58
  )
55
59
  end
56
60
 
61
+ # Disable or enable ETag and Last Modified conditional GET. Equivalent to
62
+ # use_etag(true_or_false)
63
+ # use_last_modified(true_or_false)
64
+ def use_conditional_get(true_or_false)
65
+ use_etag(true_or_false)
66
+ use_last_modified(true_or_false)
67
+ end
68
+
69
+ def use_etag(args=nil)
70
+ set_or_return(
71
+ :use_etag,
72
+ args,
73
+ :kind_of => [ TrueClass, FalseClass ]
74
+ )
75
+ end
76
+
77
+ alias :use_etags :use_etag
78
+
79
+ def use_last_modified(args=nil)
80
+ set_or_return(
81
+ :use_last_modified,
82
+ args,
83
+ :kind_of => [ TrueClass, FalseClass ]
84
+ )
85
+ end
86
+
87
+ def ftp_active_mode(args=nil)
88
+ set_or_return(
89
+ :ftp_active_mode,
90
+ args,
91
+ :kind_of => [ TrueClass, FalseClass ]
92
+ )
93
+ end
94
+
95
+ def headers(args=nil)
96
+ set_or_return(
97
+ :headers,
98
+ args,
99
+ :kind_of => Hash
100
+ )
101
+ end
102
+
57
103
  def after_created
58
104
  validate_source(@source)
59
105
  end
@@ -31,7 +31,7 @@ class Chef
31
31
  super
32
32
  @resource_name = :route
33
33
  @target = name
34
- @action = :add
34
+ @action = [:add]
35
35
  @allowed_actions.push(:add, :delete)
36
36
  @netmask = nil
37
37
  @gateway = nil
@@ -29,6 +29,9 @@ class Chef
29
29
 
30
30
  provides :template, :on_platforms => :all
31
31
 
32
+ attr_reader :inline_helper_blocks
33
+ attr_reader :inline_helper_modules
34
+
32
35
  def initialize(name, run_context=nil)
33
36
  super
34
37
  @resource_name = :template
@@ -38,6 +41,9 @@ class Chef
38
41
  @local = false
39
42
  @variables = Hash.new
40
43
  @provider = Chef::Provider::Template
44
+ @inline_helper_blocks = {}
45
+ @inline_helper_modules = []
46
+ @helper_modules = []
41
47
  end
42
48
 
43
49
  def source(file=nil)
@@ -71,6 +77,145 @@ class Chef
71
77
  :kind_of => [ TrueClass, FalseClass ]
72
78
  )
73
79
  end
80
+
81
+ # Declares a helper method to be defined in the template context when
82
+ # rendering.
83
+ #
84
+ # === Example:
85
+ #
86
+ # ==== Basic usage:
87
+ # Given the following helper:
88
+ # helper(:static_value) { "hello from helper" }
89
+ # A template with the following code:
90
+ # <%= static_value %>
91
+ # Will render as;
92
+ # hello from helper
93
+ #
94
+ # ==== Referencing Instance Variables:
95
+ # Any instance variables available to the template can be referenced in
96
+ # the method body. For example, you can simplify accessing app-specific
97
+ # node attributes like this:
98
+ # helper(:app) { @node[:my_app_attributes] }
99
+ # And use it in a template like this:
100
+ # <%= app[:listen_ports] %>
101
+ # This is equivalent to the non-helper template code:
102
+ # <%= @node[:my_app_attributes][:listen_ports] %>
103
+ #
104
+ # ==== Method Arguments:
105
+ # Helper methods can also take arguments. The syntax available for
106
+ # argument specification will be dependent on ruby version. Ruby 1.8 only
107
+ # supports a subset of the argument specification syntax available for
108
+ # method definition, whereas 1.9 supports the full syntax.
109
+ #
110
+ # Continuing the above example of simplifying attribute access, we can
111
+ # define a helper to look up app-specific attributes like this:
112
+ # helper(:app) { |setting| @node[:my_app_attributes][setting] }
113
+ # The template can then look up attributes like this:
114
+ # <%= app(:listen_ports) %>
115
+ def helper(method_name, &block)
116
+ unless block_given?
117
+ raise Exceptions::ValidationFailed,
118
+ "`helper(:method)` requires a block argument (e.g., `helper(:method) { code }`)"
119
+ end
120
+
121
+ unless method_name.kind_of?(Symbol)
122
+ raise Exceptions::ValidationFailed,
123
+ "method_name argument to `helper(method_name)` must be a symbol (e.g., `helper(:method) { code }`)"
124
+ end
125
+
126
+ @inline_helper_blocks[method_name] = block
127
+ end
128
+
129
+ # Declares a module to define helper methods in the template's context
130
+ # when rendering. There are two primary forms.
131
+ #
132
+ # === Inline Module Definition
133
+ # When a block is given, the block is used to define a module which is
134
+ # then mixed in to the template context w/ `extend`.
135
+ #
136
+ # ==== Inline Module Example
137
+ # Given the following code in the template resource:
138
+ # helpers do
139
+ # # Add "syntax sugar" for referencing app-specific attributes
140
+ # def app(attribute)
141
+ # @node[:my_app_attributes][attribute]
142
+ # end
143
+ # end
144
+ # You can use it in the template like so:
145
+ # <%= app(:listen_ports) %>
146
+ # Which is equivalent to:
147
+ # <%= @node[:my_app_attributes][:listen_ports] %>
148
+ #
149
+ # === External Module Form
150
+ # When a module name is given, the template context will be extended with
151
+ # that module. This is the recommended way to customize template contexts
152
+ # when you need to define more than an handful of helper functions (but
153
+ # also try to keep your template helpers from getting out of hand--if you
154
+ # have very complex logic in your template helpers, you should further
155
+ # extract your code into separate libraries).
156
+ #
157
+ # ==== External Module Example
158
+ # To extract the above inline module code to a library, you'd create a
159
+ # library file like this:
160
+ # module MyTemplateHelper
161
+ # # Add "syntax sugar" for referencing app-specific attributes
162
+ # def app(attribute)
163
+ # @node[:my_app_attributes][attribute]
164
+ # end
165
+ # end
166
+ # And in the template resource:
167
+ # helpers(MyTemplateHelper)
168
+ # The template code in the above example will work unmodified.
169
+ def helpers(module_name=nil,&block)
170
+ if block_given? and !module_name.nil?
171
+ raise Exceptions::ValidationFailed,
172
+ "Passing both a module and block to #helpers is not supported. Call #helpers multiple times instead"
173
+ elsif block_given?
174
+ @inline_helper_modules << block
175
+ elsif module_name.kind_of?(::Module)
176
+ @helper_modules << module_name
177
+ elsif module_name.nil?
178
+ raise Exceptions::ValidationFailed,
179
+ "#helpers requires either a module name or inline module code as a block.\n" +
180
+ "e.g.: helpers do; helper_code; end;\n" +
181
+ "OR: helpers(MyHelpersModule)"
182
+ else
183
+ raise Exceptions::ValidationFailed,
184
+ "Argument to #helpers must be a module. You gave #{module_name.inspect} (#{module_name.class})"
185
+ end
186
+ end
187
+
188
+ # Compiles all helpers from inline method definitions, inline module
189
+ # definitions, and external modules into an Array of Modules. The context
190
+ # object for the template is extended with these modules to provide
191
+ # per-resource template logic.
192
+ def helper_modules
193
+ compiled_helper_methods + compiled_helper_modules + @helper_modules
194
+ end
195
+
196
+ private
197
+
198
+ # compiles helper methods into a module that can be included in template context
199
+ def compiled_helper_methods
200
+ if inline_helper_blocks.empty?
201
+ []
202
+ else
203
+ resource_helper_blocks = inline_helper_blocks
204
+ helper_mod = Module.new do
205
+ resource_helper_blocks.each do |method_name, method_body|
206
+ define_method(method_name, &method_body)
207
+ end
208
+ end
209
+ [ helper_mod ]
210
+ end
211
+ end
212
+
213
+ def compiled_helper_modules
214
+ @inline_helper_modules.map do |module_body|
215
+ Module.new(&module_body)
216
+ end
217
+ end
218
+
74
219
  end
75
220
  end
76
221
  end
@@ -0,0 +1,62 @@
1
+ #
2
+ # Author:: Adam Edwards (<adamed@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 'chef/resource/script'
20
+ require 'chef/mixin/windows_architecture_helper'
21
+
22
+ class Chef
23
+ class Resource
24
+ class WindowsScript < Chef::Resource::Script
25
+
26
+ protected
27
+
28
+ def initialize(name, run_context, resource_name, interpreter_command)
29
+ super(name, run_context)
30
+ @interpreter = interpreter_command
31
+ @resource_name = resource_name
32
+ end
33
+
34
+ include Chef::Mixin::WindowsArchitectureHelper
35
+
36
+ public
37
+
38
+ def architecture(arg=nil)
39
+ assert_architecture_compatible!(arg) if ! arg.nil?
40
+ result = set_or_return(
41
+ :architecture,
42
+ arg,
43
+ :kind_of => Symbol
44
+ )
45
+ end
46
+
47
+ protected
48
+
49
+ def assert_architecture_compatible!(desired_architecture)
50
+ if ! node_supports_windows_architecture?(node, desired_architecture)
51
+ raise Chef::Exceptions::Win32ArchitectureIncorrect,
52
+ "cannot execute script with requested architecture '#{desired_architecture.to_s}' on a system with architecture '#{node_windows_architecture(node)}'"
53
+ end
54
+ end
55
+
56
+ def node
57
+ run_context && run_context.node
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -24,6 +24,14 @@ class Chef
24
24
  class ResourceCollection
25
25
  include Enumerable
26
26
 
27
+ # Matches a multiple resource lookup specification,
28
+ # e.g., "service[nginx,unicorn]"
29
+ MULTIPLE_RESOURCE_MATCH = /^(.+)\[(.+?),(.+)\]$/
30
+
31
+ # Matches a single resource lookup specification,
32
+ # e.g., "service[nginx]"
33
+ SINGLE_RESOURCE_MATCH = /^(.+)\[(.+)\]$/
34
+
27
35
  attr_reader :iterator
28
36
 
29
37
  def initialize
@@ -52,8 +60,12 @@ class Chef
52
60
  @resources << a
53
61
  @resources_by_name[a.to_s] = @resources.length - 1
54
62
  end
63
+ self
55
64
  end
56
65
 
66
+ # 'push' is an alias method to <<
67
+ alias_method :push, :<<
68
+
57
69
  def insert(resource)
58
70
  is_chef_resource(resource)
59
71
  if @insert_after_idx
@@ -73,14 +85,6 @@ class Chef
73
85
  end
74
86
  end
75
87
 
76
- def push(*args)
77
- args.flatten.each do |arg|
78
- is_chef_resource(arg)
79
- @resources.push(arg)
80
- @resources_by_name[arg.to_s] = @resources.length - 1
81
- end
82
- end
83
-
84
88
  def each
85
89
  @resources.each do |resource|
86
90
  yield resource
@@ -154,6 +158,36 @@ class Chef
154
158
  # compat.
155
159
  alias_method :resources, :find
156
160
 
161
+
162
+ # Returns true if +query_object+ is a valid string for looking up a
163
+ # resource, or raises InvalidResourceSpecification if not.
164
+ # === Arguments
165
+ # * query_object should be a string of the form
166
+ # "resource_type[resource_name]", a single element Hash (e.g., :service =>
167
+ # "apache2"), or a Chef::Resource (this is the happy path). Other arguments
168
+ # will raise an exception.
169
+ # === Returns
170
+ # * true returns true for all valid input.
171
+ # === Raises
172
+ # * Chef::Exceptions::InvalidResourceSpecification for all invalid input.
173
+ def validate_lookup_spec!(query_object)
174
+ case query_object
175
+ when Chef::Resource
176
+ true
177
+ when SINGLE_RESOURCE_MATCH, MULTIPLE_RESOURCE_MATCH
178
+ true
179
+ when Hash
180
+ true
181
+ when String
182
+ raise Chef::Exceptions::InvalidResourceSpecification,
183
+ "The string `#{query_object}' is not valid for resource collection lookup. Correct syntax is `resource_type[resource_name]'"
184
+ else
185
+ raise Chef::Exceptions::InvalidResourceSpecification,
186
+ "The object `#{query_object.inspect}' is not valid for resource collection lookup. " +
187
+ "Use a String like `resource_type[resource_name]' or a Chef::Resource object"
188
+ end
189
+ end
190
+
157
191
  # Serialize this object as a hash
158
192
  def to_json(*a)
159
193
  instance_vars = Hash.new
@@ -192,7 +226,7 @@ class Chef
192
226
  def find_resource_by_string(arg)
193
227
  results = Array.new
194
228
  case arg
195
- when /^(.+)\[(.+?),(.+)\]$/
229
+ when MULTIPLE_RESOURCE_MATCH
196
230
  resource_type = $1
197
231
  arg =~ /^.+\[(.+)\]$/
198
232
  resource_list = $1
@@ -200,13 +234,13 @@ class Chef
200
234
  resource_name = "#{resource_type}[#{name}]"
201
235
  results << lookup(resource_name)
202
236
  end
203
- when /^(.+)\[(.+)\]$/
237
+ when SINGLE_RESOURCE_MATCH
204
238
  resource_type = $1
205
239
  name = $2
206
240
  resource_name = "#{resource_type}[#{name}]"
207
241
  results << lookup(resource_name)
208
242
  else
209
- raise ArgumentError, "You must have a string like resource_type[name]!"
243
+ raise ArgumentError, "Bad string format #{arg}, you must have a string like resource_type[name]!"
210
244
  end
211
245
  return results
212
246
  end
@@ -20,13 +20,12 @@
20
20
  #
21
21
 
22
22
  require 'uri'
23
+ require 'chef/monkey_patches/securerandom'
23
24
  require 'chef/event_dispatch/base'
24
25
 
25
26
  class Chef
26
27
  class ResourceReporter < EventDispatch::Base
27
28
 
28
-
29
-
30
29
  class ResourceReport < Struct.new(:new_resource,
31
30
  :current_resource,
32
31
  :action,
@@ -65,10 +64,12 @@ class Chef
65
64
  else
66
65
  #as_hash["result"] = "failed"
67
66
  end
68
- as_hash["cookbook_name"] = new_resource.cookbook_name
69
- as_hash["cookbook_version"] = new_resource.cookbook_version.version
70
- as_hash
67
+ if new_resource.cookbook_name
68
+ as_hash["cookbook_name"] = new_resource.cookbook_name
69
+ as_hash["cookbook_version"] = new_resource.cookbook_version.version
70
+ end
71
71
 
72
+ as_hash
72
73
  end
73
74
 
74
75
  def finish
@@ -78,14 +79,16 @@ class Chef
78
79
  def success?
79
80
  !self.exception
80
81
  end
81
- end
82
+
83
+ end # End class ResouceReport
82
84
 
83
85
  attr_reader :updated_resources
84
86
  attr_reader :status
85
87
  attr_reader :exception
86
88
  attr_reader :run_id
87
89
  attr_reader :error_descriptions
88
- attr_reader :summary_only
90
+
91
+ PROTOCOL_VERSION = '0.1.0'
89
92
 
90
93
  def initialize(rest_client)
91
94
  if Chef::Config[:enable_reporting] && !Chef::Config[:why_run]
@@ -98,37 +101,55 @@ class Chef
98
101
  @pending_update = nil
99
102
  @status = "success"
100
103
  @exception = nil
101
- @run_id = nil
104
+ @run_id = SecureRandom.uuid
102
105
  @rest_client = rest_client
103
- @node = nil
104
106
  @error_descriptions = {}
105
- @summary_only = true
106
107
  end
107
108
 
108
- def node_load_completed(node, expanded_run_list_with_versions, config)
109
- @node = node
109
+ def run_started(run_status)
110
+ @run_status = run_status
111
+
110
112
  if reporting_enabled?
111
113
  begin
112
- resource_history_url = "reports/nodes/#{node.name}/runs"
113
- server_response = @rest_client.post_rest(resource_history_url, {:action => :begin})
114
- run_uri = URI.parse(server_response["uri"])
115
- @run_id = ::File.basename(run_uri.path)
116
- Chef::Log.info("Chef server generated run history id: #{@run_id}")
117
- @summary_only = server_response["summary_only"]
114
+ resource_history_url = "reports/nodes/#{node_name}/runs"
115
+ server_response = @rest_client.post_rest(resource_history_url, {:action => :start, :run_id => @run_id,
116
+ :start_time => start_time.to_s}, headers)
118
117
  rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
119
- if !e.response || e.response.code.to_s != "404"
120
- if Chef::Config[:enable_reporting_url_fatals]
121
- Chef::Log.error("Received exception #{"(" + e.response.code + ") " if e.response.code}attempting to generate run history id (URL Path: #{resource_history_url}), and enable_reporting_url_fatals is set, aborting run.")
122
- raise
123
- else
124
- Chef::Log.info("Received exception #{"(" + e.response.code + ") " if e.response.code}attempting to generate run history id (URL Path: #{resource_history_url}), disabling reporting for this run.")
125
- end
126
- else
127
- Chef::Log.debug("Received 404 attempting to generate run history id (URL Path: #{resource_history_url}), assuming feature is not supported on server.")
128
- end
129
- @reporting_enabled = false
118
+ handle_error_starting_run(e, resource_history_url)
119
+ end
120
+ end
121
+ end
122
+
123
+ def handle_error_starting_run(e, url)
124
+ message = "Reporting error starting run. URL: #{url} "
125
+ code = if e.response.code
126
+ e.response.code.to_s
127
+ else
128
+ "Exception Code Empty"
129
+ end
130
+
131
+ if !e.response || (code != "404" && code != "406")
132
+ exception = "Exception: #{code} "
133
+ if Chef::Config[:enable_reporting_url_fatals]
134
+ reporting_status = "Reporting fatals enabled. Aborting run. "
135
+ Chef::Log.error(message + exception + reporting_status)
136
+ raise
137
+ else
138
+ reporting_status = "Disabling reporting for run."
139
+ Chef::Log.info(message + exception + reporting_status)
140
+ end
141
+ else
142
+ reason = "Received #{code}. "
143
+ if code == "406"
144
+ reporting_status = "Client version not supported. Please update the client. Disabling reporting for run."
145
+ Chef::Log.info(message + reason + reporting_status)
146
+ else
147
+ reporting_status = "Disabling reporting for run."
148
+ Chef::Log.debug(message + reason + reporting_status)
130
149
  end
131
150
  end
151
+
152
+ @reporting_enabled = false
132
153
  end
133
154
 
134
155
  def resource_current_state_loaded(new_resource, action, current_resource)
@@ -177,29 +198,25 @@ class Chef
177
198
  def run_failed(exception)
178
199
  @exception = exception
179
200
  @status = "failure"
180
- post_reporting_data
201
+ # If we failed before we received the run_started callback, there's not much we can do
202
+ # in terms of reporting
203
+ if @run_status
204
+ post_reporting_data
205
+ end
181
206
  end
182
207
 
183
208
  def post_reporting_data
184
209
  if reporting_enabled?
185
210
  run_data = prepare_run_data
186
- resource_history_url = "reports/nodes/#{@node.name}/runs/#{@run_id}"
211
+ resource_history_url = "reports/nodes/#{node_name}/runs/#{@run_id}"
187
212
  Chef::Log.info("Sending resource update report (run-id: #{@run_id})")
188
213
  Chef::Log.debug run_data.inspect
189
214
  compressed_data = encode_gzip(run_data.to_json)
190
215
  begin
191
- #if summary only is enabled send the uncompressed run_data excluding the run_data["resources"] and some additional metrics.
192
- if @summary_only
193
- run_data = report_summary(run_data, compressed_data)
194
- Chef::Log.info("run_data_summary: #{run_data}")
195
- @rest_client.post_rest(resource_history_url, run_data)
196
- else
197
- Chef::Log.debug("Sending compressed run data...")
198
- # Since we're posting compressed data we can not directly call
199
- # post_rest which expects JSON
200
- reporting_url = @rest_client.create_url(resource_history_url)
201
- @rest_client.raw_http_request(:POST, reporting_url, {'Content-Encoding' => 'gzip'}, compressed_data)
202
- end
216
+ Chef::Log.debug("Sending compressed run data...")
217
+ # Since we're posting compressed data we can not directly call post_rest which expects JSON
218
+ reporting_url = @rest_client.create_url(resource_history_url)
219
+ @rest_client.raw_http_request(:POST, reporting_url, headers({'Content-Encoding' => 'gzip'}), compressed_data)
203
220
  rescue Net::HTTPServerException => e
204
221
  if e.response.code.to_s == "400"
205
222
  Chef::FileCache.store("failed-reporting-data.json", Chef::JSONCompat.to_json_pretty(run_data), 0640)
@@ -212,7 +229,24 @@ class Chef
212
229
  Chef::Log.debug("Server doesn't support resource history, skipping resource report.")
213
230
  end
214
231
  end
215
-
232
+
233
+ def headers(additional_headers = {})
234
+ options = {'X-Ops-Reporting-Protocol-Version' => PROTOCOL_VERSION}
235
+ options.merge(additional_headers)
236
+ end
237
+
238
+ def node_name
239
+ @run_status.node.name
240
+ end
241
+
242
+ def start_time
243
+ @run_status.start_time
244
+ end
245
+
246
+ def end_time
247
+ @run_status.end_time
248
+ end
249
+
216
250
  def prepare_run_data
217
251
  run_data = {}
218
252
  run_data["action"] = "end"
@@ -220,9 +254,11 @@ class Chef
220
254
  resource_record.for_json
221
255
  end
222
256
  run_data["status"] = @status
223
- run_data["run_list"] = @node.run_list.to_json
257
+ run_data["run_list"] = @run_status.node.run_list.to_json
224
258
  run_data["total_res_count"] = @total_res_count.to_s
225
259
  run_data["data"] = {}
260
+ run_data["start_time"] = start_time.to_s
261
+ run_data["end_time"] = end_time.to_s
226
262
 
227
263
  if exception
228
264
  exception_data = {}
@@ -235,13 +271,6 @@ class Chef
235
271
  run_data
236
272
  end
237
273
 
238
- def report_summary(run_data, compressed_data)
239
- run_data["updated_res_count"] = updated_resources.count.to_s
240
- run_data["post_size"] = compressed_data.bytesize.to_s
241
- run_data["resources"] = []
242
- run_data
243
- end
244
-
245
274
  def run_list_expand_failed(node, exception)
246
275
  description = Formatters::ErrorMapper.run_list_expand_failed(node, exception)
247
276
  @error_descriptions = description.for_json