TrueCar-chef 0.10.0.beta.3

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 (372) 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-server-webui.conf +10 -0
  10. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  11. data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -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-server +78 -0
  15. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  16. data/distro/arch/etc/rc.d/chef-solr +78 -0
  17. data/distro/arch/etc/rc.d/chef-solr-indexer +78 -0
  18. data/distro/common/man/man1/chef-indexer.1 +42 -0
  19. data/distro/common/man/man1/chef-server-webui.1 +106 -0
  20. data/distro/common/man/man1/chef-server.1 +107 -0
  21. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  22. data/distro/common/man/man1/chef-solr.1 +55 -0
  23. data/distro/common/man/man8/chef-client.8 +63 -0
  24. data/distro/common/man/man8/chef-solo.8 +57 -0
  25. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  26. data/distro/common/man/man8/knife.8 +1349 -0
  27. data/distro/common/man/man8/shef.8 +45 -0
  28. data/distro/common/markdown/README +3 -0
  29. data/distro/common/markdown/knife.mkd +865 -0
  30. data/distro/debian/etc/default/chef-client +4 -0
  31. data/distro/debian/etc/default/chef-server +9 -0
  32. data/distro/debian/etc/default/chef-server-webui +9 -0
  33. data/distro/debian/etc/default/chef-solr +8 -0
  34. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  35. data/distro/debian/etc/init.d/chef-client +175 -0
  36. data/distro/debian/etc/init.d/chef-server +122 -0
  37. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  38. data/distro/debian/etc/init.d/chef-solr +176 -0
  39. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  40. data/distro/debian/etc/init/chef-client.conf +17 -0
  41. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  42. data/distro/debian/etc/init/chef-server.conf +17 -0
  43. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  44. data/distro/debian/etc/init/chef-solr.conf +17 -0
  45. data/distro/redhat/etc/init.d/chef-client +106 -0
  46. data/distro/redhat/etc/init.d/chef-server +112 -0
  47. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  48. data/distro/redhat/etc/init.d/chef-solr +104 -0
  49. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  50. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  51. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  52. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  53. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  54. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  55. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  56. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  57. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  58. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  59. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  60. data/lib/chef.rb +40 -0
  61. data/lib/chef/api_client.rb +264 -0
  62. data/lib/chef/application.rb +137 -0
  63. data/lib/chef/application/agent.rb +18 -0
  64. data/lib/chef/application/client.rb +242 -0
  65. data/lib/chef/application/knife.rb +169 -0
  66. data/lib/chef/application/solo.rb +217 -0
  67. data/lib/chef/applications.rb +4 -0
  68. data/lib/chef/certificate.rb +194 -0
  69. data/lib/chef/checksum.rb +182 -0
  70. data/lib/chef/checksum_cache.rb +189 -0
  71. data/lib/chef/client.rb +362 -0
  72. data/lib/chef/config.rb +244 -0
  73. data/lib/chef/cookbook/chefignore.rb +66 -0
  74. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  75. data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
  76. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  77. data/lib/chef/cookbook/file_vendor.rb +48 -0
  78. data/lib/chef/cookbook/metadata.rb +592 -0
  79. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  80. data/lib/chef/cookbook/syntax_check.rb +136 -0
  81. data/lib/chef/cookbook_loader.rb +103 -0
  82. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  83. data/lib/chef/cookbook_uploader.rb +125 -0
  84. data/lib/chef/cookbook_version.rb +979 -0
  85. data/lib/chef/cookbook_version_selector.rb +163 -0
  86. data/lib/chef/couchdb.rb +247 -0
  87. data/lib/chef/daemon.rb +172 -0
  88. data/lib/chef/data_bag.rb +223 -0
  89. data/lib/chef/data_bag_item.rb +267 -0
  90. data/lib/chef/encrypted_data_bag_item.rb +126 -0
  91. data/lib/chef/environment.rb +386 -0
  92. data/lib/chef/exceptions.rb +153 -0
  93. data/lib/chef/file_access_control.rb +140 -0
  94. data/lib/chef/file_cache.rb +218 -0
  95. data/lib/chef/handler.rb +206 -0
  96. data/lib/chef/handler/json_file.rb +58 -0
  97. data/lib/chef/index_queue.rb +29 -0
  98. data/lib/chef/index_queue/amqp_client.rb +116 -0
  99. data/lib/chef/index_queue/consumer.rb +76 -0
  100. data/lib/chef/index_queue/indexable.rb +109 -0
  101. data/lib/chef/json_compat.rb +52 -0
  102. data/lib/chef/knife.rb +424 -0
  103. data/lib/chef/knife/bootstrap.rb +185 -0
  104. data/lib/chef/knife/bootstrap/archlinux-gems.erb +47 -0
  105. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  106. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  107. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  108. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  109. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +46 -0
  110. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  111. data/lib/chef/knife/client_bulk_delete.rb +43 -0
  112. data/lib/chef/knife/client_create.rb +73 -0
  113. data/lib/chef/knife/client_delete.rb +48 -0
  114. data/lib/chef/knife/client_edit.rb +48 -0
  115. data/lib/chef/knife/client_list.rb +43 -0
  116. data/lib/chef/knife/client_reregister.rb +59 -0
  117. data/lib/chef/knife/client_show.rb +53 -0
  118. data/lib/chef/knife/configure.rb +136 -0
  119. data/lib/chef/knife/configure_client.rb +52 -0
  120. data/lib/chef/knife/cookbook_bulk_delete.rb +61 -0
  121. data/lib/chef/knife/cookbook_create.rb +274 -0
  122. data/lib/chef/knife/cookbook_delete.rb +149 -0
  123. data/lib/chef/knife/cookbook_download.rb +134 -0
  124. data/lib/chef/knife/cookbook_list.rb +50 -0
  125. data/lib/chef/knife/cookbook_metadata.rb +102 -0
  126. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  127. data/lib/chef/knife/cookbook_show.rb +101 -0
  128. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  129. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  130. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  131. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  132. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  133. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  134. data/lib/chef/knife/cookbook_site_vendor.rb +145 -0
  135. data/lib/chef/knife/cookbook_test.rb +82 -0
  136. data/lib/chef/knife/cookbook_upload.rb +146 -0
  137. data/lib/chef/knife/data_bag_create.rb +94 -0
  138. data/lib/chef/knife/data_bag_delete.rb +51 -0
  139. data/lib/chef/knife/data_bag_edit.rb +94 -0
  140. data/lib/chef/knife/data_bag_from_file.rb +85 -0
  141. data/lib/chef/knife/data_bag_list.rb +46 -0
  142. data/lib/chef/knife/data_bag_show.rb +81 -0
  143. data/lib/chef/knife/environment_create.rb +53 -0
  144. data/lib/chef/knife/environment_delete.rb +45 -0
  145. data/lib/chef/knife/environment_edit.rb +45 -0
  146. data/lib/chef/knife/environment_from_file.rb +39 -0
  147. data/lib/chef/knife/environment_list.rb +42 -0
  148. data/lib/chef/knife/environment_show.rb +46 -0
  149. data/lib/chef/knife/exec.rb +51 -0
  150. data/lib/chef/knife/index_rebuild.rb +50 -0
  151. data/lib/chef/knife/node_bulk_delete.rb +46 -0
  152. data/lib/chef/knife/node_create.rb +50 -0
  153. data/lib/chef/knife/node_delete.rb +47 -0
  154. data/lib/chef/knife/node_edit.rb +163 -0
  155. data/lib/chef/knife/node_from_file.rb +45 -0
  156. data/lib/chef/knife/node_list.rb +46 -0
  157. data/lib/chef/knife/node_run_list_add.rb +67 -0
  158. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  159. data/lib/chef/knife/node_show.rb +62 -0
  160. data/lib/chef/knife/recipe_list.rb +33 -0
  161. data/lib/chef/knife/role_bulk_delete.rb +47 -0
  162. data/lib/chef/knife/role_create.rb +55 -0
  163. data/lib/chef/knife/role_delete.rb +47 -0
  164. data/lib/chef/knife/role_edit.rb +48 -0
  165. data/lib/chef/knife/role_from_file.rb +49 -0
  166. data/lib/chef/knife/role_list.rb +43 -0
  167. data/lib/chef/knife/role_show.rb +54 -0
  168. data/lib/chef/knife/search.rb +123 -0
  169. data/lib/chef/knife/ssh.rb +318 -0
  170. data/lib/chef/knife/status.rb +90 -0
  171. data/lib/chef/knife/subcommand_loader.rb +101 -0
  172. data/lib/chef/knife/tag_create.rb +31 -0
  173. data/lib/chef/knife/tag_delete.rb +31 -0
  174. data/lib/chef/knife/tag_list.rb +29 -0
  175. data/lib/chef/knife/ui.rb +227 -0
  176. data/lib/chef/knife/windows_bootstrap.rb +157 -0
  177. data/lib/chef/log.rb +39 -0
  178. data/lib/chef/mash.rb +211 -0
  179. data/lib/chef/mixin/check_helper.rb +31 -0
  180. data/lib/chef/mixin/checksum.rb +32 -0
  181. data/lib/chef/mixin/command.rb +221 -0
  182. data/lib/chef/mixin/command/unix.rb +215 -0
  183. data/lib/chef/mixin/command/windows.rb +76 -0
  184. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  185. data/lib/chef/mixin/create_path.rb +56 -0
  186. data/lib/chef/mixin/deep_merge.rb +225 -0
  187. data/lib/chef/mixin/deprecation.rb +65 -0
  188. data/lib/chef/mixin/from_file.rb +50 -0
  189. data/lib/chef/mixin/language.rb +165 -0
  190. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  191. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  192. data/lib/chef/mixin/params_validate.rb +225 -0
  193. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  194. data/lib/chef/mixin/shell_out.rb +40 -0
  195. data/lib/chef/mixin/template.rb +95 -0
  196. data/lib/chef/mixin/xml_escape.rb +140 -0
  197. data/lib/chef/mixins.rb +15 -0
  198. data/lib/chef/monkey_patches/dir.rb +36 -0
  199. data/lib/chef/monkey_patches/numeric.rb +7 -0
  200. data/lib/chef/monkey_patches/regexp.rb +34 -0
  201. data/lib/chef/monkey_patches/string.rb +28 -0
  202. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  203. data/lib/chef/nil_argument.rb +3 -0
  204. data/lib/chef/node.rb +661 -0
  205. data/lib/chef/node/attribute.rb +487 -0
  206. data/lib/chef/openid_registration.rb +187 -0
  207. data/lib/chef/platform.rb +409 -0
  208. data/lib/chef/provider.rb +124 -0
  209. data/lib/chef/provider/breakpoint.rb +36 -0
  210. data/lib/chef/provider/cookbook_file.rb +101 -0
  211. data/lib/chef/provider/cron.rb +186 -0
  212. data/lib/chef/provider/cron/solaris.rb +195 -0
  213. data/lib/chef/provider/deploy.rb +320 -0
  214. data/lib/chef/provider/deploy/revision.rb +80 -0
  215. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  216. data/lib/chef/provider/directory.rb +72 -0
  217. data/lib/chef/provider/env.rb +152 -0
  218. data/lib/chef/provider/env/windows.rb +75 -0
  219. data/lib/chef/provider/erl_call.rb +100 -0
  220. data/lib/chef/provider/execute.rb +60 -0
  221. data/lib/chef/provider/file.rb +222 -0
  222. data/lib/chef/provider/git.rb +221 -0
  223. data/lib/chef/provider/group.rb +133 -0
  224. data/lib/chef/provider/group/aix.rb +70 -0
  225. data/lib/chef/provider/group/dscl.rb +121 -0
  226. data/lib/chef/provider/group/gpasswd.rb +53 -0
  227. data/lib/chef/provider/group/groupadd.rb +81 -0
  228. data/lib/chef/provider/group/pw.rb +84 -0
  229. data/lib/chef/provider/group/usermod.rb +57 -0
  230. data/lib/chef/provider/group/windows.rb +79 -0
  231. data/lib/chef/provider/http_request.rb +122 -0
  232. data/lib/chef/provider/ifconfig.rb +132 -0
  233. data/lib/chef/provider/link.rb +161 -0
  234. data/lib/chef/provider/log.rb +54 -0
  235. data/lib/chef/provider/mdadm.rb +91 -0
  236. data/lib/chef/provider/mount.rb +117 -0
  237. data/lib/chef/provider/mount/mount.rb +232 -0
  238. data/lib/chef/provider/mount/windows.rb +80 -0
  239. data/lib/chef/provider/ohai.rb +41 -0
  240. data/lib/chef/provider/package.rb +160 -0
  241. data/lib/chef/provider/package/apt.rb +110 -0
  242. data/lib/chef/provider/package/dpkg.rb +112 -0
  243. data/lib/chef/provider/package/easy_install.rb +136 -0
  244. data/lib/chef/provider/package/freebsd.rb +123 -0
  245. data/lib/chef/provider/package/macports.rb +105 -0
  246. data/lib/chef/provider/package/pacman.rb +101 -0
  247. data/lib/chef/provider/package/portage.rb +135 -0
  248. data/lib/chef/provider/package/rpm.rb +101 -0
  249. data/lib/chef/provider/package/rubygems.rb +462 -0
  250. data/lib/chef/provider/package/solaris.rb +127 -0
  251. data/lib/chef/provider/package/yum-dump.py +128 -0
  252. data/lib/chef/provider/package/yum.rb +261 -0
  253. data/lib/chef/provider/package/zypper.rb +133 -0
  254. data/lib/chef/provider/remote_directory.rb +138 -0
  255. data/lib/chef/provider/remote_file.rb +119 -0
  256. data/lib/chef/provider/route.rb +195 -0
  257. data/lib/chef/provider/ruby_block.rb +33 -0
  258. data/lib/chef/provider/script.rb +55 -0
  259. data/lib/chef/provider/service.rb +128 -0
  260. data/lib/chef/provider/service/arch.rb +109 -0
  261. data/lib/chef/provider/service/debian.rb +130 -0
  262. data/lib/chef/provider/service/freebsd.rb +156 -0
  263. data/lib/chef/provider/service/gentoo.rb +54 -0
  264. data/lib/chef/provider/service/init.rb +71 -0
  265. data/lib/chef/provider/service/insserv.rb +52 -0
  266. data/lib/chef/provider/service/redhat.rb +60 -0
  267. data/lib/chef/provider/service/simple.rb +118 -0
  268. data/lib/chef/provider/service/solaris.rb +85 -0
  269. data/lib/chef/provider/service/upstart.rb +192 -0
  270. data/lib/chef/provider/service/windows.rb +146 -0
  271. data/lib/chef/provider/subversion.rb +194 -0
  272. data/lib/chef/provider/template.rb +105 -0
  273. data/lib/chef/provider/user.rb +187 -0
  274. data/lib/chef/provider/user/dscl.rb +280 -0
  275. data/lib/chef/provider/user/pw.rb +113 -0
  276. data/lib/chef/provider/user/useradd.rb +137 -0
  277. data/lib/chef/provider/user/windows.rb +124 -0
  278. data/lib/chef/providers.rb +93 -0
  279. data/lib/chef/recipe.rb +128 -0
  280. data/lib/chef/resource.rb +530 -0
  281. data/lib/chef/resource/apt_package.rb +34 -0
  282. data/lib/chef/resource/bash.rb +33 -0
  283. data/lib/chef/resource/breakpoint.rb +35 -0
  284. data/lib/chef/resource/cookbook_file.rb +45 -0
  285. data/lib/chef/resource/cron.rb +188 -0
  286. data/lib/chef/resource/csh.rb +33 -0
  287. data/lib/chef/resource/deploy.rb +371 -0
  288. data/lib/chef/resource/deploy_revision.rb +35 -0
  289. data/lib/chef/resource/directory.rb +76 -0
  290. data/lib/chef/resource/dpkg_package.rb +34 -0
  291. data/lib/chef/resource/easy_install_package.rb +57 -0
  292. data/lib/chef/resource/env.rb +58 -0
  293. data/lib/chef/resource/erl_call.rb +83 -0
  294. data/lib/chef/resource/execute.rb +127 -0
  295. data/lib/chef/resource/file.rb +99 -0
  296. data/lib/chef/resource/freebsd_package.rb +35 -0
  297. data/lib/chef/resource/gem_package.rb +53 -0
  298. data/lib/chef/resource/git.rb +37 -0
  299. data/lib/chef/resource/group.rb +70 -0
  300. data/lib/chef/resource/http_request.rb +61 -0
  301. data/lib/chef/resource/ifconfig.rb +134 -0
  302. data/lib/chef/resource/link.rb +78 -0
  303. data/lib/chef/resource/log.rb +62 -0
  304. data/lib/chef/resource/macports_package.rb +29 -0
  305. data/lib/chef/resource/mdadm.rb +82 -0
  306. data/lib/chef/resource/mount.rb +135 -0
  307. data/lib/chef/resource/ohai.rb +40 -0
  308. data/lib/chef/resource/package.rb +80 -0
  309. data/lib/chef/resource/pacman_package.rb +33 -0
  310. data/lib/chef/resource/perl.rb +33 -0
  311. data/lib/chef/resource/portage_package.rb +33 -0
  312. data/lib/chef/resource/python.rb +33 -0
  313. data/lib/chef/resource/remote_directory.rb +109 -0
  314. data/lib/chef/resource/remote_file.rb +83 -0
  315. data/lib/chef/resource/route.rb +135 -0
  316. data/lib/chef/resource/rpm_package.rb +34 -0
  317. data/lib/chef/resource/ruby.rb +33 -0
  318. data/lib/chef/resource/ruby_block.rb +40 -0
  319. data/lib/chef/resource/scm.rb +147 -0
  320. data/lib/chef/resource/script.rb +60 -0
  321. data/lib/chef/resource/service.rb +160 -0
  322. data/lib/chef/resource/solaris_package.rb +36 -0
  323. data/lib/chef/resource/subversion.rb +36 -0
  324. data/lib/chef/resource/template.rb +69 -0
  325. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  326. data/lib/chef/resource/user.rb +130 -0
  327. data/lib/chef/resource/yum_package.rb +43 -0
  328. data/lib/chef/resource_collection.rb +217 -0
  329. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  330. data/lib/chef/resource_definition.rb +67 -0
  331. data/lib/chef/resource_definition_list.rb +38 -0
  332. data/lib/chef/resources.rb +64 -0
  333. data/lib/chef/rest.rb +386 -0
  334. data/lib/chef/rest/auth_credentials.rb +71 -0
  335. data/lib/chef/rest/cookie_jar.rb +31 -0
  336. data/lib/chef/rest/rest_request.rb +188 -0
  337. data/lib/chef/role.rb +341 -0
  338. data/lib/chef/run_context.rb +126 -0
  339. data/lib/chef/run_list.rb +165 -0
  340. data/lib/chef/run_list/run_list_expansion.rb +193 -0
  341. data/lib/chef/run_list/run_list_item.rb +92 -0
  342. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  343. data/lib/chef/run_status.rb +121 -0
  344. data/lib/chef/runner.rb +99 -0
  345. data/lib/chef/sandbox.rb +153 -0
  346. data/lib/chef/search/query.rb +65 -0
  347. data/lib/chef/shef.rb +326 -0
  348. data/lib/chef/shef/ext.rb +569 -0
  349. data/lib/chef/shef/model_wrapper.rb +120 -0
  350. data/lib/chef/shef/shef_rest.rb +28 -0
  351. data/lib/chef/shef/shef_session.rb +284 -0
  352. data/lib/chef/shell_out.rb +238 -0
  353. data/lib/chef/shell_out/unix.rb +223 -0
  354. data/lib/chef/shell_out/windows.rb +98 -0
  355. data/lib/chef/solr_query.rb +187 -0
  356. data/lib/chef/solr_query/lucene.treetop +150 -0
  357. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  358. data/lib/chef/solr_query/query_transform.rb +65 -0
  359. data/lib/chef/solr_query/solr_http_request.rb +118 -0
  360. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  361. data/lib/chef/tasks/chef_repo.rake +256 -0
  362. data/lib/chef/util/file_edit.rb +122 -0
  363. data/lib/chef/util/windows.rb +56 -0
  364. data/lib/chef/util/windows/net_group.rb +101 -0
  365. data/lib/chef/util/windows/net_use.rb +121 -0
  366. data/lib/chef/util/windows/net_user.rb +198 -0
  367. data/lib/chef/util/windows/volume.rb +59 -0
  368. data/lib/chef/version.rb +23 -0
  369. data/lib/chef/version_class.rb +70 -0
  370. data/lib/chef/version_constraint.rb +116 -0
  371. data/lib/chef/webui_user.rb +231 -0
  372. metadata +600 -0
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 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
+ # == String (Patch)
20
+ # On ruby 1.9, Strings are aware of multibyte characters, so +size+ and +length+
21
+ # give the actual number of characters. In Chef::REST, we need the bytesize
22
+ # so we can correctly set the Content-Length headers, but ruby 1.8.6 and lower
23
+ # don't define String#bytesize. Monkey patching time!
24
+ class String
25
+ unless method_defined?(:bytesize)
26
+ alias :bytesize :size
27
+ end
28
+ end
@@ -0,0 +1,64 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 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
+ # == Tempfile (Patch)
20
+ # Tempfile has a horrible bug where it causes an IOError: closed stream in its
21
+ # finalizer, leading to intermittent application crashes with confusing stack
22
+ # traces. Here we monkey patch the fix into place. You can track the bug on
23
+ # ruby's redmine: http://redmine.ruby-lang.org/issues/show/3119
24
+ #
25
+ # The patch is slightly different for Ruby 1.8 and Ruby 1.9, both patches are
26
+ # included here.
27
+ class Tempfile # :nodoc:
28
+ # Tempfile has changes between 1.8.x and 1.9.x
29
+ # so we monkey patch separately
30
+ if RUBY_VERSION =~ /^1\.8/
31
+ def unlink
32
+ # keep this order for thread safeness
33
+ begin
34
+ File.unlink(@tmpname) if File.exist?(@tmpname)
35
+ @@cleanlist.delete(@tmpname)
36
+ @tmpname = nil
37
+ ObjectSpace.undefine_finalizer(self)
38
+ rescue Errno::EACCES
39
+ # may not be able to unlink on Windows; just ignore
40
+ end
41
+ end
42
+ alias delete unlink
43
+
44
+
45
+ # There is a patch for this, to be merged into 1.9 at some point.
46
+ # When that happens, we'll want to also check the RUBY_PATCHLEVEL
47
+ elsif RUBY_VERSION =~ /^1\.9/
48
+ def unlink
49
+ # keep this order for thread safeness
50
+ return unless @tmpname
51
+ begin
52
+ if File.exist?(@tmpname)
53
+ File.unlink(@tmpname)
54
+ end
55
+ # remove tmpname from remover
56
+ @data[0] = @data[2] = nil
57
+ @tmpname = nil
58
+ rescue Errno::EACCES
59
+ # may not be able to unlink on Windows; just ignore
60
+ end
61
+ end
62
+ alias delete unlink
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ class Chef
2
+ NIL_ARGUMENT = Object.new
3
+ end
@@ -0,0 +1,661 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Author:: Christopher Walters (<cw@opscode.com>)
5
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
6
+ # Copyright:: Copyright (c) 2008-2011 Opscode, Inc.
7
+ # License:: Apache License, Version 2.0
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+
22
+ require 'chef/config'
23
+ require 'chef/cookbook/cookbook_collection'
24
+ require 'chef/nil_argument'
25
+ require 'chef/mixin/check_helper'
26
+ require 'chef/mixin/params_validate'
27
+ require 'chef/mixin/from_file'
28
+ require 'chef/mixin/language_include_attribute'
29
+ require 'chef/mixin/deep_merge'
30
+ require 'chef/environment'
31
+ require 'chef/couchdb'
32
+ require 'chef/rest'
33
+ require 'chef/run_list'
34
+ require 'chef/node/attribute'
35
+ require 'chef/index_queue'
36
+ require 'chef/mash'
37
+ require 'chef/json_compat'
38
+
39
+ class Chef
40
+ class Node
41
+
42
+ attr_accessor :recipe_list, :couchdb, :couchdb_rev, :run_state, :run_list
43
+ attr_accessor :override_attrs, :default_attrs, :normal_attrs, :automatic_attrs
44
+ attr_reader :couchdb_id
45
+
46
+ # TODO: 5/18/2010 cw/timh. cookbook_collection should be removed
47
+ # from here and for any place it's needed, it should be accessed
48
+ # through a Chef::RunContext
49
+ attr_accessor :cookbook_collection
50
+
51
+ include Chef::Mixin::CheckHelper
52
+ include Chef::Mixin::FromFile
53
+ include Chef::Mixin::ParamsValidate
54
+ include Chef::Mixin::LanguageIncludeAttribute
55
+ include Chef::IndexQueue::Indexable
56
+
57
+ DESIGN_DOCUMENT = {
58
+ "version" => 11,
59
+ "language" => "javascript",
60
+ "views" => {
61
+ "all" => {
62
+ "map" => <<-EOJS
63
+ function(doc) {
64
+ if (doc.chef_type == "node") {
65
+ emit(doc.name, doc);
66
+ }
67
+ }
68
+ EOJS
69
+ },
70
+ "all_id" => {
71
+ "map" => <<-EOJS
72
+ function(doc) {
73
+ if (doc.chef_type == "node") {
74
+ emit(doc.name, doc.name);
75
+ }
76
+ }
77
+ EOJS
78
+ },
79
+ "status" => {
80
+ "map" => <<-EOJS
81
+ function(doc) {
82
+ if (doc.chef_type == "node") {
83
+ var to_emit = { "name": doc.name, "chef_environment": doc.chef_environment };
84
+ if (doc["attributes"]["fqdn"]) {
85
+ to_emit["fqdn"] = doc["attributes"]["fqdn"];
86
+ } else {
87
+ to_emit["fqdn"] = "Undefined";
88
+ }
89
+ if (doc["attributes"]["ipaddress"]) {
90
+ to_emit["ipaddress"] = doc["attributes"]["ipaddress"];
91
+ } else {
92
+ to_emit["ipaddress"] = "Undefined";
93
+ }
94
+ if (doc["attributes"]["ohai_time"]) {
95
+ to_emit["ohai_time"] = doc["attributes"]["ohai_time"];
96
+ } else {
97
+ to_emit["ohai_time"] = "Undefined";
98
+ }
99
+ if (doc["attributes"]["uptime"]) {
100
+ to_emit["uptime"] = doc["attributes"]["uptime"];
101
+ } else {
102
+ to_emit["uptime"] = "Undefined";
103
+ }
104
+ if (doc["attributes"]["platform"]) {
105
+ to_emit["platform"] = doc["attributes"]["platform"];
106
+ } else {
107
+ to_emit["platform"] = "Undefined";
108
+ }
109
+ if (doc["attributes"]["platform_version"]) {
110
+ to_emit["platform_version"] = doc["attributes"]["platform_version"];
111
+ } else {
112
+ to_emit["platform_version"] = "Undefined";
113
+ }
114
+ if (doc["run_list"]) {
115
+ to_emit["run_list"] = doc["run_list"];
116
+ } else {
117
+ to_emit["run_list"] = "Undefined";
118
+ }
119
+ emit(doc.name, to_emit);
120
+ }
121
+ }
122
+ EOJS
123
+ },
124
+ "by_run_list" => {
125
+ "map" => <<-EOJS
126
+ function(doc) {
127
+ if (doc.chef_type == "node") {
128
+ if (doc['run_list']) {
129
+ for (var i=0; i < doc.run_list.length; i++) {
130
+ emit(doc['run_list'][i], doc.name);
131
+ }
132
+ }
133
+ }
134
+ }
135
+ EOJS
136
+ },
137
+ "by_environment" => {
138
+ "map" => <<-EOJS
139
+ function(doc) {
140
+ if (doc.chef_type == "node") {
141
+ var env = (doc['chef_environment'] == null ? "_default" : doc['chef_environment']);
142
+ emit(env, doc.name);
143
+ }
144
+ }
145
+ EOJS
146
+ }
147
+ },
148
+ }
149
+
150
+ # Create a new Chef::Node object.
151
+ def initialize(couchdb=nil)
152
+ @name = nil
153
+
154
+ @chef_environment = '_default'
155
+ @normal_attrs = Mash.new
156
+ @override_attrs = Mash.new
157
+ @default_attrs = Mash.new
158
+ @automatic_attrs = Mash.new
159
+ @run_list = Chef::RunList.new
160
+
161
+ @couchdb_rev = nil
162
+ @couchdb_id = nil
163
+ @couchdb = couchdb || Chef::CouchDB.new
164
+
165
+ @run_state = {
166
+ :template_cache => Hash.new,
167
+ :seen_recipes => Hash.new,
168
+ :seen_attributes => Hash.new
169
+ }
170
+ # TODO: 5/20/2010 need this here as long as other objects try to access
171
+ # the cookbook collection via Node, otherwise get NoMethodError on nil.
172
+ @cookbook_collection = CookbookCollection.new
173
+ end
174
+
175
+ def couchdb_id=(value)
176
+ @couchdb_id = value
177
+ @index_id = value
178
+ end
179
+
180
+ # Used by DSL
181
+ def node
182
+ self
183
+ end
184
+
185
+ def chef_server_rest
186
+ Chef::REST.new(Chef::Config[:chef_server_url])
187
+ end
188
+
189
+ # Find a recipe for this Chef::Node by fqdn. Will search first for
190
+ # Chef::Config["node_path"]/fqdn.rb, then hostname.rb, then default.rb.
191
+ #
192
+ # Returns a new Chef::Node object.
193
+ #
194
+ # Raises an ArgumentError if it cannot find the node.
195
+ def find_file(fqdn)
196
+ host_parts = fqdn.split(".")
197
+ hostname = host_parts[0]
198
+
199
+ [fqdn, hostname, "default"].each { |fname|
200
+ node_file = File.join(Chef::Config[:node_path], "#{fname.to_s}.rb")
201
+ return self.from_file(node_file) if File.exists?(node_file)
202
+ }
203
+
204
+ raise ArgumentError, "Cannot find a node matching #{fqdn}, not even with default.rb!"
205
+ end
206
+
207
+ # Set the name of this Node, or return the current name.
208
+ def name(arg=nil)
209
+ if arg != nil
210
+ validate(
211
+ {:name => arg },
212
+ {:name => { :kind_of => String,
213
+ :cannot_be => :blank,
214
+ :regex => /^[\-[:alnum:]_:.]+$/}
215
+ })
216
+ @name = arg
217
+ else
218
+ @name
219
+ end
220
+ end
221
+
222
+ def chef_environment(arg=nil)
223
+ set_or_return(
224
+ :chef_environment,
225
+ arg,
226
+ { :regex => /^[\-[:alnum:]_]+$/, :kind_of => String }
227
+ )
228
+ end
229
+
230
+ # Used by the DSL
231
+ def attribute
232
+ construct_attributes
233
+ end
234
+
235
+ def construct_attributes
236
+ Chef::Node::Attribute.new(normal_attrs, default_attrs, override_attrs, automatic_attrs)
237
+ end
238
+
239
+ def attribute=(value)
240
+ self.normal_attrs = value
241
+ end
242
+
243
+ # Return an attribute of this node. Returns nil if the attribute is not found.
244
+ def [](attrib)
245
+ construct_attributes[attrib]
246
+ end
247
+
248
+ # Set an attribute of this node
249
+ def []=(attrib, value)
250
+ construct_attributes[attrib] = value
251
+ end
252
+
253
+ def store(attrib, value)
254
+ self[attrib] = value
255
+ end
256
+
257
+ # Set a normal attribute of this node, but auto-vivifiy any Mashes that
258
+ # might be missing
259
+ def normal
260
+ attrs = construct_attributes
261
+ attrs.set_type = :normal
262
+ attrs.auto_vivifiy_on_read = true
263
+ attrs
264
+ end
265
+
266
+ alias_method :set, :normal
267
+
268
+ # Set a normal attribute of this node, auto-vivifiying any mashes that are
269
+ # missing, but if the final value already exists, don't set it
270
+ def normal_unless
271
+ attrs = construct_attributes
272
+ attrs.set_type = :normal
273
+ attrs.auto_vivifiy_on_read = true
274
+ attrs.set_unless_value_present = true
275
+ attrs
276
+ end
277
+ alias_method :set_unless, :normal_unless
278
+
279
+ # Set a default of this node, but auto-vivifiy any Mashes that might
280
+ # be missing
281
+ def default
282
+ attrs = construct_attributes
283
+ attrs.set_type = :default
284
+ attrs.auto_vivifiy_on_read = true
285
+ attrs
286
+ end
287
+
288
+ # Set a default attribute of this node, auto-vivifiying any mashes that are
289
+ # missing, but if the final value already exists, don't set it
290
+ def default_unless
291
+ attrs = construct_attributes
292
+ attrs.set_type = :default
293
+ attrs.auto_vivifiy_on_read = true
294
+ attrs.set_unless_value_present = true
295
+ attrs
296
+ end
297
+
298
+ # Set an override attribute of this node, but auto-vivifiy any Mashes that
299
+ # might be missing
300
+ def override
301
+ attrs = construct_attributes
302
+ attrs.set_type = :override
303
+ attrs.auto_vivifiy_on_read = true
304
+ attrs
305
+ end
306
+
307
+ # Set an override attribute of this node, auto-vivifiying any mashes that
308
+ # are missing, but if the final value already exists, don't set it
309
+ def override_unless
310
+ attrs = construct_attributes
311
+ attrs.set_type = :override
312
+ attrs.auto_vivifiy_on_read = true
313
+ attrs.set_unless_value_present = true
314
+ attrs
315
+ end
316
+
317
+ # Return true if this Node has a given attribute, false if not. Takes either a symbol or
318
+ # a string.
319
+ #
320
+ # Only works on the top level. Preferred way is to use the normal [] style
321
+ # lookup and call attribute?()
322
+ def attribute?(attrib)
323
+ construct_attributes.attribute?(attrib)
324
+ end
325
+
326
+ # Yield each key of the top level to the block.
327
+ def each(&block)
328
+ construct_attributes.each(&block)
329
+ end
330
+
331
+ # Iterates over each attribute, passing the attribute and value to the block.
332
+ def each_attribute(&block)
333
+ construct_attributes.each_attribute(&block)
334
+ end
335
+
336
+ # Encouraged to only get used for lookups - while you can do sets from here, it's not as explicit
337
+ # as using the normal/default/override interface.
338
+ def method_missing(symbol, *args)
339
+ attrs = construct_attributes
340
+ attrs.send(symbol, *args)
341
+ end
342
+
343
+ # Returns true if this Node expects a given recipe, false if not.
344
+ #
345
+ # First, the run list is consulted to see whether the recipe is
346
+ # explicitly included. If it's not there, it looks in
347
+ # run_state[:seen_recipes], which is populated by include_recipe
348
+ # statements in the DSL (and thus would not be in the run list).
349
+ #
350
+ # NOTE: It's used by cookbook authors
351
+ def recipe?(recipe_name)
352
+ run_list.include?(recipe_name) || run_state[:seen_recipes].include?(recipe_name)
353
+ end
354
+
355
+ # Returns true if this Node expects a given role, false if not.
356
+ def role?(role_name)
357
+ run_list.include?("role[#{role_name}]")
358
+ end
359
+
360
+ # Returns an Array of roles and recipes, in the order they will be applied.
361
+ # If you call it with arguments, they will become the new list of roles and recipes.
362
+ def run_list(*args)
363
+ args.length > 0 ? @run_list.reset!(args) : @run_list
364
+ end
365
+
366
+ def recipes(*args)
367
+ Chef::Log.warn "Chef::Node#recipes method is deprecated. Please use Chef::Node#run_list"
368
+ run_list(*args)
369
+ end
370
+
371
+ # Returns true if this Node expects a given role, false if not.
372
+ def run_list?(item)
373
+ run_list.detect { |r| r == item } ? true : false
374
+ end
375
+
376
+ # Consume data from ohai and Attributes provided as JSON on the command line.
377
+ def consume_external_attrs(ohai_data, json_cli_attrs)
378
+ Chef::Log.debug("Extracting run list from JSON attributes provided on command line")
379
+ consume_attributes(json_cli_attrs)
380
+
381
+ @automatic_attrs = ohai_data
382
+
383
+ platform, version = Chef::Platform.find_platform_and_version(self)
384
+ Chef::Log.debug("Platform is #{platform} version #{version}")
385
+ @automatic_attrs[:platform] = platform
386
+ @automatic_attrs[:platform_version] = version
387
+ end
388
+
389
+ # Consumes the combined run_list and other attributes in +attrs+
390
+ def consume_attributes(attrs)
391
+ normal_attrs_to_merge = consume_run_list(attrs)
392
+ Chef::Log.debug("Applying attributes from json file")
393
+ @normal_attrs = Chef::Mixin::DeepMerge.merge(@normal_attrs,normal_attrs_to_merge)
394
+ self.tags # make sure they're defined
395
+ end
396
+
397
+ # Lazy initializer for tags attribute
398
+ def tags
399
+ self[:tags] = [] unless attribute?(:tags)
400
+ self[:tags]
401
+ end
402
+
403
+ # Extracts the run list from +attrs+ and applies it. Returns the remaining attributes
404
+ def consume_run_list(attrs)
405
+ attrs = attrs ? attrs.dup : {}
406
+ if new_run_list = attrs.delete("recipes") || attrs.delete("run_list")
407
+ if attrs.key?("recipes") || attrs.key?("run_list")
408
+ raise Chef::Exceptions::AmbiguousRunlistSpecification, "please set the node's run list using the 'run_list' attribute only."
409
+ end
410
+ Chef::Log.info("Setting the run_list to #{new_run_list.inspect} from JSON")
411
+ run_list(new_run_list)
412
+ end
413
+ attrs
414
+ end
415
+
416
+ # Clear defaults and overrides, so that any deleted attributes
417
+ # between runs are still gone.
418
+ def reset_defaults_and_overrides
419
+ @default_attrs = Mash.new
420
+ @override_attrs = Mash.new
421
+ end
422
+
423
+ # Expands the node's run list and sets the default and override
424
+ # attributes. Also applies stored attributes (from json provided
425
+ # on the command line)
426
+ #
427
+ # Returns the fully-expanded list of recipes, a RunListExpansion.
428
+ #
429
+ #--
430
+ # TODO: timh/cw, 5-14-2010: Should this method exist? Should we
431
+ # instead modify default_attrs and override_attrs whenever our
432
+ # run_list is mutated? Or perhaps do something smarter like
433
+ # on-demand generation of default_attrs and override_attrs,
434
+ # invalidated only when run_list is mutated?
435
+ def expand!(data_source = 'server')
436
+ expansion = run_list.expand(chef_environment, data_source)
437
+ raise Chef::Exceptions::MissingRole if expansion.errors?
438
+
439
+ self.tags # make sure they're defined
440
+
441
+ @automatic_attrs[:recipes] = expansion.recipes
442
+ @automatic_attrs[:roles] = expansion.roles
443
+
444
+ expansion
445
+ end
446
+
447
+ # Apply the default and overrides attributes from the expansion
448
+ # passed in, which came from roles.
449
+ def apply_expansion_attributes(expansion)
450
+ @default_attrs = Chef::Mixin::DeepMerge.merge(default_attrs, expansion.default_attrs)
451
+ environment_attrs = chef_environment == "_default" ? {} : Chef::Environment.load(chef_environment).attributes
452
+ overrides_before_environments = Chef::Mixin::DeepMerge.merge(override_attrs, expansion.override_attrs)
453
+ @override_attrs = Chef::Mixin::DeepMerge.merge(overrides_before_environments, environment_attrs)
454
+ end
455
+
456
+ # Transform the node to a Hash
457
+ def to_hash
458
+ index_hash = Hash.new
459
+ index_hash["chef_type"] = "node"
460
+ index_hash["name"] = name
461
+ index_hash["chef_environment"] = chef_environment
462
+ attribute.each do |key, value|
463
+ index_hash[key] = value
464
+ end
465
+ index_hash["recipe"] = run_list.recipe_names if run_list.recipe_names.length > 0
466
+ index_hash["role"] = run_list.role_names if run_list.role_names.length > 0
467
+ index_hash["run_list"] = run_list.run_list if run_list.run_list.length > 0
468
+ index_hash
469
+ end
470
+
471
+ # Serialize this object as a hash
472
+ def to_json(*a)
473
+ result = {
474
+ "name" => name,
475
+ "chef_environment" => chef_environment,
476
+ 'json_class' => self.class.name,
477
+ "automatic" => automatic_attrs,
478
+ "normal" => normal_attrs,
479
+ "chef_type" => "node",
480
+ "default" => default_attrs,
481
+ "override" => override_attrs,
482
+ "run_list" => run_list.run_list
483
+ }
484
+ result["_rev"] = couchdb_rev if couchdb_rev
485
+ result.to_json(*a)
486
+ end
487
+
488
+ def update_from!(o)
489
+ run_list.reset!(o.run_list)
490
+ @automatic_attrs = o.automatic_attrs
491
+ @normal_attrs = o.normal_attrs
492
+ @override_attrs = o.override_attrs
493
+ @default_attrs = o.default_attrs
494
+ chef_environment(o.chef_environment)
495
+ self
496
+ end
497
+
498
+ # Create a Chef::Node from JSON
499
+ def self.json_create(o)
500
+ node = new
501
+ node.name(o["name"])
502
+ node.chef_environment(o["chef_environment"])
503
+ if o.has_key?("attributes")
504
+ node.normal_attrs = o["attributes"]
505
+ end
506
+ node.automatic_attrs = Mash.new(o["automatic"]) if o.has_key?("automatic")
507
+ node.normal_attrs = Mash.new(o["normal"]) if o.has_key?("normal")
508
+ node.default_attrs = Mash.new(o["default"]) if o.has_key?("default")
509
+ node.override_attrs = Mash.new(o["override"]) if o.has_key?("override")
510
+
511
+ if o.has_key?("run_list")
512
+ node.run_list.reset!(o["run_list"])
513
+ else
514
+ o["recipes"].each { |r| node.recipes << r }
515
+ end
516
+ node.couchdb_rev = o["_rev"] if o.has_key?("_rev")
517
+ node.couchdb_id = o["_id"] if o.has_key?("_id")
518
+ node.index_id = node.couchdb_id
519
+ node
520
+ end
521
+
522
+ def self.cdb_list_by_environment(environment, inflate=false, couchdb=nil)
523
+ rs = (couchdb || Chef::CouchDB.new).get_view("nodes", "by_environment", :include_docs => inflate, :startkey => environment, :endkey => environment)
524
+ inflate ? rs["rows"].collect {|r| r["doc"]} : rs["rows"].collect {|r| r["value"]}
525
+ end
526
+
527
+ def self.list_by_environment(environment, inflate=false)
528
+ if inflate
529
+ response = Hash.new
530
+ Chef::Search::Query.new.search(:node, "chef_environment:#{environment}") {|n| response[n.name] = n unless n.nil?}
531
+ response
532
+ else
533
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("environments/#{environment}/nodes")
534
+ end
535
+ end
536
+
537
+ # List all the Chef::Node objects in the CouchDB. If inflate is set to true, you will get
538
+ # the full list of all Nodes, fully inflated.
539
+ def self.cdb_list(inflate=false, couchdb=nil)
540
+ rs =(couchdb || Chef::CouchDB.new).list("nodes", inflate)
541
+ lookup = (inflate ? "value" : "key")
542
+ rs["rows"].collect { |r| r[lookup] }
543
+ end
544
+
545
+ def self.list(inflate=false)
546
+ if inflate
547
+ response = Hash.new
548
+ Chef::Search::Query.new.search(:node) do |n|
549
+ response[n.name] = n unless n.nil?
550
+ end
551
+ response
552
+ else
553
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes")
554
+ end
555
+ end
556
+
557
+ # Load a node by name from CouchDB
558
+ def self.cdb_load(name, couchdb=nil)
559
+ (couchdb || Chef::CouchDB.new).load("node", name)
560
+ end
561
+
562
+ def self.exists?(nodename, couchdb)
563
+ begin
564
+ self.cdb_load(nodename, couchdb)
565
+ rescue Chef::Exceptions::CouchDBNotFound
566
+ nil
567
+ end
568
+ end
569
+
570
+ def self.find_or_create(node_name)
571
+ load(node_name)
572
+ rescue Net::HTTPServerException => e
573
+ raise unless e.response.code == '404'
574
+ node = build(node_name)
575
+ node.create
576
+ end
577
+
578
+ def self.build(node_name)
579
+ node = new
580
+ node.name(node_name)
581
+ node.chef_environment(Chef::Config[:environment]) unless Chef::Config[:environment].nil? || Chef::Config[:environment].chop.empty?
582
+ node
583
+ end
584
+
585
+ # Load a node by name
586
+ def self.load(name)
587
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes/#{name}")
588
+ end
589
+
590
+ # Remove this node from the CouchDB
591
+ def cdb_destroy
592
+ couchdb.delete("node", name, couchdb_rev)
593
+ end
594
+
595
+ # Remove this node via the REST API
596
+ def destroy
597
+ chef_server_rest.delete_rest("nodes/#{name}")
598
+ end
599
+
600
+ # Save this node to the CouchDB
601
+ def cdb_save
602
+ @couchdb_rev = couchdb.store("node", name, self)["rev"]
603
+ end
604
+
605
+ # Save this node via the REST API
606
+ def save
607
+ # Try PUT. If the node doesn't yet exist, PUT will return 404,
608
+ # so then POST to create.
609
+ begin
610
+ chef_server_rest.put_rest("nodes/#{name}", self)
611
+ rescue Net::HTTPServerException => e
612
+ raise e unless e.response.code == "404"
613
+ chef_server_rest.post_rest("nodes", self)
614
+ end
615
+ self
616
+ end
617
+
618
+ # Create the node via the REST API
619
+ def create
620
+ chef_server_rest.post_rest("nodes", self)
621
+ self
622
+ end
623
+
624
+ # Set up our CouchDB design document
625
+ def self.create_design_document(couchdb=nil)
626
+ (couchdb || Chef::CouchDB.new).create_design_document("nodes", DESIGN_DOCUMENT)
627
+ end
628
+
629
+ def to_s
630
+ "node[#{name}]"
631
+ end
632
+
633
+ # Load all attribute files for all cookbooks associated with this
634
+ # node.
635
+ def load_attributes
636
+ cookbook_collection.values.each do |cookbook|
637
+ cookbook.segment_filenames(:attributes).each do |segment_filename|
638
+ Chef::Log.debug("node #{name} loading cookbook #{cookbook.name}'s attribute file #{segment_filename}")
639
+ self.from_file(segment_filename)
640
+ end
641
+ end
642
+ end
643
+
644
+ # Used by DSL.
645
+ # Loads the attribute file specified by the short name of the
646
+ # file, e.g., loads specified cookbook's
647
+ # "attributes/mailservers.rb"
648
+ # if passed
649
+ # "mailservers"
650
+ def load_attribute_by_short_filename(name, src_cookbook_name)
651
+ src_cookbook = cookbook_collection[src_cookbook_name]
652
+ raise Chef::Exceptions::CookbookNotFound, "could not find cookbook #{src_cookbook_name} while loading attribute #{name}" unless src_cookbook
653
+
654
+ attribute_filename = src_cookbook.attribute_filenames_by_short_filename[name]
655
+ raise Chef::Exceptions::AttributeNotFound, "could not find filename for attribute #{name} in cookbook #{src_cookbook_name}" unless attribute_filename
656
+
657
+ self.from_file(attribute_filename)
658
+ self
659
+ end
660
+ end
661
+ end