mbailey-chef 0.9.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +172 -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/common/man/man1/chef-indexer.1 +42 -0
  9. data/distro/common/man/man1/chef-server-webui.1 +106 -0
  10. data/distro/common/man/man1/chef-server.1 +107 -0
  11. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  12. data/distro/common/man/man1/chef-solr.1 +55 -0
  13. data/distro/common/man/man8/chef-client.8 +63 -0
  14. data/distro/common/man/man8/chef-solo.8 +57 -0
  15. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  16. data/distro/common/man/man8/knife.8 +1349 -0
  17. data/distro/common/man/man8/shef.8 +45 -0
  18. data/distro/common/markdown/README +3 -0
  19. data/distro/common/markdown/knife.mkd +832 -0
  20. data/distro/debian/etc/default/chef-client +4 -0
  21. data/distro/debian/etc/default/chef-server +9 -0
  22. data/distro/debian/etc/default/chef-server-webui +9 -0
  23. data/distro/debian/etc/default/chef-solr +7 -0
  24. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  25. data/distro/debian/etc/init/chef-client.conf +17 -0
  26. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  27. data/distro/debian/etc/init/chef-server.conf +17 -0
  28. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  29. data/distro/debian/etc/init/chef-solr.conf +17 -0
  30. data/distro/debian/etc/init.d/chef-client +175 -0
  31. data/distro/debian/etc/init.d/chef-server +122 -0
  32. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  33. data/distro/debian/etc/init.d/chef-solr +177 -0
  34. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  35. data/distro/redhat/etc/init.d/chef-client +106 -0
  36. data/distro/redhat/etc/init.d/chef-server +112 -0
  37. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  38. data/distro/redhat/etc/init.d/chef-solr +104 -0
  39. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  40. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  41. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  42. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  43. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  44. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  45. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  46. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  47. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  48. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  49. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  50. data/lib/chef/api_client.rb +264 -0
  51. data/lib/chef/application/agent.rb +18 -0
  52. data/lib/chef/application/client.rb +246 -0
  53. data/lib/chef/application/knife.rb +171 -0
  54. data/lib/chef/application/solo.rb +215 -0
  55. data/lib/chef/application.rb +127 -0
  56. data/lib/chef/applications.rb +4 -0
  57. data/lib/chef/certificate.rb +194 -0
  58. data/lib/chef/checksum.rb +182 -0
  59. data/lib/chef/checksum_cache.rb +173 -0
  60. data/lib/chef/client.rb +304 -0
  61. data/lib/chef/config.rb +240 -0
  62. data/lib/chef/cookbook/cookbook_collection.rb +44 -0
  63. data/lib/chef/cookbook/file_system_file_vendor.rb +54 -0
  64. data/lib/chef/cookbook/file_vendor.rb +48 -0
  65. data/lib/chef/cookbook/metadata/version.rb +87 -0
  66. data/lib/chef/cookbook/metadata.rb +500 -0
  67. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  68. data/lib/chef/cookbook/syntax_check.rb +136 -0
  69. data/lib/chef/cookbook_loader.rb +227 -0
  70. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  71. data/lib/chef/cookbook_uploader.rb +103 -0
  72. data/lib/chef/cookbook_version.rb +930 -0
  73. data/lib/chef/couchdb.rb +239 -0
  74. data/lib/chef/daemon.rb +172 -0
  75. data/lib/chef/data_bag.rb +215 -0
  76. data/lib/chef/data_bag_item.rb +228 -0
  77. data/lib/chef/exceptions.rb +66 -0
  78. data/lib/chef/file_access_control.rb +140 -0
  79. data/lib/chef/file_cache.rb +218 -0
  80. data/lib/chef/handler/json_file.rb +58 -0
  81. data/lib/chef/handler.rb +206 -0
  82. data/lib/chef/index_queue/amqp_client.rb +113 -0
  83. data/lib/chef/index_queue/consumer.rb +76 -0
  84. data/lib/chef/index_queue/indexable.rb +76 -0
  85. data/lib/chef/index_queue.rb +29 -0
  86. data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -0
  87. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  88. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  89. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  90. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  91. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +43 -0
  92. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  93. data/lib/chef/knife/bootstrap.rb +181 -0
  94. data/lib/chef/knife/client_bulk_delete.rb +40 -0
  95. data/lib/chef/knife/client_create.rb +70 -0
  96. data/lib/chef/knife/client_delete.rb +45 -0
  97. data/lib/chef/knife/client_edit.rb +45 -0
  98. data/lib/chef/knife/client_list.rb +40 -0
  99. data/lib/chef/knife/client_reregister.rb +56 -0
  100. data/lib/chef/knife/client_show.rb +50 -0
  101. data/lib/chef/knife/configure.rb +140 -0
  102. data/lib/chef/knife/configure_client.rb +52 -0
  103. data/lib/chef/knife/cookbook_bulk_delete.rb +58 -0
  104. data/lib/chef/knife/cookbook_create.rb +209 -0
  105. data/lib/chef/knife/cookbook_delete.rb +143 -0
  106. data/lib/chef/knife/cookbook_download.rb +130 -0
  107. data/lib/chef/knife/cookbook_list.rb +41 -0
  108. data/lib/chef/knife/cookbook_metadata.rb +82 -0
  109. data/lib/chef/knife/cookbook_metadata_from_file.rb +40 -0
  110. data/lib/chef/knife/cookbook_show.rb +98 -0
  111. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  112. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  113. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  114. data/lib/chef/knife/cookbook_site_share.rb +109 -0
  115. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  116. data/lib/chef/knife/cookbook_site_unshare.rb +52 -0
  117. data/lib/chef/knife/cookbook_site_vendor.rb +133 -0
  118. data/lib/chef/knife/cookbook_test.rb +82 -0
  119. data/lib/chef/knife/cookbook_upload.rb +95 -0
  120. data/lib/chef/knife/data_bag_create.rb +59 -0
  121. data/lib/chef/knife/data_bag_delete.rb +48 -0
  122. data/lib/chef/knife/data_bag_edit.rb +50 -0
  123. data/lib/chef/knife/data_bag_from_file.rb +44 -0
  124. data/lib/chef/knife/data_bag_list.rb +43 -0
  125. data/lib/chef/knife/data_bag_show.rb +41 -0
  126. data/lib/chef/knife/ec2_instance_data.rb +46 -0
  127. data/lib/chef/knife/ec2_server_create.rb +216 -0
  128. data/lib/chef/knife/ec2_server_delete.rb +90 -0
  129. data/lib/chef/knife/ec2_server_list.rb +88 -0
  130. data/lib/chef/knife/exec.rb +52 -0
  131. data/lib/chef/knife/index_rebuild.rb +51 -0
  132. data/lib/chef/knife/node_bulk_delete.rb +43 -0
  133. data/lib/chef/knife/node_create.rb +47 -0
  134. data/lib/chef/knife/node_delete.rb +44 -0
  135. data/lib/chef/knife/node_edit.rb +44 -0
  136. data/lib/chef/knife/node_from_file.rb +42 -0
  137. data/lib/chef/knife/node_list.rb +41 -0
  138. data/lib/chef/knife/node_run_list_add.rb +64 -0
  139. data/lib/chef/knife/node_run_list_remove.rb +45 -0
  140. data/lib/chef/knife/node_show.rb +54 -0
  141. data/lib/chef/knife/rackspace_server_create.rb +156 -0
  142. data/lib/chef/knife/rackspace_server_delete.rb +57 -0
  143. data/lib/chef/knife/rackspace_server_list.rb +59 -0
  144. data/lib/chef/knife/recipe_list.rb +32 -0
  145. data/lib/chef/knife/role_bulk_delete.rb +44 -0
  146. data/lib/chef/knife/role_create.rb +52 -0
  147. data/lib/chef/knife/role_delete.rb +44 -0
  148. data/lib/chef/knife/role_edit.rb +45 -0
  149. data/lib/chef/knife/role_from_file.rb +46 -0
  150. data/lib/chef/knife/role_list.rb +40 -0
  151. data/lib/chef/knife/role_show.rb +51 -0
  152. data/lib/chef/knife/search.rb +94 -0
  153. data/lib/chef/knife/slicehost_images_list.rb +53 -0
  154. data/lib/chef/knife/slicehost_server_create.rb +103 -0
  155. data/lib/chef/knife/slicehost_server_delete.rb +61 -0
  156. data/lib/chef/knife/slicehost_server_list.rb +64 -0
  157. data/lib/chef/knife/ssh.rb +328 -0
  158. data/lib/chef/knife/status.rb +87 -0
  159. data/lib/chef/knife/terremark_server_create.rb +152 -0
  160. data/lib/chef/knife/terremark_server_delete.rb +87 -0
  161. data/lib/chef/knife/terremark_server_list.rb +77 -0
  162. data/lib/chef/knife/windows_bootstrap.rb +154 -0
  163. data/lib/chef/knife.rb +522 -0
  164. data/lib/chef/log.rb +61 -0
  165. data/lib/chef/mixin/check_helper.rb +31 -0
  166. data/lib/chef/mixin/checksum.rb +32 -0
  167. data/lib/chef/mixin/command/unix.rb +215 -0
  168. data/lib/chef/mixin/command/windows.rb +72 -0
  169. data/lib/chef/mixin/command.rb +220 -0
  170. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  171. data/lib/chef/mixin/create_path.rb +56 -0
  172. data/lib/chef/mixin/deep_merge.rb +225 -0
  173. data/lib/chef/mixin/deprecation.rb +65 -0
  174. data/lib/chef/mixin/find_preferred_file.rb +92 -0
  175. data/lib/chef/mixin/from_file.rb +50 -0
  176. data/lib/chef/mixin/language.rb +156 -0
  177. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  178. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  179. data/lib/chef/mixin/params_validate.rb +225 -0
  180. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  181. data/lib/chef/mixin/shell_out.rb +38 -0
  182. data/lib/chef/mixin/template.rb +95 -0
  183. data/lib/chef/mixin/xml_escape.rb +140 -0
  184. data/lib/chef/mixins.rb +16 -0
  185. data/lib/chef/monkey_patches/dir.rb +36 -0
  186. data/lib/chef/monkey_patches/string.rb +28 -0
  187. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  188. data/lib/chef/node/attribute.rb +465 -0
  189. data/lib/chef/node.rb +601 -0
  190. data/lib/chef/openid_registration.rb +187 -0
  191. data/lib/chef/platform.rb +371 -0
  192. data/lib/chef/provider/breakpoint.rb +36 -0
  193. data/lib/chef/provider/cookbook_file.rb +100 -0
  194. data/lib/chef/provider/cron/solaris.rb +195 -0
  195. data/lib/chef/provider/cron.rb +186 -0
  196. data/lib/chef/provider/deploy/revision.rb +73 -0
  197. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  198. data/lib/chef/provider/deploy.rb +319 -0
  199. data/lib/chef/provider/directory.rb +72 -0
  200. data/lib/chef/provider/env/windows.rb +75 -0
  201. data/lib/chef/provider/env.rb +152 -0
  202. data/lib/chef/provider/erl_call.rb +72 -0
  203. data/lib/chef/provider/execute.rb +58 -0
  204. data/lib/chef/provider/file.rb +213 -0
  205. data/lib/chef/provider/git.rb +211 -0
  206. data/lib/chef/provider/group/dscl.rb +121 -0
  207. data/lib/chef/provider/group/gpasswd.rb +53 -0
  208. data/lib/chef/provider/group/groupadd.rb +78 -0
  209. data/lib/chef/provider/group/pw.rb +84 -0
  210. data/lib/chef/provider/group/usermod.rb +57 -0
  211. data/lib/chef/provider/group/windows.rb +79 -0
  212. data/lib/chef/provider/group.rb +133 -0
  213. data/lib/chef/provider/http_request.rb +122 -0
  214. data/lib/chef/provider/ifconfig.rb +132 -0
  215. data/lib/chef/provider/link.rb +161 -0
  216. data/lib/chef/provider/log.rb +54 -0
  217. data/lib/chef/provider/mdadm.rb +91 -0
  218. data/lib/chef/provider/mount/mount.rb +232 -0
  219. data/lib/chef/provider/mount/windows.rb +80 -0
  220. data/lib/chef/provider/mount.rb +117 -0
  221. data/lib/chef/provider/ohai.rb +41 -0
  222. data/lib/chef/provider/package/apt.rb +110 -0
  223. data/lib/chef/provider/package/dpkg.rb +112 -0
  224. data/lib/chef/provider/package/easy_install.rb +114 -0
  225. data/lib/chef/provider/package/freebsd.rb +123 -0
  226. data/lib/chef/provider/package/macports.rb +105 -0
  227. data/lib/chef/provider/package/pacman.rb +101 -0
  228. data/lib/chef/provider/package/portage.rb +124 -0
  229. data/lib/chef/provider/package/rpm.rb +101 -0
  230. data/lib/chef/provider/package/rubygems.rb +462 -0
  231. data/lib/chef/provider/package/solaris.rb +127 -0
  232. data/lib/chef/provider/package/yum-dump.py +128 -0
  233. data/lib/chef/provider/package/yum.rb +222 -0
  234. data/lib/chef/provider/package/zypper.rb +133 -0
  235. data/lib/chef/provider/package.rb +160 -0
  236. data/lib/chef/provider/remote_directory.rb +140 -0
  237. data/lib/chef/provider/remote_file.rb +120 -0
  238. data/lib/chef/provider/route.rb +195 -0
  239. data/lib/chef/provider/ruby_block.rb +33 -0
  240. data/lib/chef/provider/script.rb +55 -0
  241. data/lib/chef/provider/service/arch.rb +109 -0
  242. data/lib/chef/provider/service/debian.rb +105 -0
  243. data/lib/chef/provider/service/freebsd.rb +156 -0
  244. data/lib/chef/provider/service/gentoo.rb +54 -0
  245. data/lib/chef/provider/service/init.rb +71 -0
  246. data/lib/chef/provider/service/redhat.rb +60 -0
  247. data/lib/chef/provider/service/simple.rb +118 -0
  248. data/lib/chef/provider/service/solaris.rb +85 -0
  249. data/lib/chef/provider/service/upstart.rb +192 -0
  250. data/lib/chef/provider/service/windows.rb +129 -0
  251. data/lib/chef/provider/service.rb +128 -0
  252. data/lib/chef/provider/subversion.rb +159 -0
  253. data/lib/chef/provider/template.rb +105 -0
  254. data/lib/chef/provider/user/dscl.rb +280 -0
  255. data/lib/chef/provider/user/pw.rb +113 -0
  256. data/lib/chef/provider/user/useradd.rb +137 -0
  257. data/lib/chef/provider/user/windows.rb +124 -0
  258. data/lib/chef/provider/user.rb +187 -0
  259. data/lib/chef/provider.rb +124 -0
  260. data/lib/chef/providers.rb +91 -0
  261. data/lib/chef/recipe.rb +130 -0
  262. data/lib/chef/resource/apt_package.rb +34 -0
  263. data/lib/chef/resource/bash.rb +33 -0
  264. data/lib/chef/resource/breakpoint.rb +35 -0
  265. data/lib/chef/resource/cookbook_file.rb +45 -0
  266. data/lib/chef/resource/cron.rb +188 -0
  267. data/lib/chef/resource/csh.rb +33 -0
  268. data/lib/chef/resource/deploy.rb +371 -0
  269. data/lib/chef/resource/deploy_revision.rb +35 -0
  270. data/lib/chef/resource/directory.rb +76 -0
  271. data/lib/chef/resource/dpkg_package.rb +34 -0
  272. data/lib/chef/resource/easy_install_package.rb +41 -0
  273. data/lib/chef/resource/env.rb +58 -0
  274. data/lib/chef/resource/erl_call.rb +83 -0
  275. data/lib/chef/resource/execute.rb +127 -0
  276. data/lib/chef/resource/file.rb +92 -0
  277. data/lib/chef/resource/freebsd_package.rb +35 -0
  278. data/lib/chef/resource/gem_package.rb +49 -0
  279. data/lib/chef/resource/git.rb +36 -0
  280. data/lib/chef/resource/group.rb +70 -0
  281. data/lib/chef/resource/http_request.rb +61 -0
  282. data/lib/chef/resource/ifconfig.rb +134 -0
  283. data/lib/chef/resource/link.rb +78 -0
  284. data/lib/chef/resource/log.rb +62 -0
  285. data/lib/chef/resource/macports_package.rb +29 -0
  286. data/lib/chef/resource/mdadm.rb +82 -0
  287. data/lib/chef/resource/mount.rb +135 -0
  288. data/lib/chef/resource/ohai.rb +40 -0
  289. data/lib/chef/resource/package.rb +80 -0
  290. data/lib/chef/resource/pacman_package.rb +33 -0
  291. data/lib/chef/resource/perl.rb +33 -0
  292. data/lib/chef/resource/portage_package.rb +33 -0
  293. data/lib/chef/resource/python.rb +33 -0
  294. data/lib/chef/resource/remote_directory.rb +109 -0
  295. data/lib/chef/resource/remote_file.rb +83 -0
  296. data/lib/chef/resource/route.rb +135 -0
  297. data/lib/chef/resource/rpm_package.rb +34 -0
  298. data/lib/chef/resource/ruby.rb +33 -0
  299. data/lib/chef/resource/ruby_block.rb +40 -0
  300. data/lib/chef/resource/scm.rb +146 -0
  301. data/lib/chef/resource/script.rb +60 -0
  302. data/lib/chef/resource/service.rb +160 -0
  303. data/lib/chef/resource/solaris_package.rb +36 -0
  304. data/lib/chef/resource/subversion.rb +36 -0
  305. data/lib/chef/resource/template.rb +69 -0
  306. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  307. data/lib/chef/resource/user.rb +130 -0
  308. data/lib/chef/resource/yum_package.rb +43 -0
  309. data/lib/chef/resource.rb +523 -0
  310. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  311. data/lib/chef/resource_collection.rb +217 -0
  312. data/lib/chef/resource_definition.rb +67 -0
  313. data/lib/chef/resource_definition_list.rb +38 -0
  314. data/lib/chef/resources.rb +64 -0
  315. data/lib/chef/rest/auth_credentials.rb +78 -0
  316. data/lib/chef/rest/cookie_jar.rb +31 -0
  317. data/lib/chef/rest/rest_request.rb +188 -0
  318. data/lib/chef/rest.rb +394 -0
  319. data/lib/chef/role.rb +287 -0
  320. data/lib/chef/run_context.rb +110 -0
  321. data/lib/chef/run_list/run_list_expansion.rb +172 -0
  322. data/lib/chef/run_list/run_list_item.rb +78 -0
  323. data/lib/chef/run_list.rb +150 -0
  324. data/lib/chef/run_status.rb +121 -0
  325. data/lib/chef/runner.rb +107 -0
  326. data/lib/chef/sandbox.rb +153 -0
  327. data/lib/chef/search/query.rb +60 -0
  328. data/lib/chef/shef/ext.rb +568 -0
  329. data/lib/chef/shef/model_wrapper.rb +120 -0
  330. data/lib/chef/shef/shef_rest.rb +28 -0
  331. data/lib/chef/shef/shef_session.rb +271 -0
  332. data/lib/chef/shef.rb +325 -0
  333. data/lib/chef/shell_out.rb +413 -0
  334. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  335. data/lib/chef/tasks/chef_repo.rake +256 -0
  336. data/lib/chef/util/file_edit.rb +122 -0
  337. data/lib/chef/util/windows/net_group.rb +101 -0
  338. data/lib/chef/util/windows/net_use.rb +121 -0
  339. data/lib/chef/util/windows/net_user.rb +198 -0
  340. data/lib/chef/util/windows/volume.rb +59 -0
  341. data/lib/chef/util/windows.rb +56 -0
  342. data/lib/chef/version.rb +21 -0
  343. data/lib/chef/webui_user.rb +231 -0
  344. data/lib/chef.rb +39 -0
  345. metadata +533 -0
