chef 10.28.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (960) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/README.rdoc +177 -0
  4. data/Rakefile +128 -0
  5. data/bin/chef-client +26 -0
  6. data/bin/chef-solo +25 -0
  7. data/bin/knife +26 -0
  8. data/bin/shef +34 -0
  9. data/distro/README +2 -0
  10. data/distro/arch/etc/conf.d/chef-client.conf +5 -0
  11. data/distro/arch/etc/conf.d/chef-expander.conf +8 -0
  12. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  13. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  14. data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
  15. data/distro/arch/etc/rc.d/chef-client +90 -0
  16. data/distro/arch/etc/rc.d/chef-expander +78 -0
  17. data/distro/arch/etc/rc.d/chef-server +78 -0
  18. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  19. data/distro/arch/etc/rc.d/chef-solr +78 -0
  20. data/distro/common/html/chef-client.8.html +145 -0
  21. data/distro/common/html/chef-expander.8.html +164 -0
  22. data/distro/common/html/chef-expanderctl.8.html +146 -0
  23. data/distro/common/html/chef-server-webui.8.html +185 -0
  24. data/distro/common/html/chef-server.8.html +182 -0
  25. data/distro/common/html/chef-solo.8.html +185 -0
  26. data/distro/common/html/chef-solr.8.html +165 -0
  27. data/distro/common/html/knife-bootstrap.1.html +241 -0
  28. data/distro/common/html/knife-client.1.html +219 -0
  29. data/distro/common/html/knife-configure.1.html +170 -0
  30. data/distro/common/html/knife-cookbook-site.1.html +241 -0
  31. data/distro/common/html/knife-cookbook.1.html +381 -0
  32. data/distro/common/html/knife-data-bag.1.html +235 -0
  33. data/distro/common/html/knife-environment.1.html +265 -0
  34. data/distro/common/html/knife-exec.1.html +134 -0
  35. data/distro/common/html/knife-index.1.html +125 -0
  36. data/distro/common/html/knife-node.1.html +250 -0
  37. data/distro/common/html/knife-recipe.1.html +92 -0
  38. data/distro/common/html/knife-role.1.html +200 -0
  39. data/distro/common/html/knife-search.1.html +288 -0
  40. data/distro/common/html/knife-ssh.1.html +156 -0
  41. data/distro/common/html/knife-status.1.html +128 -0
  42. data/distro/common/html/knife-tag.1.html +137 -0
  43. data/distro/common/html/knife.1.html +320 -0
  44. data/distro/common/html/shef.1.html +283 -0
  45. data/distro/common/man/man1/knife-bootstrap.1 +201 -0
  46. data/distro/common/man/man1/knife-client.1 +99 -0
  47. data/distro/common/man/man1/knife-configure.1 +88 -0
  48. data/distro/common/man/man1/knife-cookbook-site.1 +145 -0
  49. data/distro/common/man/man1/knife-cookbook.1 +332 -0
  50. data/distro/common/man/man1/knife-data-bag.1 +123 -0
  51. data/distro/common/man/man1/knife-environment.1 +168 -0
  52. data/distro/common/man/man1/knife-exec.1 +46 -0
  53. data/distro/common/man/man1/knife-index.1 +29 -0
  54. data/distro/common/man/man1/knife-node.1 +134 -0
  55. data/distro/common/man/man1/knife-role.1 +88 -0
  56. data/distro/common/man/man1/knife-search.1 +280 -0
  57. data/distro/common/man/man1/knife-ssh.1 +79 -0
  58. data/distro/common/man/man1/knife-status.1 +29 -0
  59. data/distro/common/man/man1/knife-tag.1 +43 -0
  60. data/distro/common/man/man1/knife.1 +288 -0
  61. data/distro/common/man/man1/shef.1 +256 -0
  62. data/distro/common/man/man8/chef-client.8 +104 -0
  63. data/distro/common/man/man8/chef-expander.8 +97 -0
  64. data/distro/common/man/man8/chef-expanderctl.8 +62 -0
  65. data/distro/common/man/man8/chef-server-webui.8 +155 -0
  66. data/distro/common/man/man8/chef-server.8 +147 -0
  67. data/distro/common/man/man8/chef-solo.8 +126 -0
  68. data/distro/common/man/man8/chef-solr.8 +122 -0
  69. data/distro/common/markdown/README +3 -0
  70. data/distro/common/markdown/man1/knife-bootstrap.mkd +141 -0
  71. data/distro/common/markdown/man1/knife-client.mkd +103 -0
  72. data/distro/common/markdown/man1/knife-configure.mkd +70 -0
  73. data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -0
  74. data/distro/common/markdown/man1/knife-cookbook.mkd +263 -0
  75. data/distro/common/markdown/man1/knife-data-bag.mkd +121 -0
  76. data/distro/common/markdown/man1/knife-environment.mkd +151 -0
  77. data/distro/common/markdown/man1/knife-exec.mkd +37 -0
  78. data/distro/common/markdown/man1/knife-index.mkd +30 -0
  79. data/distro/common/markdown/man1/knife-node.mkd +130 -0
  80. data/distro/common/markdown/man1/knife-role.mkd +85 -0
  81. data/distro/common/markdown/man1/knife-search.mkd +180 -0
  82. data/distro/common/markdown/man1/knife-ssh.mkd +69 -0
  83. data/distro/common/markdown/man1/knife-status.mkd +36 -0
  84. data/distro/common/markdown/man1/knife-tag.mkd +39 -0
  85. data/distro/common/markdown/man1/knife.mkd +218 -0
  86. data/distro/common/markdown/man1/shef.mkd +189 -0
  87. data/distro/common/markdown/man8/chef-client.mkd +74 -0
  88. data/distro/common/markdown/man8/chef-expander.mkd +82 -0
  89. data/distro/common/markdown/man8/chef-expanderctl.mkd +58 -0
  90. data/distro/common/markdown/man8/chef-server-webui.mkd +121 -0
  91. data/distro/common/markdown/man8/chef-server.mkd +121 -0
  92. data/distro/common/markdown/man8/chef-solo.mkd +107 -0
  93. data/distro/common/markdown/man8/chef-solr.mkd +89 -0
  94. data/distro/debian/etc/default/chef-client +5 -0
  95. data/distro/debian/etc/default/chef-expander +8 -0
  96. data/distro/debian/etc/default/chef-server +9 -0
  97. data/distro/debian/etc/default/chef-server-webui +9 -0
  98. data/distro/debian/etc/default/chef-solr +8 -0
  99. data/distro/debian/etc/init.d/chef-client +210 -0
  100. data/distro/debian/etc/init.d/chef-expander +176 -0
  101. data/distro/debian/etc/init.d/chef-server +122 -0
  102. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  103. data/distro/debian/etc/init.d/chef-solr +176 -0
  104. data/distro/debian/etc/init/chef-client.conf +17 -0
  105. data/distro/debian/etc/init/chef-expander.conf +17 -0
  106. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  107. data/distro/debian/etc/init/chef-server.conf +17 -0
  108. data/distro/debian/etc/init/chef-solr.conf +17 -0
  109. data/distro/redhat/etc/init.d/chef-client +121 -0
  110. data/distro/redhat/etc/init.d/chef-expander +104 -0
  111. data/distro/redhat/etc/init.d/chef-server +112 -0
  112. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  113. data/distro/redhat/etc/init.d/chef-solr +104 -0
  114. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  115. data/distro/redhat/etc/logrotate.d/chef-expander +8 -0
  116. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  117. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  118. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  119. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  120. data/distro/redhat/etc/sysconfig/chef-expander +7 -0
  121. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  122. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  123. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  124. data/distro/windows/service_manager.rb +164 -0
  125. data/lib/chef.rb +41 -0
  126. data/lib/chef/api_client.rb +293 -0
  127. data/lib/chef/application.rb +168 -0
  128. data/lib/chef/application/agent.rb +18 -0
  129. data/lib/chef/application/client.rb +322 -0
  130. data/lib/chef/application/knife.rb +183 -0
  131. data/lib/chef/application/solo.rb +248 -0
  132. data/lib/chef/application/windows_service.rb +227 -0
  133. data/lib/chef/applications.rb +4 -0
  134. data/lib/chef/certificate.rb +161 -0
  135. data/lib/chef/checksum.rb +167 -0
  136. data/lib/chef/checksum/storage.rb +18 -0
  137. data/lib/chef/checksum/storage/filesystem.rb +56 -0
  138. data/lib/chef/checksum_cache.rb +190 -0
  139. data/lib/chef/client.rb +499 -0
  140. data/lib/chef/config.rb +330 -0
  141. data/lib/chef/cookbook/chefignore.rb +66 -0
  142. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  143. data/lib/chef/cookbook/cookbook_version_loader.rb +171 -0
  144. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  145. data/lib/chef/cookbook/file_vendor.rb +48 -0
  146. data/lib/chef/cookbook/metadata.rb +629 -0
  147. data/lib/chef/cookbook/remote_file_vendor.rb +84 -0
  148. data/lib/chef/cookbook/synchronizer.rb +218 -0
  149. data/lib/chef/cookbook/syntax_check.rb +136 -0
  150. data/lib/chef/cookbook_loader.rb +121 -0
  151. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  152. data/lib/chef/cookbook_uploader.rb +173 -0
  153. data/lib/chef/cookbook_version.rb +1081 -0
  154. data/lib/chef/cookbook_version_selector.rb +168 -0
  155. data/lib/chef/couchdb.rb +246 -0
  156. data/lib/chef/daemon.rb +187 -0
  157. data/lib/chef/data_bag.rb +239 -0
  158. data/lib/chef/data_bag_item.rb +277 -0
  159. data/lib/chef/encrypted_data_bag_item.rb +268 -0
  160. data/lib/chef/environment.rb +458 -0
  161. data/lib/chef/event_dispatch/base.rb +311 -0
  162. data/lib/chef/event_dispatch/dispatcher.rb +42 -0
  163. data/lib/chef/exceptions.rb +192 -0
  164. data/lib/chef/file_access_control.rb +75 -0
  165. data/lib/chef/file_access_control/unix.rb +216 -0
  166. data/lib/chef/file_access_control/windows.rb +310 -0
  167. data/lib/chef/file_cache.rb +220 -0
  168. data/lib/chef/formatters/base.rb +247 -0
  169. data/lib/chef/formatters/doc.rb +236 -0
  170. data/lib/chef/formatters/error_descriptor.rb +66 -0
  171. data/lib/chef/formatters/error_inspectors.rb +19 -0
  172. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +111 -0
  173. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +106 -0
  174. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +146 -0
  175. data/lib/chef/formatters/error_inspectors/cookbook_sync_error_inspector.rb +80 -0
  176. data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +125 -0
  177. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +137 -0
  178. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +109 -0
  179. data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +118 -0
  180. data/lib/chef/formatters/error_mapper.rb +85 -0
  181. data/lib/chef/formatters/minimal.rb +235 -0
  182. data/lib/chef/handler.rb +235 -0
  183. data/lib/chef/handler/error_report.rb +33 -0
  184. data/lib/chef/handler/json_file.rb +64 -0
  185. data/lib/chef/index_queue.rb +29 -0
  186. data/lib/chef/index_queue/amqp_client.rb +116 -0
  187. data/lib/chef/index_queue/consumer.rb +76 -0
  188. data/lib/chef/index_queue/indexable.rb +109 -0
  189. data/lib/chef/json_compat.rb +149 -0
  190. data/lib/chef/knife.rb +537 -0
  191. data/lib/chef/knife/bootstrap.rb +233 -0
  192. data/lib/chef/knife/bootstrap/archlinux-gems.erb +62 -0
  193. data/lib/chef/knife/bootstrap/centos5-gems.erb +62 -0
  194. data/lib/chef/knife/bootstrap/chef-full.erb +60 -0
  195. data/lib/chef/knife/bootstrap/fedora13-gems.erb +44 -0
  196. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +53 -0
  197. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +48 -0
  198. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +46 -0
  199. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +60 -0
  200. data/lib/chef/knife/client_bulk_delete.rb +65 -0
  201. data/lib/chef/knife/client_create.rb +80 -0
  202. data/lib/chef/knife/client_delete.rb +46 -0
  203. data/lib/chef/knife/client_edit.rb +45 -0
  204. data/lib/chef/knife/client_list.rb +42 -0
  205. data/lib/chef/knife/client_reregister.rb +59 -0
  206. data/lib/chef/knife/client_show.rb +52 -0
  207. data/lib/chef/knife/configure.rb +168 -0
  208. data/lib/chef/knife/configure_client.rb +50 -0
  209. data/lib/chef/knife/cookbook_bulk_delete.rb +72 -0
  210. data/lib/chef/knife/cookbook_create.rb +447 -0
  211. data/lib/chef/knife/cookbook_delete.rb +151 -0
  212. data/lib/chef/knife/cookbook_download.rb +137 -0
  213. data/lib/chef/knife/cookbook_list.rb +47 -0
  214. data/lib/chef/knife/cookbook_metadata.rb +107 -0
  215. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  216. data/lib/chef/knife/cookbook_show.rb +102 -0
  217. data/lib/chef/knife/cookbook_site_download.rb +109 -0
  218. data/lib/chef/knife/cookbook_site_install.rb +164 -0
  219. data/lib/chef/knife/cookbook_site_list.rb +62 -0
  220. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  221. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  222. data/lib/chef/knife/cookbook_site_show.rb +60 -0
  223. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  224. data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
  225. data/lib/chef/knife/cookbook_test.rb +93 -0
  226. data/lib/chef/knife/cookbook_upload.rb +290 -0
  227. data/lib/chef/knife/core/bootstrap_context.rb +106 -0
  228. data/lib/chef/knife/core/cookbook_scm_repo.rb +160 -0
  229. data/lib/chef/knife/core/generic_presenter.rb +191 -0
  230. data/lib/chef/knife/core/node_editor.rb +130 -0
  231. data/lib/chef/knife/core/node_presenter.rb +137 -0
  232. data/lib/chef/knife/core/object_loader.rb +112 -0
  233. data/lib/chef/knife/core/subcommand_loader.rb +112 -0
  234. data/lib/chef/knife/core/text_formatter.rb +100 -0
  235. data/lib/chef/knife/core/ui.rb +217 -0
  236. data/lib/chef/knife/data_bag_create.rb +93 -0
  237. data/lib/chef/knife/data_bag_delete.rb +51 -0
  238. data/lib/chef/knife/data_bag_edit.rb +94 -0
  239. data/lib/chef/knife/data_bag_from_file.rb +136 -0
  240. data/lib/chef/knife/data_bag_list.rb +46 -0
  241. data/lib/chef/knife/data_bag_show.rb +81 -0
  242. data/lib/chef/knife/environment_create.rb +53 -0
  243. data/lib/chef/knife/environment_delete.rb +45 -0
  244. data/lib/chef/knife/environment_edit.rb +45 -0
  245. data/lib/chef/knife/environment_from_file.rb +83 -0
  246. data/lib/chef/knife/environment_list.rb +42 -0
  247. data/lib/chef/knife/environment_show.rb +46 -0
  248. data/lib/chef/knife/exec.rb +86 -0
  249. data/lib/chef/knife/help.rb +103 -0
  250. data/lib/chef/knife/help_topics.rb +4 -0
  251. data/lib/chef/knife/index_rebuild.rb +50 -0
  252. data/lib/chef/knife/node_bulk_delete.rb +80 -0
  253. data/lib/chef/knife/node_create.rb +50 -0
  254. data/lib/chef/knife/node_delete.rb +47 -0
  255. data/lib/chef/knife/node_edit.rb +72 -0
  256. data/lib/chef/knife/node_from_file.rb +50 -0
  257. data/lib/chef/knife/node_list.rb +46 -0
  258. data/lib/chef/knife/node_run_list_add.rb +75 -0
  259. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  260. data/lib/chef/knife/node_show.rb +73 -0
  261. data/lib/chef/knife/recipe_list.rb +32 -0
  262. data/lib/chef/knife/role_bulk_delete.rb +70 -0
  263. data/lib/chef/knife/role_create.rb +55 -0
  264. data/lib/chef/knife/role_delete.rb +47 -0
  265. data/lib/chef/knife/role_edit.rb +48 -0
  266. data/lib/chef/knife/role_from_file.rb +56 -0
  267. data/lib/chef/knife/role_list.rb +43 -0
  268. data/lib/chef/knife/role_show.rb +54 -0
  269. data/lib/chef/knife/search.rb +141 -0
  270. data/lib/chef/knife/ssh.rb +459 -0
  271. data/lib/chef/knife/status.rb +119 -0
  272. data/lib/chef/knife/tag_create.rb +52 -0
  273. data/lib/chef/knife/tag_delete.rb +60 -0
  274. data/lib/chef/knife/tag_list.rb +47 -0
  275. data/lib/chef/log.rb +39 -0
  276. data/lib/chef/mash.rb +225 -0
  277. data/lib/chef/mixin/check_helper.rb +31 -0
  278. data/lib/chef/mixin/checksum.rb +32 -0
  279. data/lib/chef/mixin/command.rb +164 -0
  280. data/lib/chef/mixin/command/unix.rb +220 -0
  281. data/lib/chef/mixin/command/windows.rb +76 -0
  282. data/lib/chef/mixin/convert_to_class_name.rb +65 -0
  283. data/lib/chef/mixin/create_path.rb +57 -0
  284. data/lib/chef/mixin/deep_merge.rb +247 -0
  285. data/lib/chef/mixin/deprecation.rb +65 -0
  286. data/lib/chef/mixin/enforce_ownership_and_permissions.rb +39 -0
  287. data/lib/chef/mixin/file_class.rb +46 -0
  288. data/lib/chef/mixin/from_file.rb +50 -0
  289. data/lib/chef/mixin/get_source_from_package.rb +42 -0
  290. data/lib/chef/mixin/language.rb +249 -0
  291. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  292. data/lib/chef/mixin/language_include_recipe.rb +58 -0
  293. data/lib/chef/mixin/params_validate.rb +238 -0
  294. data/lib/chef/mixin/path_sanity.rb +67 -0
  295. data/lib/chef/mixin/recipe_definition_dsl_core.rb +86 -0
  296. data/lib/chef/mixin/securable.rb +180 -0
  297. data/lib/chef/mixin/shell_out.rb +69 -0
  298. data/lib/chef/mixin/template.rb +100 -0
  299. data/lib/chef/mixin/why_run.rb +332 -0
  300. data/lib/chef/mixin/xml_escape.rb +140 -0
  301. data/lib/chef/mixins.rb +18 -0
  302. data/lib/chef/monkey_patches/dir.rb +36 -0
  303. data/lib/chef/monkey_patches/fileutils.rb +65 -0
  304. data/lib/chef/monkey_patches/moneta.rb +50 -0
  305. data/lib/chef/monkey_patches/net_http.rb +22 -0
  306. data/lib/chef/monkey_patches/numeric.rb +15 -0
  307. data/lib/chef/monkey_patches/object.rb +9 -0
  308. data/lib/chef/monkey_patches/regexp.rb +34 -0
  309. data/lib/chef/monkey_patches/string.rb +49 -0
  310. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  311. data/lib/chef/nil_argument.rb +3 -0
  312. data/lib/chef/node.rb +682 -0
  313. data/lib/chef/node/attribute.rb +504 -0
  314. data/lib/chef/openid_registration.rb +187 -0
  315. data/lib/chef/platform.rb +520 -0
  316. data/lib/chef/provider.rb +223 -0
  317. data/lib/chef/provider/breakpoint.rb +36 -0
  318. data/lib/chef/provider/cookbook_file.rb +105 -0
  319. data/lib/chef/provider/cron.rb +214 -0
  320. data/lib/chef/provider/cron/solaris.rb +56 -0
  321. data/lib/chef/provider/deploy.rb +474 -0
  322. data/lib/chef/provider/deploy/revision.rb +80 -0
  323. data/lib/chef/provider/deploy/timestamped.rb +32 -0
  324. data/lib/chef/provider/directory.rb +128 -0
  325. data/lib/chef/provider/env.rb +152 -0
  326. data/lib/chef/provider/env/windows.rb +75 -0
  327. data/lib/chef/provider/erl_call.rb +106 -0
  328. data/lib/chef/provider/execute.rb +68 -0
  329. data/lib/chef/provider/file.rb +355 -0
  330. data/lib/chef/provider/git.rb +260 -0
  331. data/lib/chef/provider/group.rb +159 -0
  332. data/lib/chef/provider/group/aix.rb +70 -0
  333. data/lib/chef/provider/group/dscl.rb +129 -0
  334. data/lib/chef/provider/group/gpasswd.rb +65 -0
  335. data/lib/chef/provider/group/groupadd.rb +96 -0
  336. data/lib/chef/provider/group/groupmod.rb +120 -0
  337. data/lib/chef/provider/group/pw.rb +93 -0
  338. data/lib/chef/provider/group/suse.rb +60 -0
  339. data/lib/chef/provider/group/usermod.rb +68 -0
  340. data/lib/chef/provider/group/windows.rb +79 -0
  341. data/lib/chef/provider/http_request.rb +136 -0
  342. data/lib/chef/provider/ifconfig.rb +214 -0
  343. data/lib/chef/provider/link.rb +130 -0
  344. data/lib/chef/provider/log.rb +54 -0
  345. data/lib/chef/provider/mdadm.rb +92 -0
  346. data/lib/chef/provider/mount.rb +128 -0
  347. data/lib/chef/provider/mount/mount.rb +252 -0
  348. data/lib/chef/provider/mount/windows.rb +81 -0
  349. data/lib/chef/provider/ohai.rb +47 -0
  350. data/lib/chef/provider/package.rb +229 -0
  351. data/lib/chef/provider/package/apt.rb +147 -0
  352. data/lib/chef/provider/package/dpkg.rb +128 -0
  353. data/lib/chef/provider/package/easy_install.rb +136 -0
  354. data/lib/chef/provider/package/freebsd.rb +149 -0
  355. data/lib/chef/provider/package/ips.rb +101 -0
  356. data/lib/chef/provider/package/macports.rb +105 -0
  357. data/lib/chef/provider/package/pacman.rb +111 -0
  358. data/lib/chef/provider/package/portage.rb +143 -0
  359. data/lib/chef/provider/package/rpm.rb +121 -0
  360. data/lib/chef/provider/package/rubygems.rb +580 -0
  361. data/lib/chef/provider/package/smartos.rb +84 -0
  362. data/lib/chef/provider/package/solaris.rb +139 -0
  363. data/lib/chef/provider/package/yum-dump.py +307 -0
  364. data/lib/chef/provider/package/yum.rb +1261 -0
  365. data/lib/chef/provider/package/zypper.rb +144 -0
  366. data/lib/chef/provider/remote_directory.rb +178 -0
  367. data/lib/chef/provider/remote_file.rb +126 -0
  368. data/lib/chef/provider/resource_update.rb +55 -0
  369. data/lib/chef/provider/route.rb +223 -0
  370. data/lib/chef/provider/ruby_block.rb +39 -0
  371. data/lib/chef/provider/script.rb +57 -0
  372. data/lib/chef/provider/service.rb +158 -0
  373. data/lib/chef/provider/service/arch.rb +113 -0
  374. data/lib/chef/provider/service/debian.rb +152 -0
  375. data/lib/chef/provider/service/freebsd.rb +175 -0
  376. data/lib/chef/provider/service/gentoo.rb +67 -0
  377. data/lib/chef/provider/service/init.rb +87 -0
  378. data/lib/chef/provider/service/insserv.rb +52 -0
  379. data/lib/chef/provider/service/invokercd.rb +35 -0
  380. data/lib/chef/provider/service/macosx.rb +144 -0
  381. data/lib/chef/provider/service/redhat.rb +77 -0
  382. data/lib/chef/provider/service/simple.rb +172 -0
  383. data/lib/chef/provider/service/solaris.rb +86 -0
  384. data/lib/chef/provider/service/systemd.rb +115 -0
  385. data/lib/chef/provider/service/upstart.rb +232 -0
  386. data/lib/chef/provider/service/windows.rb +163 -0
  387. data/lib/chef/provider/subversion.rb +214 -0
  388. data/lib/chef/provider/template.rb +117 -0
  389. data/lib/chef/provider/user.rb +207 -0
  390. data/lib/chef/provider/user/dscl.rb +280 -0
  391. data/lib/chef/provider/user/pw.rb +113 -0
  392. data/lib/chef/provider/user/solaris.rb +90 -0
  393. data/lib/chef/provider/user/useradd.rb +153 -0
  394. data/lib/chef/provider/user/windows.rb +124 -0
  395. data/lib/chef/providers.rb +101 -0
  396. data/lib/chef/recipe.rb +129 -0
  397. data/lib/chef/reserved_names.rb +9 -0
  398. data/lib/chef/resource.rb +912 -0
  399. data/lib/chef/resource/apt_package.rb +43 -0
  400. data/lib/chef/resource/bash.rb +33 -0
  401. data/lib/chef/resource/breakpoint.rb +35 -0
  402. data/lib/chef/resource/chef_gem.rb +53 -0
  403. data/lib/chef/resource/conditional.rb +101 -0
  404. data/lib/chef/resource/cookbook_file.rb +52 -0
  405. data/lib/chef/resource/cron.rb +202 -0
  406. data/lib/chef/resource/csh.rb +33 -0
  407. data/lib/chef/resource/deploy.rb +403 -0
  408. data/lib/chef/resource/deploy_revision.rb +40 -0
  409. data/lib/chef/resource/directory.rb +65 -0
  410. data/lib/chef/resource/dpkg_package.rb +34 -0
  411. data/lib/chef/resource/easy_install_package.rb +57 -0
  412. data/lib/chef/resource/env.rb +63 -0
  413. data/lib/chef/resource/erl_call.rb +86 -0
  414. data/lib/chef/resource/execute.rb +132 -0
  415. data/lib/chef/resource/file.rb +96 -0
  416. data/lib/chef/resource/freebsd_package.rb +35 -0
  417. data/lib/chef/resource/gem_package.rb +53 -0
  418. data/lib/chef/resource/git.rb +46 -0
  419. data/lib/chef/resource/group.rb +83 -0
  420. data/lib/chef/resource/http_request.rb +64 -0
  421. data/lib/chef/resource/ifconfig.rb +149 -0
  422. data/lib/chef/resource/ips_package.rb +42 -0
  423. data/lib/chef/resource/link.rb +92 -0
  424. data/lib/chef/resource/log.rb +74 -0
  425. data/lib/chef/resource/macports_package.rb +29 -0
  426. data/lib/chef/resource/mdadm.rb +105 -0
  427. data/lib/chef/resource/mount.rb +139 -0
  428. data/lib/chef/resource/ohai.rb +54 -0
  429. data/lib/chef/resource/package.rb +84 -0
  430. data/lib/chef/resource/pacman_package.rb +33 -0
  431. data/lib/chef/resource/perl.rb +33 -0
  432. data/lib/chef/resource/portage_package.rb +33 -0
  433. data/lib/chef/resource/python.rb +33 -0
  434. data/lib/chef/resource/remote_directory.rb +125 -0
  435. data/lib/chef/resource/remote_file.rb +90 -0
  436. data/lib/chef/resource/route.rb +140 -0
  437. data/lib/chef/resource/rpm_package.rb +34 -0
  438. data/lib/chef/resource/ruby.rb +33 -0
  439. data/lib/chef/resource/ruby_block.rb +51 -0
  440. data/lib/chef/resource/scm.rb +151 -0
  441. data/lib/chef/resource/script.rb +63 -0
  442. data/lib/chef/resource/service.rb +164 -0
  443. data/lib/chef/resource/smartos_package.rb +36 -0
  444. data/lib/chef/resource/solaris_package.rb +36 -0
  445. data/lib/chef/resource/subversion.rb +37 -0
  446. data/lib/chef/resource/template.rb +76 -0
  447. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  448. data/lib/chef/resource/user.rb +134 -0
  449. data/lib/chef/resource/yum_package.rb +63 -0
  450. data/lib/chef/resource_collection.rb +217 -0
  451. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  452. data/lib/chef/resource_definition.rb +67 -0
  453. data/lib/chef/resource_definition_list.rb +38 -0
  454. data/lib/chef/resource_platform_map.rb +151 -0
  455. data/lib/chef/resource_reporter.rb +281 -0
  456. data/lib/chef/resources.rb +67 -0
  457. data/lib/chef/rest.rb +510 -0
  458. data/lib/chef/rest/auth_credentials.rb +73 -0
  459. data/lib/chef/rest/cookie_jar.rb +31 -0
  460. data/lib/chef/rest/rest_request.rb +229 -0
  461. data/lib/chef/role.rb +349 -0
  462. data/lib/chef/run_context.rb +236 -0
  463. data/lib/chef/run_list.rb +165 -0
  464. data/lib/chef/run_list/run_list_expansion.rb +206 -0
  465. data/lib/chef/run_list/run_list_item.rb +99 -0
  466. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  467. data/lib/chef/run_status.rb +124 -0
  468. data/lib/chef/runner.rb +95 -0
  469. data/lib/chef/sandbox.rb +153 -0
  470. data/lib/chef/scan_access_control.rb +135 -0
  471. data/lib/chef/search/query.rb +65 -0
  472. data/lib/chef/shef.rb +327 -0
  473. data/lib/chef/shef/ext.rb +591 -0
  474. data/lib/chef/shef/model_wrapper.rb +120 -0
  475. data/lib/chef/shef/shef_rest.rb +28 -0
  476. data/lib/chef/shef/shef_session.rb +296 -0
  477. data/lib/chef/shell_out.rb +6 -0
  478. data/lib/chef/solr_query.rb +187 -0
  479. data/lib/chef/solr_query/lucene.treetop +150 -0
  480. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  481. data/lib/chef/solr_query/query_transform.rb +65 -0
  482. data/lib/chef/solr_query/solr_http_request.rb +132 -0
  483. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  484. data/lib/chef/tasks/chef_repo.rake +334 -0
  485. data/lib/chef/util/file_edit.rb +132 -0
  486. data/lib/chef/util/windows.rb +56 -0
  487. data/lib/chef/util/windows/net_group.rb +101 -0
  488. data/lib/chef/util/windows/net_use.rb +121 -0
  489. data/lib/chef/util/windows/net_user.rb +198 -0
  490. data/lib/chef/util/windows/volume.rb +59 -0
  491. data/lib/chef/version.rb +23 -0
  492. data/lib/chef/version_class.rb +70 -0
  493. data/lib/chef/version_constraint.rb +116 -0
  494. data/lib/chef/webui_user.rb +231 -0
  495. data/lib/chef/win32/api.rb +364 -0
  496. data/lib/chef/win32/api/error.rb +921 -0
  497. data/lib/chef/win32/api/file.rb +535 -0
  498. data/lib/chef/win32/api/memory.rb +105 -0
  499. data/lib/chef/win32/api/process.rb +41 -0
  500. data/lib/chef/win32/api/psapi.rb +51 -0
  501. data/lib/chef/win32/api/security.rb +341 -0
  502. data/lib/chef/win32/api/system.rb +192 -0
  503. data/lib/chef/win32/api/unicode.rb +178 -0
  504. data/lib/chef/win32/error.rb +73 -0
  505. data/lib/chef/win32/file.rb +167 -0
  506. data/lib/chef/win32/file/info.rb +100 -0
  507. data/lib/chef/win32/handle.rb +55 -0
  508. data/lib/chef/win32/memory.rb +101 -0
  509. data/lib/chef/win32/process.rb +84 -0
  510. data/lib/chef/win32/security.rb +489 -0
  511. data/lib/chef/win32/security/ace.rb +125 -0
  512. data/lib/chef/win32/security/acl.rb +101 -0
  513. data/lib/chef/win32/security/securable_object.rb +109 -0
  514. data/lib/chef/win32/security/security_descriptor.rb +93 -0
  515. data/lib/chef/win32/security/sid.rb +199 -0
  516. data/lib/chef/win32/security/token.rb +64 -0
  517. data/lib/chef/win32/unicode.rb +43 -0
  518. data/lib/chef/win32/version.rb +119 -0
  519. data/spec/data/bad-config.rb +1 -0
  520. data/spec/data/big_json.json +2 -0
  521. data/spec/data/big_json_plus_one.json +2 -0
  522. data/spec/data/bootstrap/test-hints.erb +12 -0
  523. data/spec/data/bootstrap/test.erb +1 -0
  524. data/spec/data/cb_version_cookbooks/tatft/README.rdoc +3 -0
  525. data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -0
  526. data/spec/data/cb_version_cookbooks/tatft/definitions/runit_service.rb +1 -0
  527. data/spec/data/cb_version_cookbooks/tatft/files/default/giant_blob.tgz +1 -0
  528. data/spec/data/cb_version_cookbooks/tatft/libraries/ownage.rb +1 -0
  529. data/spec/data/cb_version_cookbooks/tatft/providers/lwp.rb +1 -0
  530. data/spec/data/cb_version_cookbooks/tatft/recipes/default.rb +1 -0
  531. data/spec/data/cb_version_cookbooks/tatft/resources/lwr.rb +1 -0
  532. data/spec/data/cb_version_cookbooks/tatft/templates/default/configuration.erb +0 -0
  533. data/spec/data/checksum/random.txt +1 -0
  534. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -0
  535. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-6m8zdk-0 +0 -0
  536. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -0
  537. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -0
  538. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -0
  539. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -0
  540. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -0
  541. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -0
  542. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -0
  543. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -0
  544. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -0
  545. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -0
  546. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -0
  547. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -0
  548. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -0
  549. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -0
  550. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -0
  551. data/spec/data/config.rb +6 -0
  552. data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -0
  553. data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -0
  554. data/spec/data/cookbooks/apache2/recipes/default.rb +3 -0
  555. data/spec/data/cookbooks/borken/recipes/default.rb +2 -0
  556. data/spec/data/cookbooks/borken/templates/default/borken.erb +2 -0
  557. data/spec/data/cookbooks/chefignore +8 -0
  558. data/spec/data/cookbooks/java/files/default/java.response +2 -0
  559. data/spec/data/cookbooks/openldap/attributes/default.rb +15 -0
  560. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -0
  561. data/spec/data/cookbooks/openldap/definitions/client.rb +5 -0
  562. data/spec/data/cookbooks/openldap/definitions/server.rb +5 -0
  563. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
  564. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
  565. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
  566. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +3 -0
  567. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +3 -0
  568. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
  569. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +3 -0
  570. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +3 -0
  571. data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -0
  572. data/spec/data/cookbooks/openldap/recipes/default.rb +3 -0
  573. data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -0
  574. data/spec/data/cookbooks/openldap/recipes/one.rb +15 -0
  575. data/spec/data/cookbooks/openldap/templates/default/openldap_stuff.conf.erb +1 -0
  576. data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -0
  577. data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -0
  578. data/spec/data/definitions/test.rb +5 -0
  579. data/spec/data/environment-config.rb +5 -0
  580. data/spec/data/fileedit/blank +0 -0
  581. data/spec/data/fileedit/hosts +4 -0
  582. data/spec/data/gems/chef-integration-test-0.1.0.gem +0 -0
  583. data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
  584. data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
  585. data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
  586. data/spec/data/kitchen/chefignore +6 -0
  587. data/spec/data/kitchen/openldap/attributes/default.rb +3 -0
  588. data/spec/data/kitchen/openldap/attributes/robinson.rb +3 -0
  589. data/spec/data/kitchen/openldap/definitions/client.rb +3 -0
  590. data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +3 -0
  591. data/spec/data/kitchen/openldap/recipes/gigantor.rb +3 -0
  592. data/spec/data/kitchen/openldap/recipes/ignoreme.rb +3 -0
  593. data/spec/data/kitchen/openldap/recipes/woot.rb +3 -0
  594. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  595. data/spec/data/knife-site-subcommands/plugins/knife/example_subcommand.rb +0 -0
  596. data/spec/data/knife_subcommand/test_explicit_category.rb +7 -0
  597. data/spec/data/knife_subcommand/test_name_mapping.rb +4 -0
  598. data/spec/data/knife_subcommand/test_yourself.rb +13 -0
  599. data/spec/data/lwrp/providers/buck_passer.rb +3 -0
  600. data/spec/data/lwrp/providers/buck_passer_2.rb +10 -0
  601. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +16 -0
  602. data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -0
  603. data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -0
  604. data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -0
  605. data/spec/data/lwrp/resources/bar.rb +1 -0
  606. data/spec/data/lwrp/resources/foo.rb +3 -0
  607. data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +1 -0
  608. data/spec/data/lwrp_const_scoping/resources/conflict.rb +0 -0
  609. data/spec/data/lwrp_override/providers/buck_passer.rb +10 -0
  610. data/spec/data/lwrp_override/resources/foo.rb +4 -0
  611. data/spec/data/metadata/quick_start/metadata.rb +19 -0
  612. data/spec/data/nodes/default.rb +15 -0
  613. data/spec/data/nodes/test.example.com.rb +17 -0
  614. data/spec/data/nodes/test.rb +15 -0
  615. data/spec/data/object_loader/environments/test.json +5 -0
  616. data/spec/data/object_loader/environments/test.rb +2 -0
  617. data/spec/data/object_loader/environments/test_json_class.json +6 -0
  618. data/spec/data/object_loader/nodes/test.json +5 -0
  619. data/spec/data/object_loader/nodes/test.rb +2 -0
  620. data/spec/data/object_loader/nodes/test_json_class.json +6 -0
  621. data/spec/data/object_loader/roles/test.json +5 -0
  622. data/spec/data/object_loader/roles/test.rb +2 -0
  623. data/spec/data/object_loader/roles/test_json_class.json +6 -0
  624. data/spec/data/old_home_dir/my-dot-emacs +0 -0
  625. data/spec/data/old_home_dir/my-dot-vim +0 -0
  626. data/spec/data/recipes/test.rb +7 -0
  627. data/spec/data/remote_directory_data/remote_dir_file.txt +1 -0
  628. data/spec/data/remote_directory_data/remote_subdirectory/remote_subdir_file.txt +1 -0
  629. data/spec/data/remote_file/nyan_cat.png +0 -0
  630. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -0
  631. data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -0
  632. data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -0
  633. data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -0
  634. data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -0
  635. data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -0
  636. data/spec/data/run_context/nodes/run_context.rb +5 -0
  637. data/spec/data/search_queries_to_transform.txt +98 -0
  638. data/spec/data/ssl/5e707473.0 +18 -0
  639. data/spec/data/ssl/chef-rspec.cert +27 -0
  640. data/spec/data/ssl/chef-rspec.key +27 -0
  641. data/spec/data/ssl/key.pem +15 -0
  642. data/spec/data/ssl/private_key.pem +27 -0
  643. data/spec/data/ssl/private_key_with_whitespace.pem +32 -0
  644. data/spec/data/templates/seattle.txt +1 -0
  645. data/spec/functional/knife/cookbook_delete_spec.rb +160 -0
  646. data/spec/functional/knife/exec_spec.rb +60 -0
  647. data/spec/functional/knife/ssh_spec.rb +268 -0
  648. data/spec/functional/resource/cookbook_file_spec.rb +75 -0
  649. data/spec/functional/resource/deploy_revision_spec.rb +515 -0
  650. data/spec/functional/resource/directory_spec.rb +39 -0
  651. data/spec/functional/resource/file_spec.rb +69 -0
  652. data/spec/functional/resource/link_spec.rb +572 -0
  653. data/spec/functional/resource/remote_directory_spec.rb +114 -0
  654. data/spec/functional/resource/remote_file_spec.rb +65 -0
  655. data/spec/functional/resource/template_spec.rb +68 -0
  656. data/spec/functional/tiny_server_spec.rb +78 -0
  657. data/spec/rcov.opts +2 -0
  658. data/spec/spec_helper.rb +82 -0
  659. data/spec/stress/win32/file_spec.rb +37 -0
  660. data/spec/stress/win32/memory_spec.rb +22 -0
  661. data/spec/stress/win32/security_spec.rb +69 -0
  662. data/spec/support/chef_helpers.rb +65 -0
  663. data/spec/support/lib/chef/provider/easy.rb +35 -0
  664. data/spec/support/lib/chef/provider/snakeoil.rb +40 -0
  665. data/spec/support/lib/chef/resource/cat.rb +41 -0
  666. data/spec/support/lib/chef/resource/one_two_three_four.rb +43 -0
  667. data/spec/support/lib/chef/resource/zen_master.rb +46 -0
  668. data/spec/support/matchers/leak.rb +96 -0
  669. data/spec/support/mock/constant.rb +52 -0
  670. data/spec/support/mock/platform.rb +18 -0
  671. data/spec/support/platform_helpers.rb +39 -0
  672. data/spec/support/platforms/prof/gc.rb +54 -0
  673. data/spec/support/platforms/prof/win32.rb +46 -0
  674. data/spec/support/shared/functional/directory_resource.rb +85 -0
  675. data/spec/support/shared/functional/file_resource.rb +202 -0
  676. data/spec/support/shared/functional/knife.rb +37 -0
  677. data/spec/support/shared/functional/securable_resource.rb +402 -0
  678. data/spec/support/shared/unit/api_error_inspector.rb +192 -0
  679. data/spec/tiny_server.rb +202 -0
  680. data/spec/unit/api_client_spec.rb +257 -0
  681. data/spec/unit/application/agent_spec.rb +0 -0
  682. data/spec/unit/application/client_spec.rb +171 -0
  683. data/spec/unit/application/knife_spec.rb +152 -0
  684. data/spec/unit/application/server_spec.rb +0 -0
  685. data/spec/unit/application/solo_spec.rb +167 -0
  686. data/spec/unit/application_spec.rb +239 -0
  687. data/spec/unit/certificate_spec.rb +76 -0
  688. data/spec/unit/checksum/storage/filesystem_spec.rb +69 -0
  689. data/spec/unit/checksum_cache_spec.rb +209 -0
  690. data/spec/unit/checksum_spec.rb +94 -0
  691. data/spec/unit/chef_spec.rb +25 -0
  692. data/spec/unit/client_spec.rb +290 -0
  693. data/spec/unit/config_spec.rb +223 -0
  694. data/spec/unit/cookbook/chefignore_spec.rb +39 -0
  695. data/spec/unit/cookbook/metadata_spec.rb +627 -0
  696. data/spec/unit/cookbook/synchronizer_spec.rb +306 -0
  697. data/spec/unit/cookbook/syntax_check_spec.rb +211 -0
  698. data/spec/unit/cookbook_loader_spec.rb +145 -0
  699. data/spec/unit/cookbook_manifest_spec.rb +554 -0
  700. data/spec/unit/cookbook_spec.rb +101 -0
  701. data/spec/unit/cookbook_version_spec.rb +406 -0
  702. data/spec/unit/couchdb_spec.rb +274 -0
  703. data/spec/unit/daemon_spec.rb +302 -0
  704. data/spec/unit/data_bag_item_spec.rb +280 -0
  705. data/spec/unit/data_bag_spec.rb +169 -0
  706. data/spec/unit/encrypted_data_bag_item_spec.rb +293 -0
  707. data/spec/unit/environment_spec.rb +492 -0
  708. data/spec/unit/exceptions_spec.rb +74 -0
  709. data/spec/unit/file_access_control_spec.rb +282 -0
  710. data/spec/unit/file_cache_spec.rb +114 -0
  711. data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +202 -0
  712. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +93 -0
  713. data/spec/unit/formatters/error_inspectors/cookbook_sync_error_inspector_spec.rb +43 -0
  714. data/spec/unit/formatters/error_inspectors/node_load_error_inspector_spec.rb +27 -0
  715. data/spec/unit/formatters/error_inspectors/registration_error_inspector_spec.rb +27 -0
  716. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +182 -0
  717. data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +93 -0
  718. data/spec/unit/handler/json_file_spec.rb +64 -0
  719. data/spec/unit/handler_spec.rb +216 -0
  720. data/spec/unit/index_queue_spec.rb +391 -0
  721. data/spec/unit/json_compat_spec.rb +61 -0
  722. data/spec/unit/knife/bootstrap_spec.rb +265 -0
  723. data/spec/unit/knife/client_bulk_delete_spec.rb +78 -0
  724. data/spec/unit/knife/client_create_spec.rb +74 -0
  725. data/spec/unit/knife/client_delete_spec.rb +40 -0
  726. data/spec/unit/knife/client_edit_spec.rb +40 -0
  727. data/spec/unit/knife/client_list_spec.rb +34 -0
  728. data/spec/unit/knife/client_reregister_spec.rb +62 -0
  729. data/spec/unit/knife/client_show_spec.rb +42 -0
  730. data/spec/unit/knife/config_file_selection_spec.rb +118 -0
  731. data/spec/unit/knife/configure_client_spec.rb +83 -0
  732. data/spec/unit/knife/configure_spec.rb +229 -0
  733. data/spec/unit/knife/cookbook_bulk_delete_spec.rb +87 -0
  734. data/spec/unit/knife/cookbook_create_spec.rb +271 -0
  735. data/spec/unit/knife/cookbook_delete_spec.rb +239 -0
  736. data/spec/unit/knife/cookbook_download_spec.rb +217 -0
  737. data/spec/unit/knife/cookbook_list_spec.rb +88 -0
  738. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +65 -0
  739. data/spec/unit/knife/cookbook_metadata_spec.rb +172 -0
  740. data/spec/unit/knife/cookbook_show_spec.rb +223 -0
  741. data/spec/unit/knife/cookbook_site_download_spec.rb +151 -0
  742. data/spec/unit/knife/cookbook_site_install_spec.rb +148 -0
  743. data/spec/unit/knife/cookbook_site_share_spec.rb +146 -0
  744. data/spec/unit/knife/cookbook_site_unshare_spec.rb +77 -0
  745. data/spec/unit/knife/cookbook_test_spec.rb +83 -0
  746. data/spec/unit/knife/cookbook_upload_spec.rb +148 -0
  747. data/spec/unit/knife/core/bootstrap_context_spec.rb +135 -0
  748. data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +187 -0
  749. data/spec/unit/knife/core/object_loader_spec.rb +81 -0
  750. data/spec/unit/knife/core/subcommand_loader_spec.rb +54 -0
  751. data/spec/unit/knife/core/ui_spec.rb +160 -0
  752. data/spec/unit/knife/data_bag_create_spec.rb +101 -0
  753. data/spec/unit/knife/data_bag_edit_spec.rb +96 -0
  754. data/spec/unit/knife/data_bag_from_file_spec.rb +198 -0
  755. data/spec/unit/knife/data_bag_show_spec.rb +105 -0
  756. data/spec/unit/knife/environment_create_spec.rb +91 -0
  757. data/spec/unit/knife/environment_delete_spec.rb +71 -0
  758. data/spec/unit/knife/environment_edit_spec.rb +79 -0
  759. data/spec/unit/knife/environment_from_file_spec.rb +89 -0
  760. data/spec/unit/knife/environment_list_spec.rb +54 -0
  761. data/spec/unit/knife/environment_show_spec.rb +52 -0
  762. data/spec/unit/knife/index_rebuild_spec.rb +65 -0
  763. data/spec/unit/knife/knife_help.rb +92 -0
  764. data/spec/unit/knife/node_bulk_delete_spec.rb +97 -0
  765. data/spec/unit/knife/node_delete_spec.rb +68 -0
  766. data/spec/unit/knife/node_edit_spec.rb +88 -0
  767. data/spec/unit/knife/node_from_file_spec.rb +59 -0
  768. data/spec/unit/knife/node_list_spec.rb +63 -0
  769. data/spec/unit/knife/node_run_list_add_spec.rb +125 -0
  770. data/spec/unit/knife/node_run_list_remove_spec.rb +73 -0
  771. data/spec/unit/knife/node_show_spec.rb +48 -0
  772. data/spec/unit/knife/role_bulk_delete_spec.rb +80 -0
  773. data/spec/unit/knife/role_create_spec.rb +80 -0
  774. data/spec/unit/knife/role_delete_spec.rb +67 -0
  775. data/spec/unit/knife/role_edit_spec.rb +79 -0
  776. data/spec/unit/knife/role_from_file_spec.rb +69 -0
  777. data/spec/unit/knife/role_list_spec.rb +56 -0
  778. data/spec/unit/knife/ssh_spec.rb +293 -0
  779. data/spec/unit/knife/status_spec.rb +43 -0
  780. data/spec/unit/knife/tag_create_spec.rb +23 -0
  781. data/spec/unit/knife/tag_delete_spec.rb +25 -0
  782. data/spec/unit/knife/tag_list_spec.rb +23 -0
  783. data/spec/unit/knife_spec.rb +295 -0
  784. data/spec/unit/log_spec.rb +24 -0
  785. data/spec/unit/lwrp_spec.rb +256 -0
  786. data/spec/unit/mash_spec.rb +51 -0
  787. data/spec/unit/mixin/checksum_spec.rb +41 -0
  788. data/spec/unit/mixin/command_spec.rb +105 -0
  789. data/spec/unit/mixin/convert_to_class_name_spec.rb +50 -0
  790. data/spec/unit/mixin/deep_merge_spec.rb +786 -0
  791. data/spec/unit/mixin/deprecation_spec.rb +34 -0
  792. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +90 -0
  793. data/spec/unit/mixin/language_spec.rb +305 -0
  794. data/spec/unit/mixin/params_validate_spec.rb +405 -0
  795. data/spec/unit/mixin/path_sanity_spec.rb +80 -0
  796. data/spec/unit/mixin/securable_spec.rb +254 -0
  797. data/spec/unit/mixin/shell_out_spec.rb +109 -0
  798. data/spec/unit/mixin/template_spec.rb +104 -0
  799. data/spec/unit/mixin/xml_escape_spec.rb +54 -0
  800. data/spec/unit/monkey_patches/string_spec.rb +37 -0
  801. data/spec/unit/node/attribute_spec.rb +1033 -0
  802. data/spec/unit/node_spec.rb +744 -0
  803. data/spec/unit/openid_registration_spec.rb +153 -0
  804. data/spec/unit/platform_spec.rb +241 -0
  805. data/spec/unit/provider/breakpoint_spec.rb +54 -0
  806. data/spec/unit/provider/cookbook_file_spec.rb +218 -0
  807. data/spec/unit/provider/cron/solaris_spec.rb +121 -0
  808. data/spec/unit/provider/cron_spec.rb +812 -0
  809. data/spec/unit/provider/deploy/revision_spec.rb +103 -0
  810. data/spec/unit/provider/deploy/timestamped_spec.rb +40 -0
  811. data/spec/unit/provider/deploy_spec.rb +620 -0
  812. data/spec/unit/provider/directory_spec.rb +156 -0
  813. data/spec/unit/provider/env_spec.rb +232 -0
  814. data/spec/unit/provider/erl_call_spec.rb +86 -0
  815. data/spec/unit/provider/execute_spec.rb +63 -0
  816. data/spec/unit/provider/file_spec.rb +505 -0
  817. data/spec/unit/provider/git_spec.rb +342 -0
  818. data/spec/unit/provider/group/dscl_spec.rb +294 -0
  819. data/spec/unit/provider/group/gpasswd_spec.rb +108 -0
  820. data/spec/unit/provider/group/groupadd_spec.rb +161 -0
  821. data/spec/unit/provider/group/groupmod_spec.rb +134 -0
  822. data/spec/unit/provider/group/pw_spec.rb +140 -0
  823. data/spec/unit/provider/group/usermod_spec.rb +95 -0
  824. data/spec/unit/provider/group/windows_spec.rb +94 -0
  825. data/spec/unit/provider/group_spec.rb +259 -0
  826. data/spec/unit/provider/http_request_spec.rb +178 -0
  827. data/spec/unit/provider/ifconfig_spec.rb +213 -0
  828. data/spec/unit/provider/link_spec.rb +252 -0
  829. data/spec/unit/provider/log_spec.rb +81 -0
  830. data/spec/unit/provider/mdadm_spec.rb +128 -0
  831. data/spec/unit/provider/mount/mount_spec.rb +398 -0
  832. data/spec/unit/provider/mount/windows_spec.rb +134 -0
  833. data/spec/unit/provider/mount_spec.rb +160 -0
  834. data/spec/unit/provider/ohai_spec.rb +85 -0
  835. data/spec/unit/provider/package/apt_spec.rb +352 -0
  836. data/spec/unit/provider/package/dpkg_spec.rb +216 -0
  837. data/spec/unit/provider/package/easy_install_spec.rb +112 -0
  838. data/spec/unit/provider/package/freebsd_spec.rb +259 -0
  839. data/spec/unit/provider/package/ips_spec.rb +210 -0
  840. data/spec/unit/provider/package/macports_spec.rb +203 -0
  841. data/spec/unit/provider/package/pacman_spec.rb +206 -0
  842. data/spec/unit/provider/package/portage_spec.rb +320 -0
  843. data/spec/unit/provider/package/rpm_spec.rb +152 -0
  844. data/spec/unit/provider/package/rubygems_spec.rb +639 -0
  845. data/spec/unit/provider/package/smartos_spec.rb +83 -0
  846. data/spec/unit/provider/package/solaris_spec.rb +181 -0
  847. data/spec/unit/provider/package/yum_spec.rb +1856 -0
  848. data/spec/unit/provider/package/zypper_spec.rb +159 -0
  849. data/spec/unit/provider/package_spec.rb +427 -0
  850. data/spec/unit/provider/remote_directory_spec.rb +222 -0
  851. data/spec/unit/provider/remote_file_spec.rb +288 -0
  852. data/spec/unit/provider/route_spec.rb +226 -0
  853. data/spec/unit/provider/ruby_block_spec.rb +38 -0
  854. data/spec/unit/provider/script_spec.rb +96 -0
  855. data/spec/unit/provider/service/arch_service_spec.rb +330 -0
  856. data/spec/unit/provider/service/debian_service_spec.rb +254 -0
  857. data/spec/unit/provider/service/freebsd_service_spec.rb +379 -0
  858. data/spec/unit/provider/service/gentoo_service_spec.rb +144 -0
  859. data/spec/unit/provider/service/init_service_spec.rb +212 -0
  860. data/spec/unit/provider/service/insserv_service_spec.rb +76 -0
  861. data/spec/unit/provider/service/invokercd_service_spec.rb +212 -0
  862. data/spec/unit/provider/service/macosx_spec.rb +229 -0
  863. data/spec/unit/provider/service/redhat_spec.rb +156 -0
  864. data/spec/unit/provider/service/simple_service_spec.rb +171 -0
  865. data/spec/unit/provider/service/solaris_smf_service_spec.rb +140 -0
  866. data/spec/unit/provider/service/systemd_service_spec.rb +239 -0
  867. data/spec/unit/provider/service/upstart_service_spec.rb +314 -0
  868. data/spec/unit/provider/service/windows_spec.rb +235 -0
  869. data/spec/unit/provider/service_spec.rb +169 -0
  870. data/spec/unit/provider/subversion_spec.rb +281 -0
  871. data/spec/unit/provider/template_spec.rb +196 -0
  872. data/spec/unit/provider/user/dscl_spec.rb +454 -0
  873. data/spec/unit/provider/user/pw_spec.rb +235 -0
  874. data/spec/unit/provider/user/solaris_spec.rb +414 -0
  875. data/spec/unit/provider/user/useradd_spec.rb +386 -0
  876. data/spec/unit/provider/user/windows_spec.rb +178 -0
  877. data/spec/unit/provider/user_spec.rb +468 -0
  878. data/spec/unit/provider_spec.rb +169 -0
  879. data/spec/unit/recipe_spec.rb +268 -0
  880. data/spec/unit/resource/apt_package_spec.rb +43 -0
  881. data/spec/unit/resource/bash_spec.rb +40 -0
  882. data/spec/unit/resource/breakpoint_spec.rb +43 -0
  883. data/spec/unit/resource/chef_gem_spec.rb +49 -0
  884. data/spec/unit/resource/conditional_spec.rb +147 -0
  885. data/spec/unit/resource/cookbook_file_spec.rb +89 -0
  886. data/spec/unit/resource/cron_spec.rb +181 -0
  887. data/spec/unit/resource/csh_spec.rb +40 -0
  888. data/spec/unit/resource/deploy_revision_spec.rb +47 -0
  889. data/spec/unit/resource/deploy_spec.rb +259 -0
  890. data/spec/unit/resource/directory_spec.rb +82 -0
  891. data/spec/unit/resource/dpkg_package_spec.rb +38 -0
  892. data/spec/unit/resource/easy_install_package_spec.rb +48 -0
  893. data/spec/unit/resource/env_spec.rb +85 -0
  894. data/spec/unit/resource/erl_call_spec.rb +81 -0
  895. data/spec/unit/resource/execute_spec.rb +124 -0
  896. data/spec/unit/resource/file_spec.rb +121 -0
  897. data/spec/unit/resource/freebsd_package_spec.rb +39 -0
  898. data/spec/unit/resource/gem_package_spec.rb +49 -0
  899. data/spec/unit/resource/git_spec.rb +46 -0
  900. data/spec/unit/resource/group_spec.rb +148 -0
  901. data/spec/unit/resource/http_request_spec.rb +59 -0
  902. data/spec/unit/resource/ifconfig_spec.rb +46 -0
  903. data/spec/unit/resource/ips_package_spec.rb +43 -0
  904. data/spec/unit/resource/link_spec.rb +118 -0
  905. data/spec/unit/resource/log_spec.rb +70 -0
  906. data/spec/unit/resource/macports_package_spec.rb +37 -0
  907. data/spec/unit/resource/mdadm_spec.rb +102 -0
  908. data/spec/unit/resource/mount_spec.rb +158 -0
  909. data/spec/unit/resource/ohai_spec.rb +62 -0
  910. data/spec/unit/resource/package_spec.rb +80 -0
  911. data/spec/unit/resource/pacman_package_spec.rb +38 -0
  912. data/spec/unit/resource/perl_spec.rb +40 -0
  913. data/spec/unit/resource/portage_package_spec.rb +38 -0
  914. data/spec/unit/resource/python_spec.rb +40 -0
  915. data/spec/unit/resource/remote_directory_spec.rb +97 -0
  916. data/spec/unit/resource/remote_file_spec.rb +125 -0
  917. data/spec/unit/resource/route_spec.rb +107 -0
  918. data/spec/unit/resource/rpm_package_spec.rb +38 -0
  919. data/spec/unit/resource/ruby_block_spec.rb +57 -0
  920. data/spec/unit/resource/ruby_spec.rb +40 -0
  921. data/spec/unit/resource/scm_spec.rb +159 -0
  922. data/spec/unit/resource/script_spec.rb +69 -0
  923. data/spec/unit/resource/service_spec.rb +165 -0
  924. data/spec/unit/resource/smartos_package_spec.rb +38 -0
  925. data/spec/unit/resource/subversion_spec.rb +58 -0
  926. data/spec/unit/resource/template_spec.rb +108 -0
  927. data/spec/unit/resource/timestamped_deploy_spec.rb +28 -0
  928. data/spec/unit/resource/user_spec.rb +122 -0
  929. data/spec/unit/resource/yum_package_spec.rb +85 -0
  930. data/spec/unit/resource_collection/stepable_iterator_spec.rb +144 -0
  931. data/spec/unit/resource_collection_spec.rb +257 -0
  932. data/spec/unit/resource_definition_spec.rb +119 -0
  933. data/spec/unit/resource_platform_map_spec.rb +164 -0
  934. data/spec/unit/resource_reporter_spec.rb +591 -0
  935. data/spec/unit/resource_spec.rb +721 -0
  936. data/spec/unit/rest/auth_credentials_spec.rb +431 -0
  937. data/spec/unit/rest_spec.rb +644 -0
  938. data/spec/unit/role_spec.rb +275 -0
  939. data/spec/unit/run_context_spec.rb +64 -0
  940. data/spec/unit/run_list/run_list_expansion_spec.rb +129 -0
  941. data/spec/unit/run_list/run_list_item_spec.rb +117 -0
  942. data/spec/unit/run_list/versioned_recipe_list_spec.rb +123 -0
  943. data/spec/unit/run_list_spec.rb +521 -0
  944. data/spec/unit/run_status_spec.rb +145 -0
  945. data/spec/unit/runner_spec.rb +303 -0
  946. data/spec/unit/scan_access_control_spec.rb +182 -0
  947. data/spec/unit/search/query_spec.rb +99 -0
  948. data/spec/unit/shef/model_wrapper_spec.rb +97 -0
  949. data/spec/unit/shef/shef_ext_spec.rb +153 -0
  950. data/spec/unit/shef/shef_session_spec.rb +154 -0
  951. data/spec/unit/shef_spec.rb +161 -0
  952. data/spec/unit/solr_query/query_transform_spec.rb +454 -0
  953. data/spec/unit/solr_query/solr_http_request_spec.rb +244 -0
  954. data/spec/unit/solr_query_spec.rb +203 -0
  955. data/spec/unit/util/file_edit_spec.rb +135 -0
  956. data/spec/unit/version_class_spec.rb +172 -0
  957. data/spec/unit/version_constraint_spec.rb +134 -0
  958. data/spec/unit/webui_user_spec.rb +238 -0
  959. data/tasks/rspec.rb +75 -0
  960. metadata +1548 -0
