tylerrick-chef 0.10.8

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 (450) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +171 -0
  3. data/bin/chef-client +26 -0
  4. data/bin/chef-solo +25 -0
  5. data/bin/knife +26 -0
  6. data/bin/shef +34 -0
  7. data/distro/README +2 -0
  8. data/distro/arch/etc/conf.d/chef-client.conf +5 -0
  9. data/distro/arch/etc/conf.d/chef-expander.conf +8 -0
  10. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  11. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  12. data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
  13. data/distro/arch/etc/rc.d/chef-client +76 -0
  14. data/distro/arch/etc/rc.d/chef-expander +78 -0
  15. data/distro/arch/etc/rc.d/chef-server +78 -0
  16. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  17. data/distro/arch/etc/rc.d/chef-solr +78 -0
  18. data/distro/common/html/chef-client.8.html +146 -0
  19. data/distro/common/html/chef-expander.8.html +164 -0
  20. data/distro/common/html/chef-expanderctl.8.html +146 -0
  21. data/distro/common/html/chef-server-webui.8.html +185 -0
  22. data/distro/common/html/chef-server.8.html +182 -0
  23. data/distro/common/html/chef-solo.8.html +191 -0
  24. data/distro/common/html/chef-solr.8.html +165 -0
  25. data/distro/common/html/knife-bootstrap.1.html +243 -0
  26. data/distro/common/html/knife-client.1.html +219 -0
  27. data/distro/common/html/knife-configure.1.html +170 -0
  28. data/distro/common/html/knife-cookbook-site.1.html +241 -0
  29. data/distro/common/html/knife-cookbook.1.html +384 -0
  30. data/distro/common/html/knife-data-bag.1.html +234 -0
  31. data/distro/common/html/knife-environment.1.html +267 -0
  32. data/distro/common/html/knife-exec.1.html +134 -0
  33. data/distro/common/html/knife-index.1.html +125 -0
  34. data/distro/common/html/knife-node.1.html +250 -0
  35. data/distro/common/html/knife-recipe.1.html +92 -0
  36. data/distro/common/html/knife-role.1.html +200 -0
  37. data/distro/common/html/knife-search.1.html +288 -0
  38. data/distro/common/html/knife-ssh.1.html +157 -0
  39. data/distro/common/html/knife-status.1.html +128 -0
  40. data/distro/common/html/knife-tag.1.html +137 -0
  41. data/distro/common/html/knife.1.html +321 -0
  42. data/distro/common/html/shef.1.html +283 -0
  43. data/distro/common/man/man1/knife-bootstrap.1 +197 -0
  44. data/distro/common/man/man1/knife-client.1 +99 -0
  45. data/distro/common/man/man1/knife-configure.1 +88 -0
  46. data/distro/common/man/man1/knife-cookbook-site.1 +145 -0
  47. data/distro/common/man/man1/knife-cookbook.1 +345 -0
  48. data/distro/common/man/man1/knife-data-bag.1 +130 -0
  49. data/distro/common/man/man1/knife-environment.1 +178 -0
  50. data/distro/common/man/man1/knife-exec.1 +46 -0
  51. data/distro/common/man/man1/knife-index.1 +29 -0
  52. data/distro/common/man/man1/knife-node.1 +134 -0
  53. data/distro/common/man/man1/knife-role.1 +88 -0
  54. data/distro/common/man/man1/knife-search.1 +280 -0
  55. data/distro/common/man/man1/knife-ssh.1 +83 -0
  56. data/distro/common/man/man1/knife-status.1 +29 -0
  57. data/distro/common/man/man1/knife-tag.1 +43 -0
  58. data/distro/common/man/man1/knife.1 +292 -0
  59. data/distro/common/man/man1/shef.1 +256 -0
  60. data/distro/common/man/man8/chef-client.8 +104 -0
  61. data/distro/common/man/man8/chef-expander.8 +97 -0
  62. data/distro/common/man/man8/chef-expanderctl.8 +62 -0
  63. data/distro/common/man/man8/chef-server-webui.8 +155 -0
  64. data/distro/common/man/man8/chef-server.8 +147 -0
  65. data/distro/common/man/man8/chef-solo.8 +158 -0
  66. data/distro/common/man/man8/chef-solr.8 +122 -0
  67. data/distro/common/markdown/README +3 -0
  68. data/distro/common/markdown/man1/knife-bootstrap.mkd +142 -0
  69. data/distro/common/markdown/man1/knife-client.mkd +103 -0
  70. data/distro/common/markdown/man1/knife-configure.mkd +70 -0
  71. data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -0
  72. data/distro/common/markdown/man1/knife-cookbook.mkd +263 -0
  73. data/distro/common/markdown/man1/knife-data-bag.mkd +117 -0
  74. data/distro/common/markdown/man1/knife-environment.mkd +151 -0
  75. data/distro/common/markdown/man1/knife-exec.mkd +37 -0
  76. data/distro/common/markdown/man1/knife-index.mkd +30 -0
  77. data/distro/common/markdown/man1/knife-node.mkd +130 -0
  78. data/distro/common/markdown/man1/knife-role.mkd +85 -0
  79. data/distro/common/markdown/man1/knife-search.mkd +180 -0
  80. data/distro/common/markdown/man1/knife-ssh.mkd +72 -0
  81. data/distro/common/markdown/man1/knife-status.mkd +36 -0
  82. data/distro/common/markdown/man1/knife-tag.mkd +39 -0
  83. data/distro/common/markdown/man1/knife.mkd +220 -0
  84. data/distro/common/markdown/man1/shef.mkd +189 -0
  85. data/distro/common/markdown/man8/chef-client.mkd +75 -0
  86. data/distro/common/markdown/man8/chef-expander.mkd +82 -0
  87. data/distro/common/markdown/man8/chef-expanderctl.mkd +58 -0
  88. data/distro/common/markdown/man8/chef-server-webui.mkd +121 -0
  89. data/distro/common/markdown/man8/chef-server.mkd +121 -0
  90. data/distro/common/markdown/man8/chef-solo.mkd +107 -0
  91. data/distro/common/markdown/man8/chef-solr.mkd +89 -0
  92. data/distro/debian/etc/default/chef-client +4 -0
  93. data/distro/debian/etc/default/chef-expander +8 -0
  94. data/distro/debian/etc/default/chef-server +9 -0
  95. data/distro/debian/etc/default/chef-server-webui +9 -0
  96. data/distro/debian/etc/default/chef-solr +8 -0
  97. data/distro/debian/etc/init.d/chef-client +185 -0
  98. data/distro/debian/etc/init.d/chef-expander +176 -0
  99. data/distro/debian/etc/init.d/chef-server +122 -0
  100. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  101. data/distro/debian/etc/init.d/chef-solr +176 -0
  102. data/distro/debian/etc/init/chef-client.conf +17 -0
  103. data/distro/debian/etc/init/chef-expander.conf +17 -0
  104. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  105. data/distro/debian/etc/init/chef-server.conf +17 -0
  106. data/distro/debian/etc/init/chef-solr.conf +17 -0
  107. data/distro/redhat/etc/init.d/chef-client +110 -0
  108. data/distro/redhat/etc/init.d/chef-expander +104 -0
  109. data/distro/redhat/etc/init.d/chef-server +112 -0
  110. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  111. data/distro/redhat/etc/init.d/chef-solr +104 -0
  112. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  113. data/distro/redhat/etc/logrotate.d/chef-expander +8 -0
  114. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  115. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  116. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  117. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  118. data/distro/redhat/etc/sysconfig/chef-expander +7 -0
  119. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  120. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  121. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  122. data/lib/chef.rb +41 -0
  123. data/lib/chef/api_client.rb +271 -0
  124. data/lib/chef/application.rb +152 -0
  125. data/lib/chef/application/agent.rb +18 -0
  126. data/lib/chef/application/client.rb +285 -0
  127. data/lib/chef/application/knife.rb +188 -0
  128. data/lib/chef/application/solo.rb +218 -0
  129. data/lib/chef/applications.rb +4 -0
  130. data/lib/chef/certificate.rb +194 -0
  131. data/lib/chef/checksum.rb +167 -0
  132. data/lib/chef/checksum/storage.rb +18 -0
  133. data/lib/chef/checksum/storage/filesystem.rb +56 -0
  134. data/lib/chef/checksum_cache.rb +189 -0
  135. data/lib/chef/client.rb +366 -0
  136. data/lib/chef/config.rb +248 -0
  137. data/lib/chef/cookbook/chefignore.rb +66 -0
  138. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  139. data/lib/chef/cookbook/cookbook_version_loader.rb +173 -0
  140. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  141. data/lib/chef/cookbook/file_vendor.rb +48 -0
  142. data/lib/chef/cookbook/metadata.rb +629 -0
  143. data/lib/chef/cookbook/remote_file_vendor.rb +88 -0
  144. data/lib/chef/cookbook/syntax_check.rb +136 -0
  145. data/lib/chef/cookbook_loader.rb +121 -0
  146. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  147. data/lib/chef/cookbook_uploader.rb +154 -0
  148. data/lib/chef/cookbook_version.rb +1096 -0
  149. data/lib/chef/cookbook_version_selector.rb +168 -0
  150. data/lib/chef/couchdb.rb +246 -0
  151. data/lib/chef/daemon.rb +172 -0
  152. data/lib/chef/data_bag.rb +235 -0
  153. data/lib/chef/data_bag_item.rb +273 -0
  154. data/lib/chef/encrypted_data_bag_item.rb +139 -0
  155. data/lib/chef/environment.rb +455 -0
  156. data/lib/chef/exceptions.rb +154 -0
  157. data/lib/chef/file_access_control.rb +144 -0
  158. data/lib/chef/file_cache.rb +218 -0
  159. data/lib/chef/handler.rb +227 -0
  160. data/lib/chef/handler/error_report.rb +33 -0
  161. data/lib/chef/handler/json_file.rb +58 -0
  162. data/lib/chef/index_queue.rb +29 -0
  163. data/lib/chef/index_queue/amqp_client.rb +116 -0
  164. data/lib/chef/index_queue/consumer.rb +76 -0
  165. data/lib/chef/index_queue/indexable.rb +109 -0
  166. data/lib/chef/json_compat.rb +52 -0
  167. data/lib/chef/knife.rb +520 -0
  168. data/lib/chef/knife/bootstrap.rb +207 -0
  169. data/lib/chef/knife/bootstrap/archlinux-gems.erb +60 -0
  170. data/lib/chef/knife/bootstrap/centos5-gems.erb +56 -0
  171. data/lib/chef/knife/bootstrap/fedora13-gems.erb +43 -0
  172. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +49 -0
  173. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +50 -0
  174. data/lib/chef/knife/client_bulk_delete.rb +65 -0
  175. data/lib/chef/knife/client_create.rb +79 -0
  176. data/lib/chef/knife/client_delete.rb +46 -0
  177. data/lib/chef/knife/client_edit.rb +45 -0
  178. data/lib/chef/knife/client_list.rb +42 -0
  179. data/lib/chef/knife/client_reregister.rb +58 -0
  180. data/lib/chef/knife/client_show.rb +52 -0
  181. data/lib/chef/knife/configure.rb +149 -0
  182. data/lib/chef/knife/configure_client.rb +50 -0
  183. data/lib/chef/knife/cookbook_bulk_delete.rb +72 -0
  184. data/lib/chef/knife/cookbook_create.rb +274 -0
  185. data/lib/chef/knife/cookbook_delete.rb +151 -0
  186. data/lib/chef/knife/cookbook_download.rb +137 -0
  187. data/lib/chef/knife/cookbook_list.rb +47 -0
  188. data/lib/chef/knife/cookbook_metadata.rb +107 -0
  189. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  190. data/lib/chef/knife/cookbook_show.rb +102 -0
  191. data/lib/chef/knife/cookbook_site_download.rb +70 -0
  192. data/lib/chef/knife/cookbook_site_install.rb +148 -0
  193. data/lib/chef/knife/cookbook_site_list.rb +62 -0
  194. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  195. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  196. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  197. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  198. data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
  199. data/lib/chef/knife/cookbook_test.rb +93 -0
  200. data/lib/chef/knife/cookbook_upload.rb +240 -0
  201. data/lib/chef/knife/core/bootstrap_context.rb +100 -0
  202. data/lib/chef/knife/core/cookbook_scm_repo.rb +148 -0
  203. data/lib/chef/knife/core/generic_presenter.rb +191 -0
  204. data/lib/chef/knife/core/node_editor.rb +127 -0
  205. data/lib/chef/knife/core/node_presenter.rb +136 -0
  206. data/lib/chef/knife/core/object_loader.rb +75 -0
  207. data/lib/chef/knife/core/subcommand_loader.rb +112 -0
  208. data/lib/chef/knife/core/text_formatter.rb +100 -0
  209. data/lib/chef/knife/core/ui.rb +216 -0
  210. data/lib/chef/knife/data_bag_create.rb +93 -0
  211. data/lib/chef/knife/data_bag_delete.rb +51 -0
  212. data/lib/chef/knife/data_bag_edit.rb +94 -0
  213. data/lib/chef/knife/data_bag_from_file.rb +87 -0
  214. data/lib/chef/knife/data_bag_list.rb +46 -0
  215. data/lib/chef/knife/data_bag_show.rb +81 -0
  216. data/lib/chef/knife/environment_create.rb +53 -0
  217. data/lib/chef/knife/environment_delete.rb +45 -0
  218. data/lib/chef/knife/environment_edit.rb +45 -0
  219. data/lib/chef/knife/environment_from_file.rb +50 -0
  220. data/lib/chef/knife/environment_list.rb +42 -0
  221. data/lib/chef/knife/environment_show.rb +46 -0
  222. data/lib/chef/knife/exec.rb +51 -0
  223. data/lib/chef/knife/help.rb +103 -0
  224. data/lib/chef/knife/help_topics.rb +4 -0
  225. data/lib/chef/knife/index_rebuild.rb +50 -0
  226. data/lib/chef/knife/node_bulk_delete.rb +80 -0
  227. data/lib/chef/knife/node_create.rb +50 -0
  228. data/lib/chef/knife/node_delete.rb +47 -0
  229. data/lib/chef/knife/node_edit.rb +72 -0
  230. data/lib/chef/knife/node_from_file.rb +50 -0
  231. data/lib/chef/knife/node_list.rb +46 -0
  232. data/lib/chef/knife/node_run_list_add.rb +67 -0
  233. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  234. data/lib/chef/knife/node_show.rb +73 -0
  235. data/lib/chef/knife/recipe_list.rb +32 -0
  236. data/lib/chef/knife/role_bulk_delete.rb +70 -0
  237. data/lib/chef/knife/role_create.rb +55 -0
  238. data/lib/chef/knife/role_delete.rb +47 -0
  239. data/lib/chef/knife/role_edit.rb +48 -0
  240. data/lib/chef/knife/role_from_file.rb +56 -0
  241. data/lib/chef/knife/role_list.rb +43 -0
  242. data/lib/chef/knife/role_show.rb +54 -0
  243. data/lib/chef/knife/search.rb +141 -0
  244. data/lib/chef/knife/ssh.rb +367 -0
  245. data/lib/chef/knife/status.rb +104 -0
  246. data/lib/chef/knife/tag_create.rb +52 -0
  247. data/lib/chef/knife/tag_delete.rb +60 -0
  248. data/lib/chef/knife/tag_list.rb +47 -0
  249. data/lib/chef/log.rb +39 -0
  250. data/lib/chef/mash.rb +211 -0
  251. data/lib/chef/mixin/check_helper.rb +31 -0
  252. data/lib/chef/mixin/checksum.rb +32 -0
  253. data/lib/chef/mixin/command.rb +163 -0
  254. data/lib/chef/mixin/command/unix.rb +215 -0
  255. data/lib/chef/mixin/command/windows.rb +76 -0
  256. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  257. data/lib/chef/mixin/create_path.rb +57 -0
  258. data/lib/chef/mixin/deep_merge.rb +225 -0
  259. data/lib/chef/mixin/deprecation.rb +65 -0
  260. data/lib/chef/mixin/from_file.rb +50 -0
  261. data/lib/chef/mixin/get_source_from_package.rb +42 -0
  262. data/lib/chef/mixin/language.rb +163 -0
  263. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  264. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  265. data/lib/chef/mixin/params_validate.rb +225 -0
  266. data/lib/chef/mixin/recipe_definition_dsl_core.rb +78 -0
  267. data/lib/chef/mixin/shell_out.rb +41 -0
  268. data/lib/chef/mixin/template.rb +95 -0
  269. data/lib/chef/mixin/xml_escape.rb +140 -0
  270. data/lib/chef/mixins.rb +15 -0
  271. data/lib/chef/monkey_patches/dir.rb +36 -0
  272. data/lib/chef/monkey_patches/numeric.rb +15 -0
  273. data/lib/chef/monkey_patches/object.rb +9 -0
  274. data/lib/chef/monkey_patches/regexp.rb +34 -0
  275. data/lib/chef/monkey_patches/string.rb +49 -0
  276. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  277. data/lib/chef/nil_argument.rb +3 -0
  278. data/lib/chef/node.rb +677 -0
  279. data/lib/chef/node/attribute.rb +487 -0
  280. data/lib/chef/openid_registration.rb +187 -0
  281. data/lib/chef/platform.rb +434 -0
  282. data/lib/chef/provider.rb +124 -0
  283. data/lib/chef/provider/breakpoint.rb +36 -0
  284. data/lib/chef/provider/cookbook_file.rb +100 -0
  285. data/lib/chef/provider/cron.rb +186 -0
  286. data/lib/chef/provider/cron/solaris.rb +195 -0
  287. data/lib/chef/provider/deploy.rb +418 -0
  288. data/lib/chef/provider/deploy/revision.rb +80 -0
  289. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  290. data/lib/chef/provider/directory.rb +72 -0
  291. data/lib/chef/provider/env.rb +152 -0
  292. data/lib/chef/provider/env/windows.rb +75 -0
  293. data/lib/chef/provider/erl_call.rb +101 -0
  294. data/lib/chef/provider/execute.rb +65 -0
  295. data/lib/chef/provider/file.rb +226 -0
  296. data/lib/chef/provider/git.rb +243 -0
  297. data/lib/chef/provider/group.rb +133 -0
  298. data/lib/chef/provider/group/aix.rb +70 -0
  299. data/lib/chef/provider/group/dscl.rb +121 -0
  300. data/lib/chef/provider/group/gpasswd.rb +53 -0
  301. data/lib/chef/provider/group/groupadd.rb +91 -0
  302. data/lib/chef/provider/group/pw.rb +84 -0
  303. data/lib/chef/provider/group/suse.rb +53 -0
  304. data/lib/chef/provider/group/usermod.rb +57 -0
  305. data/lib/chef/provider/group/windows.rb +79 -0
  306. data/lib/chef/provider/http_request.rb +122 -0
  307. data/lib/chef/provider/ifconfig.rb +195 -0
  308. data/lib/chef/provider/link.rb +164 -0
  309. data/lib/chef/provider/log.rb +54 -0
  310. data/lib/chef/provider/mdadm.rb +91 -0
  311. data/lib/chef/provider/mount.rb +114 -0
  312. data/lib/chef/provider/mount/mount.rb +240 -0
  313. data/lib/chef/provider/mount/windows.rb +81 -0
  314. data/lib/chef/provider/ohai.rb +42 -0
  315. data/lib/chef/provider/package.rb +200 -0
  316. data/lib/chef/provider/package/apt.rb +145 -0
  317. data/lib/chef/provider/package/dpkg.rb +115 -0
  318. data/lib/chef/provider/package/easy_install.rb +136 -0
  319. data/lib/chef/provider/package/freebsd.rb +125 -0
  320. data/lib/chef/provider/package/macports.rb +105 -0
  321. data/lib/chef/provider/package/pacman.rb +101 -0
  322. data/lib/chef/provider/package/portage.rb +135 -0
  323. data/lib/chef/provider/package/rpm.rb +104 -0
  324. data/lib/chef/provider/package/rubygems.rb +465 -0
  325. data/lib/chef/provider/package/solaris.rb +130 -0
  326. data/lib/chef/provider/package/yum-dump.py +286 -0
  327. data/lib/chef/provider/package/yum.rb +1173 -0
  328. data/lib/chef/provider/package/zypper.rb +144 -0
  329. data/lib/chef/provider/remote_directory.rb +137 -0
  330. data/lib/chef/provider/remote_file.rb +118 -0
  331. data/lib/chef/provider/route.rb +193 -0
  332. data/lib/chef/provider/ruby_block.rb +34 -0
  333. data/lib/chef/provider/script.rb +55 -0
  334. data/lib/chef/provider/service.rb +122 -0
  335. data/lib/chef/provider/service/arch.rb +116 -0
  336. data/lib/chef/provider/service/debian.rb +130 -0
  337. data/lib/chef/provider/service/freebsd.rb +154 -0
  338. data/lib/chef/provider/service/gentoo.rb +53 -0
  339. data/lib/chef/provider/service/init.rb +71 -0
  340. data/lib/chef/provider/service/insserv.rb +52 -0
  341. data/lib/chef/provider/service/invokercd.rb +35 -0
  342. data/lib/chef/provider/service/redhat.rb +60 -0
  343. data/lib/chef/provider/service/simple.rb +120 -0
  344. data/lib/chef/provider/service/solaris.rb +85 -0
  345. data/lib/chef/provider/service/systemd.rb +102 -0
  346. data/lib/chef/provider/service/upstart.rb +198 -0
  347. data/lib/chef/provider/service/windows.rb +155 -0
  348. data/lib/chef/provider/subversion.rb +197 -0
  349. data/lib/chef/provider/template.rb +104 -0
  350. data/lib/chef/provider/user.rb +186 -0
  351. data/lib/chef/provider/user/dscl.rb +280 -0
  352. data/lib/chef/provider/user/pw.rb +113 -0
  353. data/lib/chef/provider/user/useradd.rb +137 -0
  354. data/lib/chef/provider/user/windows.rb +124 -0
  355. data/lib/chef/providers.rb +95 -0
  356. data/lib/chef/recipe.rb +129 -0
  357. data/lib/chef/resource.rb +609 -0
  358. data/lib/chef/resource/apt_package.rb +34 -0
  359. data/lib/chef/resource/bash.rb +33 -0
  360. data/lib/chef/resource/breakpoint.rb +35 -0
  361. data/lib/chef/resource/conditional.rb +90 -0
  362. data/lib/chef/resource/cookbook_file.rb +45 -0
  363. data/lib/chef/resource/cron.rb +188 -0
  364. data/lib/chef/resource/csh.rb +33 -0
  365. data/lib/chef/resource/deploy.rb +389 -0
  366. data/lib/chef/resource/deploy_revision.rb +40 -0
  367. data/lib/chef/resource/directory.rb +76 -0
  368. data/lib/chef/resource/dpkg_package.rb +34 -0
  369. data/lib/chef/resource/easy_install_package.rb +57 -0
  370. data/lib/chef/resource/env.rb +58 -0
  371. data/lib/chef/resource/erl_call.rb +83 -0
  372. data/lib/chef/resource/execute.rb +127 -0
  373. data/lib/chef/resource/file.rb +99 -0
  374. data/lib/chef/resource/freebsd_package.rb +35 -0
  375. data/lib/chef/resource/gem_package.rb +53 -0
  376. data/lib/chef/resource/git.rb +46 -0
  377. data/lib/chef/resource/group.rb +78 -0
  378. data/lib/chef/resource/http_request.rb +61 -0
  379. data/lib/chef/resource/ifconfig.rb +144 -0
  380. data/lib/chef/resource/link.rb +78 -0
  381. data/lib/chef/resource/log.rb +62 -0
  382. data/lib/chef/resource/macports_package.rb +29 -0
  383. data/lib/chef/resource/mdadm.rb +82 -0
  384. data/lib/chef/resource/mount.rb +134 -0
  385. data/lib/chef/resource/ohai.rb +40 -0
  386. data/lib/chef/resource/package.rb +80 -0
  387. data/lib/chef/resource/pacman_package.rb +33 -0
  388. data/lib/chef/resource/perl.rb +33 -0
  389. data/lib/chef/resource/portage_package.rb +33 -0
  390. data/lib/chef/resource/python.rb +33 -0
  391. data/lib/chef/resource/remote_directory.rb +109 -0
  392. data/lib/chef/resource/remote_file.rb +83 -0
  393. data/lib/chef/resource/route.rb +135 -0
  394. data/lib/chef/resource/rpm_package.rb +34 -0
  395. data/lib/chef/resource/ruby.rb +33 -0
  396. data/lib/chef/resource/ruby_block.rb +40 -0
  397. data/lib/chef/resource/scm.rb +147 -0
  398. data/lib/chef/resource/script.rb +60 -0
  399. data/lib/chef/resource/service.rb +151 -0
  400. data/lib/chef/resource/solaris_package.rb +36 -0
  401. data/lib/chef/resource/subversion.rb +36 -0
  402. data/lib/chef/resource/template.rb +69 -0
  403. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  404. data/lib/chef/resource/user.rb +130 -0
  405. data/lib/chef/resource/yum_package.rb +63 -0
  406. data/lib/chef/resource_collection.rb +217 -0
  407. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  408. data/lib/chef/resource_definition.rb +67 -0
  409. data/lib/chef/resource_definition_list.rb +38 -0
  410. data/lib/chef/resources.rb +64 -0
  411. data/lib/chef/rest.rb +400 -0
  412. data/lib/chef/rest/auth_credentials.rb +71 -0
  413. data/lib/chef/rest/cookie_jar.rb +31 -0
  414. data/lib/chef/rest/rest_request.rb +213 -0
  415. data/lib/chef/role.rb +343 -0
  416. data/lib/chef/run_context.rb +126 -0
  417. data/lib/chef/run_list.rb +165 -0
  418. data/lib/chef/run_list/run_list_expansion.rb +193 -0
  419. data/lib/chef/run_list/run_list_item.rb +92 -0
  420. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  421. data/lib/chef/run_status.rb +121 -0
  422. data/lib/chef/runner.rb +105 -0
  423. data/lib/chef/sandbox.rb +153 -0
  424. data/lib/chef/search/query.rb +65 -0
  425. data/lib/chef/shef.rb +327 -0
  426. data/lib/chef/shef/ext.rb +569 -0
  427. data/lib/chef/shef/model_wrapper.rb +120 -0
  428. data/lib/chef/shef/shef_rest.rb +28 -0
  429. data/lib/chef/shef/shef_session.rb +285 -0
  430. data/lib/chef/shell_out.rb +249 -0
  431. data/lib/chef/shell_out/unix.rb +223 -0
  432. data/lib/chef/shell_out/windows.rb +588 -0
  433. data/lib/chef/solr_query.rb +187 -0
  434. data/lib/chef/solr_query/lucene.treetop +150 -0
  435. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  436. data/lib/chef/solr_query/query_transform.rb +65 -0
  437. data/lib/chef/solr_query/solr_http_request.rb +132 -0
  438. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  439. data/lib/chef/tasks/chef_repo.rake +334 -0
  440. data/lib/chef/util/file_edit.rb +122 -0
  441. data/lib/chef/util/windows.rb +56 -0
  442. data/lib/chef/util/windows/net_group.rb +101 -0
  443. data/lib/chef/util/windows/net_use.rb +121 -0
  444. data/lib/chef/util/windows/net_user.rb +198 -0
  445. data/lib/chef/util/windows/volume.rb +59 -0
  446. data/lib/chef/version.rb +23 -0
  447. data/lib/chef/version_class.rb +70 -0
  448. data/lib/chef/version_constraint.rb +116 -0
  449. data/lib/chef/webui_user.rb +231 -0
  450. metadata +764 -0