data/lib/chef/node.rb ADDED
@@ -0,0 +1,601 @@
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-2010 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/mixin/check_helper'
25
+ require 'chef/mixin/params_validate'
26
+ require 'chef/mixin/from_file'
27
+ require 'chef/mixin/language_include_attribute'
28
+ require 'chef/mixin/deep_merge'
29
+ require 'chef/couchdb'
30
+ require 'chef/rest'
31
+ require 'chef/run_list'
32
+ require 'chef/node/attribute'
33
+ require 'chef/index_queue'
34
+ require 'extlib'
35
+ require 'json'
36
+
37
+ class Chef
38
+ class Node
39
+
40
+ attr_accessor :recipe_list, :couchdb, :couchdb_rev, :run_state, :run_list
41
+ attr_accessor :override_attrs, :default_attrs, :normal_attrs, :automatic_attrs
42
+ attr_reader :couchdb_id
43
+
44
+ # TODO: 5/18/2010 cw/timh. cookbook_collection should be removed
45
+ # from here and for any place it's needed, it should be accessed
46
+ # through a Chef::RunContext
47
+ attr_accessor :cookbook_collection
48
+
49
+ include Chef::Mixin::CheckHelper
50
+ include Chef::Mixin::FromFile
51
+ include Chef::Mixin::ParamsValidate
52
+ include Chef::Mixin::LanguageIncludeAttribute
53
+ include Chef::IndexQueue::Indexable
54
+
55
+ DESIGN_DOCUMENT = {
56
+ "version" => 9,
57
+ "language" => "javascript",
58
+ "views" => {
59
+ "all" => {
60
+ "map" => <<-EOJS
61
+ function(doc) {
62
+ if (doc.chef_type == "node") {
63
+ emit(doc.name, doc);
64
+ }
65
+ }
66
+ EOJS
67
+ },
68
+ "all_id" => {
69
+ "map" => <<-EOJS
70
+ function(doc) {
71
+ if (doc.chef_type == "node") {
72
+ emit(doc.name, doc.name);
73
+ }
74
+ }
75
+ EOJS
76
+ },
77
+ "status" => {
78
+ "map" => <<-EOJS
79
+ function(doc) {
80
+ if (doc.chef_type == "node") {
81
+ var to_emit = { "name": doc.name };
82
+ if (doc["attributes"]["fqdn"]) {
83
+ to_emit["fqdn"] = doc["attributes"]["fqdn"];
84
+ } else {
85
+ to_emit["fqdn"] = "Undefined";
86
+ }
87
+ if (doc["attributes"]["ipaddress"]) {
88
+ to_emit["ipaddress"] = doc["attributes"]["ipaddress"];
89
+ } else {
90
+ to_emit["ipaddress"] = "Undefined";
91
+ }
92
+ if (doc["attributes"]["ohai_time"]) {
93
+ to_emit["ohai_time"] = doc["attributes"]["ohai_time"];
94
+ } else {
95
+ to_emit["ohai_time"] = "Undefined";
96
+ }
97
+ if (doc["attributes"]["uptime"]) {
98
+ to_emit["uptime"] = doc["attributes"]["uptime"];
99
+ } else {
100
+ to_emit["uptime"] = "Undefined";
101
+ }
102
+ if (doc["attributes"]["platform"]) {
103
+ to_emit["platform"] = doc["attributes"]["platform"];
104
+ } else {
105
+ to_emit["platform"] = "Undefined";
106
+ }
107
+ if (doc["attributes"]["platform_version"]) {
108
+ to_emit["platform_version"] = doc["attributes"]["platform_version"];
109
+ } else {
110
+ to_emit["platform_version"] = "Undefined";
111
+ }
112
+ if (doc["run_list"]) {
113
+ to_emit["run_list"] = doc["run_list"];
114
+ } else {
115
+ to_emit["run_list"] = "Undefined";
116
+ }
117
+ emit(doc.name, to_emit);
118
+ }
119
+ }
120
+ EOJS
121
+ },
122
+ "by_run_list" => {
123
+ "map" => <<-EOJS
124
+ function(doc) {
125
+ if (doc.chef_type == "node") {
126
+ if (doc['run_list']) {
127
+ for (var i=0; i < doc.run_list.length; i++) {
128
+ emit(doc['run_list'][i], doc.name);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ EOJS
134
+ }
135
+ },
136
+ }
137
+
138
+ # Create a new Chef::Node object.
139
+ def initialize(couchdb=nil)
140
+ @name = nil
141
+
142
+ @normal_attrs = Mash.new
143
+ @override_attrs = Mash.new
144
+ @default_attrs = Mash.new
145
+ @automatic_attrs = Mash.new
146
+ @run_list = Chef::RunList.new
147
+
148
+ @couchdb_rev = nil
149
+ @couchdb_id = nil
150
+ @couchdb = couchdb || Chef::CouchDB.new
151
+
152
+ @run_state = {
153
+ :template_cache => Hash.new,
154
+ :seen_recipes => Hash.new,
155
+ :seen_attributes => Hash.new
156
+ }
157
+ # TODO: 5/20/2010 need this here as long as other objects try to access
158
+ # the cookbook collection via Node, otherwise get NoMethodError on nil.
159
+ @cookbook_collection = CookbookCollection.new
160
+ end
161
+
162
+ def couchdb_id=(value)
163
+ @couchdb_id = value
164
+ @index_id = value
165
+ end
166
+
167
+ # Used by DSL
168
+ def node
169
+ self
170
+ end
171
+
172
+ def chef_server_rest
173
+ Chef::REST.new(Chef::Config[:chef_server_url])
174
+ end
175
+
176
+ # Find a recipe for this Chef::Node by fqdn. Will search first for
177
+ # Chef::Config["node_path"]/fqdn.rb, then hostname.rb, then default.rb.
178
+ #
179
+ # Returns a new Chef::Node object.
180
+ #
181
+ # Raises an ArgumentError if it cannot find the node.
182
+ def find_file(fqdn)
183
+ host_parts = fqdn.split(".")
184
+ hostname = host_parts[0]
185
+
186
+ [fqdn, hostname, "default"].each { |fname|
187
+ node_file = File.join(Chef::Config[:node_path], "#{fname.to_s}.rb")
188
+ return self.from_file(node_file) if File.exists?(node_file)
189
+ }
190
+
191
+ raise ArgumentError, "Cannot find a node matching #{fqdn}, not even with default.rb!"
192
+ end
193
+
194
+ # Set the name of this Node, or return the current name.
195
+ def name(arg=nil)
196
+ if arg != nil
197
+ validate(
198
+ {:name => arg },
199
+ {:name => { :kind_of => String,
200
+ :cannot_be => :blank,
201
+ :regex => /^[\-[:alnum:]_:.]+$/}
202
+ })
203
+ @name = arg
204
+ else
205
+ @name
206
+ end
207
+ end
208
+
209
+ # Used by the DSL
210
+ def attribute
211
+ construct_attributes
212
+ end
213
+
214
+ def construct_attributes
215
+ Chef::Node::Attribute.new(normal_attrs, default_attrs, override_attrs, automatic_attrs)
216
+ end
217
+
218
+ def attribute=(value)
219
+ self.normal_attrs = value
220
+ end
221
+
222
+ # Return an attribute of this node. Returns nil if the attribute is not found.
223
+ def [](attrib)
224
+ construct_attributes[attrib]
225
+ end
226
+
227
+ # Set an attribute of this node
228
+ def []=(attrib, value)
229
+ construct_attributes[attrib] = value
230
+ end
231
+
232
+ def store(attrib, value)
233
+ self[attrib] = value
234
+ end
235
+
236
+ # Set a normal attribute of this node, but auto-vivifiy any Mashes that
237
+ # might be missing
238
+ def normal
239
+ attrs = construct_attributes
240
+ attrs.set_type = :normal
241
+ attrs.auto_vivifiy_on_read = true
242
+ attrs
243
+ end
244
+
245
+ alias_method :set, :normal
246
+
247
+ # Set a normal attribute of this node, auto-vivifiying any mashes that are
248
+ # missing, but if the final value already exists, don't set it
249
+ def normal_unless
250
+ attrs = construct_attributes
251
+ attrs.set_type = :normal
252
+ attrs.auto_vivifiy_on_read = true
253
+ attrs.set_unless_value_present = true
254
+ attrs
255
+ end
256
+ alias_method :set_unless, :normal_unless
257
+
258
+ # Set a default of this node, but auto-vivifiy any Mashes that might
259
+ # be missing
260
+ def default
261
+ attrs = construct_attributes
262
+ attrs.set_type = :default
263
+ attrs.auto_vivifiy_on_read = true
264
+ attrs
265
+ end
266
+
267
+ # Set a default attribute of this node, auto-vivifiying any mashes that are
268
+ # missing, but if the final value already exists, don't set it
269
+ def default_unless
270
+ attrs = construct_attributes
271
+ attrs.set_type = :default
272
+ attrs.auto_vivifiy_on_read = true
273
+ attrs.set_unless_value_present = true
274
+ attrs
275
+ end
276
+
277
+ # Set an override attribute of this node, but auto-vivifiy any Mashes that
278
+ # might be missing
279
+ def override
280
+ attrs = construct_attributes
281
+ attrs.set_type = :override
282
+ attrs.auto_vivifiy_on_read = true
283
+ attrs
284
+ end
285
+
286
+ # Set an override attribute of this node, auto-vivifiying any mashes that
287
+ # are missing, but if the final value already exists, don't set it
288
+ def override_unless
289
+ attrs = construct_attributes
290
+ attrs.set_type = :override
291
+ attrs.auto_vivifiy_on_read = true
292
+ attrs.set_unless_value_present = true
293
+ attrs
294
+ end
295
+
296
+ # Return true if this Node has a given attribute, false if not. Takes either a symbol or
297
+ # a string.
298
+ #
299
+ # Only works on the top level. Preferred way is to use the normal [] style
300
+ # lookup and call attribute?()
301
+ def attribute?(attrib)
302
+ construct_attributes.attribute?(attrib)
303
+ end
304
+
305
+ # Yield each key of the top level to the block.
306
+ def each(&block)
307
+ construct_attributes.each(&block)
308
+ end
309
+
310
+ # Iterates over each attribute, passing the attribute and value to the block.
311
+ def each_attribute(&block)
312
+ construct_attributes.each_attribute(&block)
313
+ end
314
+
315
+ # Encouraged to only get used for lookups - while you can do sets from here, it's not as explicit
316
+ # as using the normal/default/override interface.
317
+ def method_missing(symbol, *args)
318
+ attrs = construct_attributes
319
+ attrs.send(symbol, *args)
320
+ end
321
+
322
+ # Returns true if this Node expects a given recipe, false if not.
323
+ #
324
+ # First, the run list is consulted to see whether the recipe is
325
+ # explicitly included. If it's not there, it looks in
326
+ # run_state[:seen_recipes], which is populated by include_recipe
327
+ # statements in the DSL (and thus would not be in the run list).
328
+ #
329
+ # NOTE: We believe this is dead code, but if it's not, please
330
+ # email chef-dev@opscode.com. [cw,timh]
331
+ # def recipe?(recipe_name)
332
+ # run_list.include?(recipe_name) || run_state[:seen_recipes].include?(recipe_name)
333
+ # end
334
+
335
+ # Returns true if this Node expects a given role, false if not.
336
+ def role?(role_name)
337
+ run_list.include?("role[#{role_name}]")
338
+ end
339
+
340
+ # Returns an Array of roles and recipes, in the order they will be applied.
341
+ # If you call it with arguments, they will become the new list of roles and recipes.
342
+ def run_list(*args)
343
+ args.length > 0 ? @run_list.reset!(args) : @run_list
344
+ end
345
+
346
+ def recipes(*args)
347
+ Chef::Log.warn "Chef::Node#recipes method is deprecated. Please use Chef::Node#run_list"
348
+ run_list(*args)
349
+ end
350
+
351
+ # Returns true if this Node expects a given role, false if not.
352
+ def run_list?(item)
353
+ run_list.detect { |r| r == item } ? true : false
354
+ end
355
+
356
+ # Consume data from ohai and Attributes provided as JSON on the command line.
357
+ def consume_external_attrs(ohai_data, json_cli_attrs)
358
+ Chef::Log.debug("Extracting run list from JSON attributes provided on command line")
359
+ consume_attributes(json_cli_attrs)
360
+
361
+ @automatic_attrs = ohai_data
362
+
363
+ platform, version = Chef::Platform.find_platform_and_version(self)
364
+ Chef::Log.debug("Platform is #{platform} version #{version}")
365
+ @automatic_attrs[:platform] = platform
366
+ @automatic_attrs[:platform_version] = version
367
+ end
368
+
369
+ # Consumes the combined run_list and other attributes in +attrs+
370
+ def consume_attributes(attrs)
371
+ normal_attrs_to_merge = consume_run_list(attrs)
372
+ Chef::Log.debug("Applying attributes from json file")
373
+ @normal_attrs = Chef::Mixin::DeepMerge.merge(@normal_attrs,normal_attrs_to_merge)
374
+ self[:tags] = Array.new unless attribute?(:tags)
375
+ end
376
+
377
+ # Extracts the run list from +attrs+ and applies it. Returns the remaining attributes
378
+ def consume_run_list(attrs)
379
+ attrs = attrs ? attrs.dup : {}
380
+ if new_run_list = attrs.delete("recipes") || attrs.delete("run_list")
381
+ if attrs.key?("recipes") || attrs.key?("run_list")
382
+ raise Chef::Exceptions::AmbiguousRunlistSpecification, "please set the node's run list using the 'run_list' attribute only."
383
+ end
384
+ Chef::Log.info("Setting the run_list to #{new_run_list.inspect} from JSON")
385
+ run_list(new_run_list)
386
+ end
387
+ attrs
388
+ end
389
+
390
+ # Clear defaults and overrides, so that any deleted attributes between runs are
391
+ # still gone.
392
+ def reset_defaults_and_overrides
393
+ @default_attrs = Mash.new
394
+ @override_attrs = Mash.new
395
+ end
396
+
397
+ # Expands the node's run list and deep merges the default and
398
+ # override attributes. Also applies stored attributes (from json provided
399
+ # on the command line)
400
+ #
401
+ # Returns the fully-expanded list of recipes.
402
+ #
403
+ # TODO: timh/cw, 5-14-2010: Should this method exist? Should we
404
+ # instead modify default_attrs and override_attrs whenever our
405
+ # run_list is mutated? Or perhaps do something smarter like
406
+ # on-demand generation of default_attrs and override_attrs,
407
+ # invalidated only when run_list is mutated?
408
+ def expand!
409
+ # This call should only be called on a chef-client run.
410
+ expansion = run_list.expand('server')
411
+ raise Chef::Exceptions::MissingRole if expansion.errors?
412
+
413
+ self[:tags] = Array.new unless attribute?(:tags)
414
+ @default_attrs = Chef::Mixin::DeepMerge.merge(default_attrs, expansion.default_attrs)
415
+ @override_attrs = Chef::Mixin::DeepMerge.merge(override_attrs, expansion.override_attrs)
416
+
417
+ @automatic_attrs[:recipes] = expansion.recipes
418
+ @automatic_attrs[:roles] = expansion.roles
419
+
420
+ expansion.recipes
421
+ end
422
+
423
+ # Transform the node to a Hash
424
+ def to_hash
425
+ index_hash = Hash.new
426
+ index_hash["chef_type"] = "node"
427
+ index_hash["name"] = name
428
+ attribute.each do |key, value|
429
+ index_hash[key] = value
430
+ end
431
+ index_hash["recipe"] = run_list.recipe_names if run_list.recipe_names.length > 0
432
+ index_hash["role"] = run_list.role_names if run_list.role_names.length > 0
433
+ index_hash["run_list"] = run_list.run_list if run_list.run_list.length > 0
434
+ index_hash
435
+ end
436
+
437
+ # Serialize this object as a hash
438
+ def to_json(*a)
439
+ result = {
440
+ "name" => name,
441
+ 'json_class' => self.class.name,
442
+ "automatic" => automatic_attrs,
443
+ "normal" => normal_attrs,
444
+ "chef_type" => "node",
445
+ "default" => default_attrs,
446
+ "override" => override_attrs,
447
+ "run_list" => run_list.run_list
448
+ }
449
+ result["_rev"] = couchdb_rev if couchdb_rev
450
+ result.to_json(*a)
451
+ end
452
+
453
+ # Create a Chef::Node from JSON
454
+ def self.json_create(o)
455
+ node = new
456
+ node.name(o["name"])
457
+
458
+ if o.has_key?("attributes")
459
+ node.normal_attrs = o["attributes"]
460
+ end
461
+ node.automatic_attrs = Mash.new(o["automatic"]) if o.has_key?("automatic")
462
+ node.normal_attrs = Mash.new(o["normal"]) if o.has_key?("normal")
463
+ node.default_attrs = Mash.new(o["default"]) if o.has_key?("default")
464
+ node.override_attrs = Mash.new(o["override"]) if o.has_key?("override")
465
+
466
+ if o.has_key?("run_list")
467
+ node.run_list.reset!(o["run_list"])
468
+ else
469
+ o["recipes"].each { |r| node.recipes << r }
470
+ end
471
+ node.couchdb_rev = o["_rev"] if o.has_key?("_rev")
472
+ node.couchdb_id = o["_id"] if o.has_key?("_id")
473
+ node.index_id = node.couchdb_id
474
+ node
475
+ end
476
+
477
+ # List all the Chef::Node objects in the CouchDB. If inflate is set to true, you will get
478
+ # the full list of all Nodes, fully inflated.
479
+ def self.cdb_list(inflate=false, couchdb=nil)
480
+ rs =(couchdb || Chef::CouchDB.new).list("nodes", inflate)
481
+ lookup = (inflate ? "value" : "key")
482
+ rs["rows"].collect { |r| r[lookup] }
483
+ end
484
+
485
+ def self.list(inflate=false)
486
+ if inflate
487
+ response = Hash.new
488
+ Chef::Search::Query.new.search(:node) do |n|
489
+ response[n.name] = n unless n.nil?
490
+ end
491
+ response
492
+ else
493
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes")
494
+ end
495
+ end
496
+
497
+ # Load a node by name from CouchDB
498
+ def self.cdb_load(name, couchdb=nil)
499
+ (couchdb || Chef::CouchDB.new).load("node", name)
500
+ end
501
+
502
+ def self.exists?(nodename, couchdb)
503
+ begin
504
+ self.cdb_load(nodename, couchdb)
505
+ rescue Chef::Exceptions::CouchDBNotFound
506
+ nil
507
+ end
508
+ end
509
+
510
+ def self.find_or_create(node_name)
511
+ load(node_name)
512
+ rescue Net::HTTPServerException => e
513
+ raise unless e.response.code == '404'
514
+ node = build(node_name)
515
+ node.create
516
+ end
517
+
518
+ def self.build(node_name)
519
+ node = new
520
+ node.name(node_name)
521
+ node
522
+ end
523
+
524
+ # Load a node by name
525
+ def self.load(name)
526
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes/#{name}")
527
+ end
528
+
529
+ # Remove this node from the CouchDB
530
+ def cdb_destroy
531
+ couchdb.delete("node", name, couchdb_rev)
532
+ end
533
+
534
+ # Remove this node via the REST API
535
+ def destroy
536
+ chef_server_rest.delete_rest("nodes/#{name}")
537
+ end
538
+
539
+ # Save this node to the CouchDB
540
+ def cdb_save
541
+ @couchdb_rev = couchdb.store("node", name, self)["rev"]
542
+ end
543
+
544
+ # Save this node via the REST API
545
+ def save
546
+ # Try PUT. If the node doesn't yet exist, PUT will return 404,
547
+ # so then POST to create.
548
+ begin
549
+ chef_server_rest.put_rest("nodes/#{name}", self)
550
+ rescue Net::HTTPServerException => e
551
+ raise e unless e.response.code == "404"
552
+ chef_server_rest.post_rest("nodes", self)
553
+ end
554
+ self
555
+ end
556
+
557
+ # Create the node via the REST API
558
+ def create
559
+ chef_server_rest.post_rest("nodes", self)
560
+ self
561
+ end
562
+
563
+ # Set up our CouchDB design document
564
+ def self.create_design_document(couchdb=nil)
565
+ (couchdb || Chef::CouchDB.new).create_design_document("nodes", DESIGN_DOCUMENT)
566
+ end
567
+
568
+ def to_s
569
+ "node[#{name}]"
570
+ end
571
+
572
+ # Load all attribute files for all cookbooks associated with this
573
+ # node.
574
+ def load_attributes
575
+ cookbook_collection.values.each do |cookbook|
576
+ cookbook.segment_filenames(:attributes).each do |segment_filename|
577
+ Chef::Log.debug("node #{name} loading cookbook #{cookbook.name}'s attribute file #{segment_filename}")
578
+ self.from_file(segment_filename)
579
+ end
580
+ end
581
+ end
582
+
583
+ # Used by DSL.
584
+ # Loads the attribute file specified by the short name of the
585
+ # file, e.g., loads specified cookbook's
586
+ # "attributes/mailservers.rb"
587
+ # if passed
588
+ # "mailservers"
589
+ def load_attribute_by_short_filename(name, src_cookbook_name)
590
+ src_cookbook = cookbook_collection[src_cookbook_name]
591
+ raise Chef::Exceptions::CookbookNotFound, "could not find cookbook #{src_cookbook_name} while loading attribute #{name}" unless src_cookbook
592
+
593
+ attribute_filename = src_cookbook.attribute_filenames_by_short_filename[name]
594
+ raise Chef::Exceptions::AttributeNotFound, "could not find filename for attribute #{name} in cookbook #{src_cookbook_name}" unless attribute_filename
595
+
596
+ self.from_file(attribute_filename)
597
+ self
598
+ end
599
+
600
+ end
601
+ end