@@ -0,0 +1,9 @@
1
+ class Chef
2
+
3
+ # This module exists to hide conflicting constant names from the DSL.
4
+ # Hopefully we'll have a better/prettier/more sustainable solution in the
5
+ # future, but for now this will fix a regression introduced in Chef 0.10.10
6
+ # (conflict with the Win32 namespace)
7
+ module ReservedNames
8
+ end
9
+ end
@@ -0,0 +1,912 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'chef/mixin/params_validate'
21
+ require 'chef/mixin/check_helper'
22
+ require 'chef/mixin/language'
23
+ require 'chef/mixin/convert_to_class_name'
24
+ require 'chef/resource/conditional'
25
+ require 'chef/resource_collection'
26
+ require 'chef/resource_platform_map'
27
+ require 'chef/node'
28
+
29
+ require 'chef/mixin/deprecation'
30
+
31
+ class Chef
32
+ class Resource
33
+ class Notification < Struct.new(:resource, :action, :notifying_resource)
34
+
35
+ def duplicates?(other_notification)
36
+ unless other_notification.respond_to?(:resource) && other_notification.respond_to?(:action)
37
+ msg = "only duck-types of Chef::Resource::Notification can be checked for duplication "\
38
+ "you gave #{other_notification.inspect}"
39
+ raise ArgumentError, msg
40
+ end
41
+ other_notification.resource == resource && other_notification.action == action
42
+ end
43
+
44
+ # If resource and/or notifying_resource is not a resource object, this will look them up in the resource collection
45
+ # and fix the references from strings to actual Resource objects.
46
+ def resolve_resource_reference(resource_collection)
47
+ return resource if resource.kind_of?(Chef::Resource) && notifying_resource.kind_of?(Chef::Resource)
48
+
49
+ if not(resource.kind_of?(Chef::Resource))
50
+ fix_resource_reference(resource_collection)
51
+ end
52
+
53
+ if not(notifying_resource.kind_of?(Chef::Resource))
54
+ fix_notifier_reference(resource_collection)
55
+ end
56
+ end
57
+
58
+ # This will look up the resource if it is not a Resource Object. It will complain if it finds multiple
59
+ # resources, can't find a resource, or gets invalid syntax.
60
+ def fix_resource_reference(resource_collection)
61
+ matching_resource = resource_collection.find(resource)
62
+ if Array(matching_resource).size > 1
63
+ msg = "Notification #{self} from #{notifying_resource} was created with a reference to multiple resources, "\
64
+ "but can only notify one resource. Notifying resource was defined on #{notifying_resource.source_line}"
65
+ raise Chef::Exceptions::InvalidResourceReference, msg
66
+ end
67
+ self.resource = matching_resource
68
+
69
+ rescue Chef::Exceptions::ResourceNotFound => e
70
+ err = Chef::Exceptions::ResourceNotFound.new(<<-FAIL)
71
+ resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
72
+ but #{resource} cannot be found in the resource collection. #{notifying_resource} is defined in \
73
+ #{notifying_resource.source_line}
74
+ FAIL
75
+ err.set_backtrace(e.backtrace)
76
+ raise err
77
+ rescue Chef::Exceptions::InvalidResourceSpecification => e
78
+ err = Chef::Exceptions::InvalidResourceSpecification.new(<<-F)
79
+ Resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
80
+ but #{resource.inspect} is not valid syntax to look up a resource in the resource collection. Notification \
81
+ is defined near #{notifying_resource.source_line}
82
+ F
83
+ err.set_backtrace(e.backtrace)
84
+ raise err
85
+ end
86
+
87
+ # This will look up the notifying_resource if it is not a Resource Object. It will complain if it finds multiple
88
+ # resources, can't find a resource, or gets invalid syntax.
89
+ def fix_notifier_reference(resource_collection)
90
+ matching_notifier = resource_collection.find(notifying_resource)
91
+ if Array(matching_notifier).size > 1
92
+ msg = "Notification #{self} from #{notifying_resource} was created with a reference to multiple notifying "\
93
+ "resources, but can only originate from one resource. Destination resource was defined "\
94
+ "on #{resource.source_line}"
95
+ raise Chef::Exceptions::InvalidResourceReference, msg
96
+ end
97
+ self.notifying_resource = matching_notifier
98
+
99
+ rescue Chef::Exceptions::ResourceNotFound => e
100
+ err = Chef::Exceptions::ResourceNotFound.new(<<-FAIL)
101
+ Resource #{resource} is configured to receive notifications from #{notifying_resource} with action #{action}, \
102
+ but #{notifying_resource} cannot be found in the resource collection. #{resource} is defined in \
103
+ #{resource.source_line}
104
+ FAIL
105
+ err.set_backtrace(e.backtrace)
106
+ raise err
107
+ rescue Chef::Exceptions::InvalidResourceSpecification => e
108
+ err = Chef::Exceptions::InvalidResourceSpecification.new(<<-F)
109
+ Resource #{resource} is configured to receive notifications from #{notifying_resource} with action #{action}, \
110
+ but #{notifying_resource.inspect} is not valid syntax to look up a resource in the resource collection. Notification \
111
+ is defined near #{resource.source_line}
112
+ F
113
+ err.set_backtrace(e.backtrace)
114
+ raise err
115
+ end
116
+
117
+ end
118
+
119
+ FORBIDDEN_IVARS = [:@run_context, :@node, :@not_if, :@only_if, :@enclosing_provider]
120
+ HIDDEN_IVARS = [:@allowed_actions, :@resource_name, :@source_line, :@run_context, :@name, :@node, :@not_if, :@only_if, :@elapsed_time, :@enclosing_provider]
121
+
122
+ # Track all subclasses of Resource. This is used so names can be looked up
123
+ # when attempting to deserialize from JSON. (See: json_compat)
124
+ def self.resource_classes
125
+ # Using a class variable here ensures we have one variable to track
126
+ # subclasses shared by the entire class hierarchy; without this, each
127
+ # subclass would have its own list of subclasses.
128
+ @@resource_classes ||= []
129
+ end
130
+
131
+ # Callback when subclass is defined. Adds subclass to list of subclasses.
132
+ def self.inherited(subclass)
133
+ resource_classes << subclass
134
+ end
135
+
136
+ # Look up a subclass by +class_name+ which should be a string that matches
137
+ # `Subclass.name`
138
+ def self.find_subclass_by_name(class_name)
139
+ resource_classes.first {|c| c.name == class_name }
140
+ end
141
+
142
+
143
+ include Chef::Mixin::CheckHelper
144
+ include Chef::Mixin::ParamsValidate
145
+ include Chef::Mixin::Language
146
+ include Chef::Mixin::ConvertToClassName
147
+ include Chef::Mixin::Deprecation
148
+
149
+ if Module.method(:const_defined?).arity == 1
150
+ def self.strict_const_defined?(const)
151
+ const_defined?(const)
152
+ end
153
+ else
154
+ def self.strict_const_defined?(const)
155
+ const_defined?(const, false)
156
+ end
157
+ end
158
+
159
+ # Set or return the list of "state attributes" implemented by the Resource
160
+ # subclass. State attributes are attributes that describe the desired state
161
+ # of the system, such as file permissions or ownership. In general, state
162
+ # attributes are attributes that could be populated by examining the state
163
+ # of the system (e.g., File.stat can tell you the permissions on an
164
+ # existing file). Contrarily, attributes that are not "state attributes"
165
+ # usually modify the way Chef itself behaves, for example by providing
166
+ # additional options for a package manager to use when installing a
167
+ # package.
168
+ #
169
+ # This list is used by the Chef client auditing system to extract
170
+ # information from resources to describe changes made to the system.
171
+ def self.state_attrs(*attr_names)
172
+ @state_attrs ||= []
173
+ @state_attrs = attr_names unless attr_names.empty?
174
+
175
+ # Return *all* state_attrs that this class has, including inherited ones
176
+ if superclass.respond_to?(:state_attrs)
177
+ superclass.state_attrs + @state_attrs
178
+ else
179
+ @state_attrs
180
+ end
181
+ end
182
+
183
+ # Set or return the "identity attribute" for this resource class. This is
184
+ # generally going to be the "name attribute" for this resource. In other
185
+ # words, the resource type plus this attribute uniquely identify a given
186
+ # bit of state that chef manages. For a File resource, this would be the
187
+ # path, for a package resource, it will be the package name. This will show
188
+ # up in chef-client's audit records as a searchable field.
189
+ def self.identity_attr(attr_name=nil)
190
+ @identity_attr ||= nil
191
+ @identity_attr = attr_name if attr_name
192
+
193
+ # If this class doesn't have an identity attr, we'll defer to the superclass:
194
+ if @identity_attr || !superclass.respond_to?(:identity_attr)
195
+ @identity_attr
196
+ else
197
+ superclass.identity_attr
198
+ end
199
+ end
200
+
201
+ def self.dsl_name
202
+ convert_to_snake_case(name, 'Chef::Resource')
203
+ end
204
+
205
+ attr_accessor :params
206
+ attr_accessor :provider
207
+ attr_accessor :allowed_actions
208
+ attr_accessor :run_context
209
+ attr_accessor :cookbook_name
210
+ attr_accessor :recipe_name
211
+ attr_accessor :enclosing_provider
212
+ attr_accessor :source_line
213
+ attr_accessor :retries
214
+ attr_accessor :retry_delay
215
+
216
+ attr_reader :updated
217
+
218
+ attr_reader :resource_name
219
+ attr_reader :not_if_args
220
+ attr_reader :only_if_args
221
+
222
+ attr_reader :elapsed_time
223
+
224
+ # Each notify entry is a resource/action pair, modeled as an
225
+ # Struct with a #resource and #action member
226
+
227
+ def initialize(name, run_context=nil)
228
+ @name = name
229
+ @run_context = run_context
230
+ @noop = nil
231
+ @before = nil
232
+ @params = Hash.new
233
+ @provider = nil
234
+ @allowed_actions = [ :nothing ]
235
+ @action = :nothing
236
+ @updated = false
237
+ @updated_by_last_action = false
238
+ @supports = {}
239
+ @ignore_failure = false
240
+ @retries = 0
241
+ @retry_delay = 2
242
+ @not_if = []
243
+ @only_if = []
244
+ @source_line = nil
245
+ @elapsed_time = 0
246
+
247
+ @node = run_context ? deprecated_ivar(run_context.node, :node, :warn) : nil
248
+ end
249
+
250
+ # Returns a Hash of attribute => value for the state attributes declared in
251
+ # the resource's class definition.
252
+ def state
253
+ self.class.state_attrs.inject({}) do |state_attrs, attr_name|
254
+ state_attrs[attr_name] = send(attr_name)
255
+ state_attrs
256
+ end
257
+ end
258
+
259
+ # Returns the value of the identity attribute, if declared. Falls back to
260
+ # #name if no identity attribute is declared.
261
+ def identity
262
+ if identity_attr = self.class.identity_attr
263
+ send(identity_attr)
264
+ else
265
+ name
266
+ end
267
+ end
268
+
269
+
270
+ def updated=(true_or_false)
271
+ Chef::Log.warn("Chef::Resource#updated=(true|false) is deprecated. Please call #updated_by_last_action(true|false) instead.")
272
+ Chef::Log.warn("Called from:")
273
+ caller[0..3].each {|line| Chef::Log.warn(line)}
274
+ updated_by_last_action(true_or_false)
275
+ @updated = true_or_false
276
+ end
277
+
278
+ def node
279
+ run_context && run_context.node
280
+ end
281
+
282
+ # If an unknown method is invoked, determine whether the enclosing Provider's
283
+ # lexical scope can fulfill the request. E.g. This happens when the Resource's
284
+ # block invokes new_resource.
285
+ def method_missing(method_symbol, *args, &block)
286
+ if enclosing_provider && enclosing_provider.respond_to?(method_symbol)
287
+ enclosing_provider.send(method_symbol, *args, &block)
288
+ else
289
+ raise NoMethodError, "undefined method `#{method_symbol.to_s}' for #{self.class.to_s}"
290
+ end
291
+ end
292
+
293
+ def load_prior_resource
294
+ begin
295
+ prior_resource = run_context.resource_collection.lookup(self.to_s)
296
+ # if we get here, there is a prior resource (otherwise we'd have jumped
297
+ # to the rescue clause).
298
+ Chef::Log.warn("Cloning resource attributes for #{self.to_s} from prior resource (CHEF-3694)")
299
+ Chef::Log.warn("Previous #{prior_resource}: #{prior_resource.source_line}") if prior_resource.source_line
300
+ Chef::Log.warn("Current #{self}: #{self.source_line}") if self.source_line
301
+ prior_resource.instance_variables.each do |iv|
302
+ unless iv.to_sym == :@source_line || iv.to_sym == :@action || iv.to_sym == :@not_if || iv.to_sym == :@only_if
303
+ self.instance_variable_set(iv, prior_resource.instance_variable_get(iv))
304
+ end
305
+ end
306
+ true
307
+ rescue Chef::Exceptions::ResourceNotFound => e
308
+ true
309
+ end
310
+ end
311
+
312
+ def supports(args={})
313
+ if args.any?
314
+ @supports = args
315
+ else
316
+ @supports
317
+ end
318
+ end
319
+
320
+ def provider(arg=nil)
321
+ klass = if arg.kind_of?(String) || arg.kind_of?(Symbol)
322
+ lookup_provider_constant(arg)
323
+ else
324
+ arg
325
+ end
326
+ set_or_return(
327
+ :provider,
328
+ klass,
329
+ :kind_of => [ Class ]
330
+ )
331
+ end
332
+
333
+ def action(arg=nil)
334
+ if arg
335
+ action_list = arg.kind_of?(Array) ? arg : [ arg ]
336
+ action_list = action_list.collect { |a| a.to_sym }
337
+ action_list.each do |action|
338
+ validate(
339
+ {
340
+ :action => action,
341
+ },
342
+ {
343
+ :action => { :kind_of => Symbol, :equal_to => @allowed_actions },
344
+ }
345
+ )
346
+ end
347
+ @action = action_list
348
+ else
349
+ @action
350
+ end
351
+ end
352
+
353
+ def name(name=nil)
354
+ set_if_args(@name, name) do
355
+ raise ArgumentError, "name must be a string!" unless name.kind_of?(String)
356
+ @name = name
357
+ end
358
+ end
359
+
360
+ def noop(tf=nil)
361
+ set_if_args(@noop, tf) do
362
+ raise ArgumentError, "noop must be true or false!" unless tf == true || tf == false
363
+ @noop = tf
364
+ end
365
+ end
366
+
367
+ def ignore_failure(arg=nil)
368
+ set_or_return(
369
+ :ignore_failure,
370
+ arg,
371
+ :kind_of => [ TrueClass, FalseClass ]
372
+ )
373
+ end
374
+
375
+ def retries(arg=nil)
376
+ set_or_return(
377
+ :retries,
378
+ arg,
379
+ :kind_of => Integer
380
+ )
381
+ end
382
+
383
+ def retry_delay(arg=nil)
384
+ set_or_return(
385
+ :retry_delay,
386
+ arg,
387
+ :kind_of => Integer
388
+ )
389
+ end
390
+
391
+ def epic_fail(arg=nil)
392
+ ignore_failure(arg)
393
+ end
394
+
395
+ def notifies(*args)
396
+ unless ( args.size > 0 && args.size < 4)
397
+ raise ArgumentError, "Wrong number of arguments for notifies: should be 1-3 arguments, you gave #{args.inspect}"
398
+ end
399
+
400
+ if args.size > 1 # notifies(:action, resource) OR notifies(:action, resource, :immediately)
401
+ add_notification(*args)
402
+ else
403
+ # This syntax is so weird. surely people will just give us one hash?
404
+ notifications = args.flatten
405
+ notifications.each do |resources_notifications|
406
+ resources_notifications.each do |resource, notification|
407
+ action, timing = notification[0], notification[1]
408
+ Chef::Log.debug "Adding notification from resource #{self} to `#{resource.inspect}' => `#{notification.inspect}'"
409
+ add_notification(action, resource, timing)
410
+ end
411
+ end
412
+ end
413
+ rescue NoMethodError
414
+ Chef::Log.fatal("Error processing notifies(#{args.inspect}) on #{self}")
415
+ raise
416
+ end
417
+
418
+ def add_notification(action, resources, timing=:delayed)
419
+ resources = [resources].flatten
420
+ resources.each do |resource|
421
+ case timing.to_s
422
+ when 'delayed'
423
+ notifies_delayed(action, resource)
424
+ when 'immediate', 'immediately'
425
+ notifies_immediately(action, resource)
426
+ else
427
+ raise ArgumentError, "invalid timing: #{timing} for notifies(#{action}, #{resources.inspect}, #{timing}) resource #{self} "\
428
+ "Valid timings are: :delayed, :immediate, :immediately"
429
+ end
430
+ end
431
+
432
+ true
433
+ end
434
+
435
+ # Iterates over all immediate and delayed notifications, calling
436
+ # resolve_resource_reference on each in turn, causing them to
437
+ # resolve lazy/forward references.
438
+ def resolve_notification_references
439
+ run_context.immediate_notifications(self).each { |n| n.resolve_resource_reference(run_context.resource_collection) }
440
+ run_context.delayed_notifications(self).each {|n| n.resolve_resource_reference(run_context.resource_collection) }
441
+ end
442
+
443
+ def notifies_immediately(action, resource_spec)
444
+ run_context.notifies_immediately(Notification.new(resource_spec, action, self))
445
+ end
446
+
447
+ def notifies_delayed(action, resource_spec)
448
+ run_context.notifies_delayed(Notification.new(resource_spec, action, self))
449
+ end
450
+
451
+ def immediate_notifications
452
+ run_context.immediate_notifications(self)
453
+ end
454
+
455
+ def delayed_notifications
456
+ run_context.delayed_notifications(self)
457
+ end
458
+
459
+ def resources(*args)
460
+ run_context.resource_collection.find(*args)
461
+ end
462
+
463
+ def subscribes(action, resources, timing=:delayed)
464
+ resources = [resources].flatten
465
+ resources.each do |resource|
466
+ if resource.is_a?(String)
467
+ resource = Chef::Resource.new(resource, run_context)
468
+ end
469
+ if resource.run_context.nil?
470
+ resource.run_context = run_context
471
+ end
472
+ resource.add_notification(action, self, timing)
473
+ end
474
+ true
475
+ end
476
+
477
+ def is(*args)
478
+ if args.size == 1
479
+ args.first
480
+ else
481
+ return *args
482
+ end
483
+ end
484
+
485
+ def to_s
486
+ "#{@resource_name}[#{@name}]"
487
+ end
488
+
489
+ def to_text
490
+ ivars = instance_variables.map { |ivar| ivar.to_sym } - HIDDEN_IVARS
491
+ text = "# Declared in #{@source_line}\n\n"
492
+ text << self.class.dsl_name + "(\"#{name}\") do\n"
493
+ ivars.each do |ivar|
494
+ if (value = instance_variable_get(ivar)) && !(value.respond_to?(:empty?) && value.empty?)
495
+ value_string = value.respond_to?(:to_text) ? value.to_text : value.inspect
496
+ text << " #{ivar.to_s.sub(/^@/,'')} #{value_string}\n"
497
+ end
498
+ end
499
+ [@not_if, @only_if].flatten.each do |conditional|
500
+ text << " #{conditional.to_text}\n"
501
+ end
502
+ text << "end\n"
503
+ end
504
+
505
+ def inspect
506
+ ivars = instance_variables.map { |ivar| ivar.to_sym } - FORBIDDEN_IVARS
507
+ ivars.inject("<#{to_s}") do |str, ivar|
508
+ str << " #{ivar}: #{instance_variable_get(ivar).inspect}"
509
+ end << ">"
510
+ end
511
+
512
+ # as_json does most of the to_json heavy lifted. It exists here in case activesupport
513
+ # is loaded. activesupport will call as_json and skip over to_json. This ensure
514
+ # json is encoded as expected
515
+ def as_json(*a)
516
+ safe_ivars = instance_variables.map { |ivar| ivar.to_sym } - FORBIDDEN_IVARS
517
+ instance_vars = Hash.new
518
+ safe_ivars.each do |iv|
519
+ instance_vars[iv.to_s.sub(/^@/, '')] = instance_variable_get(iv)
520
+ end
521
+ results = {
522
+ 'json_class' => self.class.name,
523
+ 'instance_vars' => instance_vars
524
+ }
525
+ end
526
+
527
+ # Serialize this object as a hash
528
+ def to_json(*a)
529
+ results = as_json
530
+ results.to_json(*a)
531
+ end
532
+
533
+ def to_hash
534
+ safe_ivars = instance_variables.map { |ivar| ivar.to_sym } - FORBIDDEN_IVARS
535
+ instance_vars = Hash.new
536
+ safe_ivars.each do |iv|
537
+ key = iv.to_s.sub(/^@/,'').to_sym
538
+ instance_vars[key] = instance_variable_get(iv)
539
+ end
540
+ instance_vars
541
+ end
542
+
543
+ # If command is a block, returns true if the block returns true, false if it returns false.
544
+ # ("Only run this resource if the block is true")
545
+ #
546
+ # If the command is not a block, executes the command. If it returns any status other than
547
+ # 0, it returns false (clearly, a 0 status code is true)
548
+ #
549
+ # === Parameters
550
+ # command<String>:: A a string to execute.
551
+ # opts<Hash>:: Options control the execution of the command
552
+ # block<Proc>:: A ruby block to run. Ignored if a command is given.
553
+ #
554
+ # === Evaluation
555
+ # * evaluates to true if the block is true, or if the command returns 0
556
+ # * evaluates to false if the block is false, or if the command returns a non-zero exit code.
557
+ def only_if(command=nil, opts={}, &block)
558
+ if command || block_given?
559
+ @only_if << Conditional.only_if(command, opts, &block)
560
+ end
561
+ @only_if
562
+ end
563
+
564
+ # If command is a block, returns false if the block returns true, true if it returns false.
565
+ # ("Do not run this resource if the block is true")
566
+ #
567
+ # If the command is not a block, executes the command. If it returns a 0 exitstatus, returns false.
568
+ # ("Do not run this resource if the command returns 0")
569
+ #
570
+ # === Parameters
571
+ # command<String>:: A a string to execute.
572
+ # opts<Hash>:: Options control the execution of the command
573
+ # block<Proc>:: A ruby block to run. Ignored if a command is given.
574
+ #
575
+ # === Evaluation
576
+ # * evaluates to true if the block is false, or if the command returns a non-zero exit status.
577
+ # * evaluates to false if the block is true, or if the command returns a 0 exit status.
578
+ def not_if(command=nil, opts={}, &block)
579
+ if command || block_given?
580
+ @not_if << Conditional.not_if(command, opts, &block)
581
+ end
582
+ @not_if
583
+ end
584
+
585
+ def defined_at
586
+ if cookbook_name && recipe_name && source_line
587
+ "#{cookbook_name}::#{recipe_name} line #{source_line.split(':')[1]}"
588
+ elsif source_line
589
+ file, line_no = source_line.split(':')
590
+ "#{file} line #{line_no}"
591
+ else
592
+ "dynamically defined"
593
+ end
594
+ end
595
+
596
+ def cookbook_version
597
+ if cookbook_name
598
+ run_context.cookbook_collection[cookbook_name]
599
+ end
600
+ end
601
+
602
+ def events
603
+ run_context.events
604
+ end
605
+
606
+ def run_action(action, notification_type=nil, notifying_resource=nil)
607
+ # reset state in case of multiple actions on the same resource.
608
+ @elapsed_time = 0
609
+ start_time = Time.now
610
+ events.resource_action_start(self, action, notification_type, notifying_resource)
611
+ # Try to resolve lazy/forward references in notifications again to handle
612
+ # the case where the resource was defined lazily (ie. in a ruby_block)
613
+ resolve_notification_references
614
+ validate_action(action)
615
+
616
+ if Chef::Config[:verbose_logging] || Chef::Log.level == :debug
617
+ # This can be noisy
618
+ Chef::Log.info("Processing #{self} action #{action} (#{defined_at})")
619
+ end
620
+
621
+ # ensure that we don't leave @updated_by_last_action set to true
622
+ # on accident
623
+ updated_by_last_action(false)
624
+
625
+ begin
626
+ return if should_skip?(action)
627
+ provider_for_action(action).run_action
628
+ rescue Exception => e
629
+ if ignore_failure
630
+ Chef::Log.error("#{self} (#{defined_at}) had an error: #{e.message}; ignore_failure is set, continuing")
631
+ events.resource_failed(self, action, e)
632
+ elsif retries > 0
633
+ events.resource_failed_retriable(self, action, retries, e)
634
+ @retries -= 1
635
+ Chef::Log.info("Retrying execution of #{self}, #{retries} attempt(s) left")
636
+ sleep retry_delay
637
+ retry
638
+ else
639
+ events.resource_failed(self, action, e)
640
+ raise customize_exception(e)
641
+ end
642
+ ensure
643
+ @elapsed_time = Time.now - start_time
644
+ events.resource_completed(self)
645
+ end
646
+ end
647
+
648
+ def validate_action(action)
649
+ raise ArgumentError, "nil is not a valid action for resource #{self}" if action.nil?
650
+ end
651
+
652
+ def provider_for_action(action)
653
+ # leverage new platform => short_name => resource
654
+ # which requires explicitly setting provider in
655
+ # resource class
656
+ if self.provider
657
+ provider = self.provider.new(self, self.run_context)
658
+ provider.action = action
659
+ provider
660
+ else # fall back to old provider resolution
661
+ Chef::Platform.provider_for_resource(self, action)
662
+ end
663
+ end
664
+
665
+ def customize_exception(e)
666
+ new_exception = e.exception("#{self} (#{defined_at}) had an error: #{e.class.name}: #{e.message}")
667
+ new_exception.set_backtrace(e.backtrace)
668
+ new_exception
669
+ end
670
+ # Evaluates not_if and only_if conditionals. Returns a falsey value if any
671
+ # of the conditionals indicate that this resource should be skipped, i.e.,
672
+ # if an only_if evaluates to false or a not_if evaluates to true.
673
+ #
674
+ # If this resource should be skipped, returns the first conditional that
675
+ # "fails" its check. Subsequent conditionals are not evaluated, so in
676
+ # general it's not a good idea to rely on side effects from not_if or
677
+ # only_if commands/blocks being evaluated.
678
+ def should_skip?(action)
679
+ conditionals = only_if + not_if
680
+ return false if conditionals.empty?
681
+
682
+ conditionals.find do |conditional|
683
+ if conditional.continue?
684
+ false
685
+ else
686
+ events.resource_skipped(self, action, conditional)
687
+ Chef::Log.debug("Skipping #{self} due to #{conditional.description}")
688
+ true
689
+ end
690
+ end
691
+ end
692
+
693
+ def updated_by_last_action(true_or_false)
694
+ @updated ||= true_or_false
695
+ @updated_by_last_action = true_or_false
696
+ end
697
+
698
+ def updated_by_last_action?
699
+ @updated_by_last_action
700
+ end
701
+
702
+ def updated?
703
+ updated
704
+ end
705
+
706
+ def self.json_create(o)
707
+ resource = self.new(o["instance_vars"]["@name"])
708
+ o["instance_vars"].each do |k,v|
709
+ resource.instance_variable_set("@#{k}".to_sym, v)
710
+ end
711
+ resource
712
+ end
713
+
714
+ # Hook to allow a resource to run specific code after creation
715
+ def after_created
716
+ nil
717
+ end
718
+
719
+ extend Chef::Mixin::ConvertToClassName
720
+
721
+ def self.attribute(attr_name, validation_opts={})
722
+ # This atrocity is the only way to support 1.8 and 1.9 at the same time
723
+ # When you're ready to drop 1.8 support, do this:
724
+ # define_method attr_name.to_sym do |arg=nil|
725
+ # etc.
726
+ shim_method=<<-SHIM
727
+ def #{attr_name}(arg=nil)
728
+ _set_or_return_#{attr_name}(arg)
729
+ end
730
+ SHIM
731
+ class_eval(shim_method)
732
+
733
+ define_method("_set_or_return_#{attr_name.to_s}".to_sym) do |arg|
734
+ set_or_return(attr_name.to_sym, arg, validation_opts)
735
+ end
736
+ end
737
+
738
+ def self.build_from_file(cookbook_name, filename, run_context)
739
+ rname = filename_to_qualified_string(cookbook_name, filename)
740
+
741
+ # Add log entry if we override an existing light-weight resource.
742
+ class_name = convert_to_class_name(rname)
743
+ if Chef::Resource.strict_const_defined?(class_name)
744
+ Chef::Log.info("#{class_name} light-weight resource already initialized -- overriding!")
745
+ old_class = Chef::Resource.send(:remove_const, class_name)
746
+ Chef::Resource.resource_classes.delete(old_class)
747
+ end
748
+
749
+ new_resource_class = Class.new self do |cls|
750
+
751
+ # default initialize method that ensures that when initialize is finally
752
+ # wrapped (see below), super is called in the event that the resource
753
+ # definer does not implement initialize
754
+ def initialize(name, run_context)
755
+ super(name, run_context)
756
+ end
757
+
758
+ @actions_to_create = []
759
+
760
+ class << cls
761
+ include Chef::Mixin::FromFile
762
+
763
+ attr_accessor :run_context
764
+ attr_reader :action_to_set_default
765
+
766
+ def node
767
+ self.run_context.node
768
+ end
769
+
770
+ def actions_to_create
771
+ @actions_to_create
772
+ end
773
+
774
+ define_method(:default_action) do |action_name|
775
+ actions_to_create.push(action_name)
776
+ @action_to_set_default = action_name
777
+ end
778
+
779
+ define_method(:actions) do |*action_names|
780
+ actions_to_create.push(*action_names)
781
+ end
782
+ end
783
+
784
+ # set the run context in the class instance variable
785
+ cls.run_context = run_context
786
+
787
+ # load resource definition from file
788
+ cls.class_from_file(filename)
789
+
790
+ # create a new constructor that wraps the old one and adds the actions
791
+ # specified in the DSL
792
+ alias_method :old_init, :initialize
793
+
794
+ new_init =<<INIT
795
+ def initialize(name, run_context=nil)
796
+ @resource_name = "#{rname}".to_sym
797
+ old_init(name, run_context)
798
+ @action = self.class.action_to_set_default || @action
799
+ allowed_actions.push(self.class.actions_to_create).flatten!
800
+ end
801
+ INIT
802
+ class_eval(new_init)
803
+ end
804
+
805
+ # register new class as a Chef::Resource
806
+ class_name = convert_to_class_name(rname)
807
+ Chef::Resource.const_set(class_name, new_resource_class)
808
+ Chef::Log.debug("Loaded contents of #{filename} into a resource named #{rname} defined in Chef::Resource::#{class_name}")
809
+
810
+ new_resource_class
811
+ end
812
+
813
+ # Resources that want providers namespaced somewhere other than
814
+ # Chef::Provider can set the namespace with +provider_base+
815
+ # Ex:
816
+ # class MyResource < Chef::Resource
817
+ # provider_base Chef::Provider::Deploy
818
+ # # ...other stuff
819
+ # end
820
+ def self.provider_base(arg=nil)
821
+ @provider_base ||= arg
822
+ @provider_base ||= Chef::Provider
823
+ end
824
+
825
+ def self.platform_map
826
+ @@platform_map ||= PlatformMap.new
827
+ end
828
+
829
+ # Maps a short_name (and optionally a platform and version) to a
830
+ # Chef::Resource. This allows finer grained per platform resource
831
+ # attributes and the end of overloaded resource definitions
832
+ # (I'm looking at you Chef::Resource::Package)
833
+ # Ex:
834
+ # class WindowsFile < Chef::Resource
835
+ # provides :file, :on_platforms => ["windows"]
836
+ # # ...other stuff
837
+ # end
838
+ #
839
+ # TODO: 2011-11-02 schisamo - platform_version support
840
+ def self.provides(short_name, opts={})
841
+ short_name_sym = short_name
842
+ if short_name.kind_of?(String)
843
+ short_name.downcase!
844
+ short_name.gsub!(/\s/, "_")
845
+ short_name_sym = short_name.to_sym
846
+ end
847
+ if opts.has_key?(:on_platforms)
848
+ platforms = [opts[:on_platforms]].flatten
849
+ platforms.each do |p|
850
+ p = :default if :all == p.to_sym
851
+ platform_map.set(
852
+ :platform => p.to_sym,
853
+ :short_name => short_name_sym,
854
+ :resource => self
855
+ )
856
+ end
857
+ else
858
+ platform_map.set(
859
+ :short_name => short_name_sym,
860
+ :resource => self
861
+ )
862
+ end
863
+ end
864
+
865
+ # Returns a resource based on a short_name anda platform and version.
866
+ #
867
+ #
868
+ # ==== Parameters
869
+ # short_name<Symbol>:: short_name of the resource (ie :directory)
870
+ # platform<Symbol,String>:: platform name
871
+ # version<String>:: platform version
872
+ #
873
+ # === Returns
874
+ # <Chef::Resource>:: returns the proper Chef::Resource class
875
+ def self.resource_for_platform(short_name, platform=nil, version=nil)
876
+ platform_map.get(short_name, platform, version)
877
+ end
878
+
879
+ # Returns a resource based on a short_name and a node's
880
+ # platform and version.
881
+ #
882
+ # ==== Parameters
883
+ # short_name<Symbol>:: short_name of the resource (ie :directory)
884
+ # node<Chef::Node>:: Node object to look up platform and version in
885
+ #
886
+ # === Returns
887
+ # <Chef::Resource>:: returns the proper Chef::Resource class
888
+ def self.resource_for_node(short_name, node)
889
+ begin
890
+ platform, version = Chef::Platform.find_platform_and_version(node)
891
+ rescue ArgumentError
892
+ end
893
+ resource = resource_for_platform(short_name, platform, version)
894
+ resource
895
+ end
896
+
897
+ private
898
+
899
+ def lookup_provider_constant(name)
900
+ begin
901
+ self.class.provider_base.const_get(convert_to_class_name(name.to_s))
902
+ rescue NameError => e
903
+ if e.to_s =~ /#{Regexp.escape(self.class.provider_base.to_s)}/
904
+ raise ArgumentError, "No provider found to match '#{name}'"
905
+ else
906
+ raise e
907
+ end
908
+ end
909
+ end
910
+
911
+ end
912
+ end