@@ -0,0 +1,139 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@opscode.com>)
3
+ # Copyright:: Copyright 2010-2011 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 'base64'
20
+ require 'openssl'
21
+ require 'chef/data_bag_item'
22
+ require 'yaml'
23
+ require 'open-uri'
24
+
25
+ # An EncryptedDataBagItem represents a read-only data bag item where
26
+ # all values, except for the value associated with the id key, have
27
+ # been encrypted.
28
+ #
29
+ # EncrypedDataBagItem can be used in recipes to decrypt data bag item
30
+ # members.
31
+ #
32
+ # Data bag item values are assumed to have been encrypted using the
33
+ # default symmetric encryption provided by Encryptor.encrypt where
34
+ # values are converted to YAML prior to encryption.
35
+ #
36
+ # If the shared secret is not specified at initialization or load,
37
+ # then the contents of the file referred to in
38
+ # Chef::Config[:encrypted_data_bag_secret] will be used as the
39
+ # secret. The default path is /etc/chef/encrypted_data_bag_secret
40
+ #
41
+ # EncryptedDataBagItem is intended to provide a means to avoid storing
42
+ # data bag items in the clear on the Chef server. This provides some
43
+ # protection against a breach of the Chef server or of Chef server
44
+ # backup data. Because the secret must be stored in the clear on any
45
+ # node needing access to an EncryptedDataBagItem, this approach
46
+ # provides no protection of data bag items from actors with access to
47
+ # such nodes in the infrastructure.
48
+ #
49
+ class Chef::EncryptedDataBagItem
50
+ DEFAULT_SECRET_FILE = "/etc/chef/encrypted_data_bag_secret"
51
+ ALGORITHM = 'aes-256-cbc'
52
+
53
+ def initialize(enc_hash, secret)
54
+ @enc_hash = enc_hash
55
+ @secret = secret
56
+ end
57
+
58
+ def [](key)
59
+ value = @enc_hash[key]
60
+ if key == "id" || value.nil?
61
+ value
62
+ else
63
+ self.class.decrypt_value(value, @secret)
64
+ end
65
+ end
66
+
67
+ def []=(key, value)
68
+ raise ArgumentError, "assignment not supported for #{self.class}"
69
+ end
70
+
71
+ def to_hash
72
+ @enc_hash.keys.inject({}) { |hash, key| hash[key] = self[key]; hash }
73
+ end
74
+
75
+ def self.from_plain_hash(plain_hash, secret)
76
+ self.new(self.encrypt_data_bag_item(plain_hash, secret), secret)
77
+ end
78
+
79
+ def self.encrypt_data_bag_item(plain_hash, secret)
80
+ plain_hash.inject({}) do |h, (key, val)|
81
+ h[key] = if key != "id"
82
+ self.encrypt_value(val, secret)
83
+ else
84
+ val
85
+ end
86
+ h
87
+ end
88
+ end
89
+
90
+ def self.load(data_bag, name, secret = nil)
91
+ path = "data/#{data_bag}/#{name}"
92
+ raw_hash = Chef::DataBagItem.load(data_bag, name)
93
+ secret = secret || self.load_secret
94
+ self.new(raw_hash, secret)
95
+ end
96
+
97
+ def self.encrypt_value(value, key)
98
+ Base64.encode64(self.cipher(:encrypt, value.to_yaml, key))
99
+ end
100
+
101
+ def self.decrypt_value(value, key)
102
+ YAML.load(self.cipher(:decrypt, Base64.decode64(value), key))
103
+ end
104
+
105
+ def self.load_secret(path=nil)
106
+ path = path || Chef::Config[:encrypted_data_bag_secret] || DEFAULT_SECRET_FILE
107
+ secret = case path
108
+ when /^\w+:\/\//
109
+ # We have a remote key
110
+ begin
111
+ Kernel.open(path).read.strip
112
+ rescue Errno::ECONNREFUSED
113
+ raise ArgumentError, "Remote key not available from '#{path}'"
114
+ rescue OpenURI::HTTPError
115
+ raise ArgumentError, "Remote key not found at '#{path}'"
116
+ end
117
+ else
118
+ if !File.exists?(path)
119
+ raise Errno::ENOENT, "file not found '#{path}'"
120
+ end
121
+ IO.read(path).strip
122
+ end
123
+ if secret.size < 1
124
+ raise ArgumentError, "invalid zero length secret in '#{path}'"
125
+ end
126
+ secret
127
+ end
128
+
129
+ protected
130
+
131
+ def self.cipher(direction, data, key)
132
+ cipher = OpenSSL::Cipher::Cipher.new(ALGORITHM)
133
+ cipher.send(direction)
134
+ cipher.pkcs5_keyivgen(key)
135
+ ans = cipher.update(data)
136
+ ans << cipher.final
137
+ ans
138
+ end
139
+ end
@@ -0,0 +1,455 @@
1
+ #
2
+ # Author:: Stephen Delano (<stephen@opscode.com>)
3
+ # Author:: Seth Falcon (<seth@opscode.com>)
4
+ # Author:: John Keiser (<jkeiser@ospcode.com>)
5
+ # Copyright:: Copyright 2010-2011 Opscode, Inc.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ require 'chef/config'
22
+ require 'chef/mash'
23
+ require 'chef/mixin/params_validate'
24
+ require 'chef/mixin/from_file'
25
+ require 'chef/couchdb'
26
+ require 'chef/index_queue'
27
+ require 'chef/version_constraint'
28
+
29
+ class Chef
30
+ class Environment
31
+
32
+ DEFAULT = "default"
33
+
34
+ include Chef::Mixin::ParamsValidate
35
+ include Chef::Mixin::FromFile
36
+ include Chef::IndexQueue::Indexable
37
+
38
+ COMBINED_COOKBOOK_CONSTRAINT = /(.+)(?:[\s]+)((?:#{Chef::VersionConstraint::OPS.join('|')})(?:[\s]+).+)$/.freeze
39
+
40
+ attr_accessor :couchdb, :couchdb_rev
41
+ attr_reader :couchdb_id
42
+
43
+ DESIGN_DOCUMENT = {
44
+ "version" => 1,
45
+ "language" => "javascript",
46
+ "views" => {
47
+ "all" => {
48
+ "map" => <<-EOJS
49
+ function(doc) {
50
+ if (doc.chef_type == "environment") {
51
+ emit(doc.name, doc);
52
+ }
53
+ }
54
+ EOJS
55
+ },
56
+ "all_id" => {
57
+ "map" => <<-EOJS
58
+ function(doc) {
59
+ if (doc.chef_type == "environment") {
60
+ emit(doc.name, doc.name);
61
+ }
62
+ }
63
+ EOJS
64
+ }
65
+ }
66
+ }
67
+
68
+ def initialize(couchdb=nil)
69
+ @name = ''
70
+ @description = ''
71
+ @default_attributes = Mash.new
72
+ @override_attributes = Mash.new
73
+ @cookbook_versions = Hash.new
74
+ @couchdb_rev = nil
75
+ @couchdb_id = nil
76
+ @couchdb = couchdb || Chef::CouchDB.new
77
+ end
78
+
79
+ def couchdb_id=(value)
80
+ @couchdb_id = value
81
+ self.index_id = value
82
+ end
83
+
84
+ def chef_server_rest
85
+ Chef::REST.new(Chef::Config[:chef_server_url])
86
+ end
87
+
88
+ def self.chef_server_rest
89
+ Chef::REST.new(Chef::Config[:chef_server_url])
90
+ end
91
+
92
+ def name(arg=nil)
93
+ set_or_return(
94
+ :name,
95
+ arg,
96
+ { :regex => /^[\-[:alnum:]_]+$/, :kind_of => String }
97
+ )
98
+ end
99
+
100
+ def description(arg=nil)
101
+ set_or_return(
102
+ :description,
103
+ arg,
104
+ :kind_of => String
105
+ )
106
+ end
107
+
108
+ def default_attributes(arg=nil)
109
+ set_or_return(
110
+ :default_attributes,
111
+ arg,
112
+ :kind_of => Hash
113
+ )
114
+ end
115
+
116
+ def override_attributes(arg=nil)
117
+ set_or_return(
118
+ :override_attributes,
119
+ arg,
120
+ :kind_of => Hash
121
+ )
122
+ end
123
+
124
+ def cookbook_versions(arg=nil)
125
+ set_or_return(
126
+ :cookbook_versions,
127
+ arg,
128
+ {
129
+ :kind_of => Hash,
130
+ :callbacks => {
131
+ "should be a valid set of cookbook version requirements" => lambda { |cv| Chef::Environment.validate_cookbook_versions(cv) }
132
+ }
133
+ }
134
+ )
135
+ end
136
+
137
+ def cookbook(cookbook, version)
138
+ validate({
139
+ :version => version
140
+ },{
141
+ :version => {
142
+ :callbacks => { "should be a valid version requirement" => lambda { |v| Chef::Environment.validate_cookbook_version(v) } }
143
+ }
144
+ })
145
+ @cookbook_versions[cookbook] = version
146
+ end
147
+
148
+ def to_hash
149
+ result = {
150
+ "name" => @name,
151
+ "description" => @description,
152
+ "cookbook_versions" => @cookbook_versions,
153
+ "json_class" => self.class.name,
154
+ "chef_type" => "environment",
155
+ "default_attributes" => @default_attributes,
156
+ "override_attributes" => @override_attributes
157
+ }
158
+ result["_rev"] = couchdb_rev if couchdb_rev
159
+ result
160
+ end
161
+
162
+ def to_json(*a)
163
+ to_hash.to_json(*a)
164
+ end
165
+
166
+ def update_from!(o)
167
+ description(o.description)
168
+ cookbook_versions(o.cookbook_versions)
169
+ default_attributes(o.default_attributes)
170
+ override_attributes(o.override_attributes)
171
+ self
172
+ end
173
+
174
+
175
+ def update_attributes_from_params(params)
176
+ unless params[:default_attributes].nil? || params[:default_attributes].size == 0
177
+ default_attributes(Chef::JSONCompat.from_json(params[:default_attributes]))
178
+ end
179
+ unless params[:override_attributes].nil? || params[:override_attributes].size == 0
180
+ override_attributes(Chef::JSONCompat.from_json(params[:override_attributes]))
181
+ end
182
+ end
183
+
184
+ def update_from_params(params)
185
+ # reset because everything we need will be in the params, this is necessary because certain constraints
186
+ # may have been removed in the params and need to be removed from cookbook_versions as well.
187
+ bkup_cb_versions = cookbook_versions
188
+ cookbook_versions(Hash.new)
189
+ valid = true
190
+
191
+ begin
192
+ name(params[:name])
193
+ rescue Chef::Exceptions::ValidationFailed => e
194
+ invalid_fields[:name] = e.message
195
+ valid = false
196
+ end
197
+ description(params[:description])
198
+
199
+ unless params[:cookbook_version].nil?
200
+ params[:cookbook_version].each do |index, cookbook_constraint_spec|
201
+ unless (cookbook_constraint_spec.nil? || cookbook_constraint_spec.size == 0)
202
+ valid = valid && update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
203
+ end
204
+ end
205
+ end
206
+
207
+ update_attributes_from_params(params)
208
+
209
+ valid = validate_required_attrs_present && valid
210
+ cookbook_versions(bkup_cb_versions) unless valid # restore the old cookbook_versions if valid is false
211
+ valid
212
+ end
213
+
214
+ def update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
215
+ valid = true
216
+ md = cookbook_constraint_spec.match(COMBINED_COOKBOOK_CONSTRAINT)
217
+ if md.nil? || md[2].nil?
218
+ valid = false
219
+ add_cookbook_constraint_error(index, cookbook_constraint_spec)
220
+ elsif self.class.validate_cookbook_version(md[2])
221
+ cookbook_versions[md[1]] = md[2]
222
+ else
223
+ valid = false
224
+ add_cookbook_constraint_error(index, cookbook_constraint_spec)
225
+ end
226
+ valid
227
+ end
228
+
229
+ def add_cookbook_constraint_error(index, cookbook_constraint_spec)
230
+ invalid_fields[:cookbook_version] ||= {}
231
+ invalid_fields[:cookbook_version][index] = "#{cookbook_constraint_spec} is not a valid cookbook constraint"
232
+ end
233
+
234
+ def invalid_fields
235
+ @invalid_fields ||= {}
236
+ end
237
+
238
+ def validate_required_attrs_present
239
+ if name.nil? || name.size == 0
240
+ invalid_fields[:name] ||= "name cannot be empty"
241
+ false
242
+ else
243
+ true
244
+ end
245
+ end
246
+
247
+
248
+ def self.json_create(o)
249
+ environment = new
250
+ environment.name(o["name"])
251
+ environment.description(o["description"])
252
+ environment.cookbook_versions(o["cookbook_versions"])
253
+ environment.default_attributes(o["default_attributes"])
254
+ environment.override_attributes(o["override_attributes"])
255
+ environment.couchdb_rev = o["_rev"] if o.has_key?("_rev")
256
+ environment.couchdb_id = o["_id"] if o.has_key?("_id")
257
+ environment
258
+ end
259
+
260
+ def self.cdb_list(inflate=false, couchdb=nil)
261
+ es = (couchdb || Chef::CouchDB.new).list("environments", inflate)
262
+ lookup = (inflate ? "value" : "key")
263
+ es["rows"].collect { |e| e[lookup] }
264
+ end
265
+
266
+ def self.list(inflate=false)
267
+ if inflate
268
+ # TODO: index the environments and use search to inflate - don't inflate for now :(
269
+ chef_server_rest.get_rest("environments")
270
+ else
271
+ chef_server_rest.get_rest("environments")
272
+ end
273
+ end
274
+
275
+ def self.cdb_load(name, couchdb=nil)
276
+ (couchdb || Chef::CouchDB.new).load("environment", name)
277
+ end
278
+
279
+ def self.load(name)
280
+ chef_server_rest.get_rest("environments/#{name}")
281
+ end
282
+
283
+ def self.exists?(name, couchdb)
284
+ begin
285
+ self.cdb_load(name, couchdb)
286
+ rescue Chef::Exceptions::CouchDBNotFound
287
+ nil
288
+ end
289
+ end
290
+
291
+ def cdb_destroy
292
+ couchdb.delete("environment", @name, couchdb_rev)
293
+ end
294
+
295
+ def destroy
296
+ chef_server_rest.delete_rest("environments/#{@name}")
297
+ end
298
+
299
+ def cdb_save
300
+ self.couchdb_rev = couchdb.store("environment", @name, self)["rev"]
301
+ end
302
+
303
+ def save
304
+ begin
305
+ chef_server_rest.put_rest("environments/#{@name}", self)
306
+ rescue Net::HTTPServerException => e
307
+ raise e unless e.response.code == "404"
308
+ chef_server_rest.post_rest("environments", self)
309
+ end
310
+ self
311
+ end
312
+
313
+ def create
314
+ chef_server_rest.post_rest("environments", self)
315
+ self
316
+ end
317
+
318
+ # Set up our CouchDB design document
319
+ def self.create_design_document(couchdb=nil)
320
+ (couchdb || Chef::CouchDB.new).create_design_document("environments", DESIGN_DOCUMENT)
321
+ end
322
+
323
+ # Loads the set of Chef::CookbookVersion objects available to a given environment
324
+ # === Returns
325
+ # Hash
326
+ # i.e.
327
+ # {
328
+ # "cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest
329
+ # }
330
+ #
331
+ # There will be a key for every cookbook. If no CookbookVersions
332
+ # are available for the specified environment the value will be an
333
+ # empty list.
334
+ #
335
+ def self.cdb_load_filtered_cookbook_versions(name, couchdb=nil)
336
+ version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}
337
+
338
+ # inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
339
+ cookbook_list = Chef::CookbookVersion.cdb_list(true, couchdb)
340
+
341
+ filtered_list = cookbook_list.inject({}) do |res, cookbook|
342
+ # FIXME: should cookbook.version return a Chef::Version?
343
+ version = Chef::Version.new(cookbook.version)
344
+ requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
345
+ # we want a key for every cookbook, even if no versions are available
346
+ res[cookbook.name] ||= []
347
+ res[cookbook.name] << cookbook if requirement_satisfied
348
+ res
349
+ end
350
+
351
+ sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
352
+ res[cookbook_name] = versions.sort.reverse
353
+ res
354
+ end
355
+
356
+ sorted_list
357
+ end
358
+
359
+ # Like +cdb_load_filtered_cookbook_versions+, loads the set of
360
+ # cookbooks available in a given environment. The difference is that
361
+ # this method will load Chef::MinimalCookbookVersion objects that
362
+ # contain only the information necessary for solving a cookbook
363
+ # collection for a given run list. The user of this method must call
364
+ # Chef::MinimalCookbookVersion.load_full_versions_of() after solving
365
+ # the cookbook collection to get the full objects.
366
+ # === Returns
367
+ # Hash
368
+ # i.e.
369
+ # {
370
+ # "cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest
371
+ # }
372
+ #
373
+ # There will be a key for every cookbook. If no CookbookVersions
374
+ # are available for the specified environment the value will be an
375
+ # empty list.
376
+ def self.cdb_minimal_filtered_versions(name, couchdb=nil)
377
+ version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}
378
+
379
+ # inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
380
+ cookbook_list = Chef::MinimalCookbookVersion.load_all(couchdb)
381
+
382
+ filtered_list = cookbook_list.inject({}) do |res, cookbook|
383
+ # FIXME: should cookbook.version return a Chef::Version?
384
+ version = Chef::Version.new(cookbook.version)
385
+ requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
386
+ # we want a key for every cookbook, even if no versions are available
387
+ res[cookbook.name] ||= []
388
+ res[cookbook.name] << cookbook if requirement_satisfied
389
+ res
390
+ end
391
+
392
+ sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
393
+ res[cookbook_name] = versions.sort.reverse
394
+ res
395
+ end
396
+
397
+ sorted_list
398
+ end
399
+
400
+ def self.cdb_load_filtered_recipe_list(name, couchdb=nil)
401
+ cdb_load_filtered_cookbook_versions(name, couchdb).map do |cb_name, cb|
402
+ if cb.empty? # no available versions
403
+ [] # empty list elided with flatten
404
+ else
405
+ latest_version = cb.first
406
+ latest_version.recipe_filenames_by_name.keys.map do |recipe|
407
+ case recipe
408
+ when DEFAULT
409
+ cb_name
410
+ else
411
+ "#{cb_name}::#{recipe}"
412
+ end
413
+ end
414
+ end
415
+ end.flatten
416
+ end
417
+
418
+ def self.load_filtered_recipe_list(environment)
419
+ chef_server_rest.get_rest("environments/#{environment}/recipes")
420
+ end
421
+
422
+ def to_s
423
+ @name
424
+ end
425
+
426
+ def self.validate_cookbook_versions(cv)
427
+ return false unless cv.kind_of?(Hash)
428
+ cv.each do |cookbook, version|
429
+ return false unless Chef::Environment.validate_cookbook_version(version)
430
+ end
431
+ true
432
+ end
433
+
434
+ def self.validate_cookbook_version(version)
435
+ begin
436
+ Chef::VersionConstraint.new version
437
+ true
438
+ rescue ArgumentError
439
+ false
440
+ end
441
+ end
442
+
443
+ def self.create_default_environment(couchdb=nil)
444
+ couchdb = couchdb || Chef::CouchDB.new
445
+ begin
446
+ Chef::Environment.cdb_load('_default', couchdb)
447
+ rescue Chef::Exceptions::CouchDBNotFound
448
+ env = Chef::Environment.new(couchdb)
449
+ env.name '_default'
450
+ env.description 'The default Chef environment'
451
+ env.cdb_save
452
+ end
453
+ end
454
+ end
455
+ end