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/role.rb ADDED
@@ -0,0 +1,287 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Nuo Yan (<nuo@opscode.com>)
4
+ # Author:: Christopher Brown (<cb@opscode.com>)
5
+ # Copyright:: Copyright (c) 2008 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/mixin/params_validate'
23
+ require 'chef/mixin/from_file'
24
+ require 'chef/couchdb'
25
+ require 'chef/run_list'
26
+ require 'chef/index_queue'
27
+ require 'extlib'
28
+ require 'json'
29
+
30
+ class Chef
31
+ class Role
32
+
33
+ include Chef::Mixin::FromFile
34
+ include Chef::Mixin::ParamsValidate
35
+ include Chef::IndexQueue::Indexable
36
+
37
+ DESIGN_DOCUMENT = {
38
+ "version" => 6,
39
+ "language" => "javascript",
40
+ "views" => {
41
+ "all" => {
42
+ "map" => <<-EOJS
43
+ function(doc) {
44
+ if (doc.chef_type == "role") {
45
+ emit(doc.name, doc);
46
+ }
47
+ }
48
+ EOJS
49
+ },
50
+ "all_id" => {
51
+ "map" => <<-EOJS
52
+ function(doc) {
53
+ if (doc.chef_type == "role") {
54
+ emit(doc.name, doc.name);
55
+ }
56
+ }
57
+ EOJS
58
+ }
59
+ }
60
+ }
61
+
62
+ attr_accessor :couchdb_rev, :couchdb
63
+ attr_reader :couchdb_id
64
+
65
+ # Create a new Chef::Role object.
66
+ def initialize(couchdb=nil)
67
+ @name = ''
68
+ @description = ''
69
+ @default_attributes = Mash.new
70
+ @override_attributes = Mash.new
71
+ @run_list = Chef::RunList.new
72
+ @couchdb_rev = nil
73
+ @couchdb_id = nil
74
+ @couchdb = couchdb || Chef::CouchDB.new
75
+ end
76
+
77
+ def couchdb_id=(value)
78
+ @couchdb_id = value
79
+ self.index_id = value
80
+ end
81
+
82
+ def chef_server_rest
83
+ Chef::REST.new(Chef::Config[:chef_server_url])
84
+ end
85
+
86
+ def self.chef_server_rest
87
+ Chef::REST.new(Chef::Config[:chef_server_url])
88
+ end
89
+
90
+ def name(arg=nil)
91
+ set_or_return(
92
+ :name,
93
+ arg,
94
+ :regex => /^[\-[:alnum:]_]+$/
95
+ )
96
+ end
97
+
98
+ def description(arg=nil)
99
+ set_or_return(
100
+ :description,
101
+ arg,
102
+ :kind_of => String
103
+ )
104
+ end
105
+
106
+ def run_list(*args)
107
+ (args.length > 0) ? @run_list.reset!(args) : @run_list
108
+ end
109
+
110
+ alias_method :recipes, :run_list
111
+
112
+ # def recipes(*args)
113
+ # Chef::Log.warn "Chef::Role#recipes method is deprecated. Please use Chef::Role#run_list"
114
+ # run_list(*args)
115
+ # end
116
+
117
+ def default_attributes(arg=nil)
118
+ set_or_return(
119
+ :default_attributes,
120
+ arg,
121
+ :kind_of => Hash
122
+ )
123
+ end
124
+
125
+ def override_attributes(arg=nil)
126
+ set_or_return(
127
+ :override_attributes,
128
+ arg,
129
+ :kind_of => Hash
130
+ )
131
+ end
132
+
133
+ def to_hash
134
+ result = {
135
+ "name" => @name,
136
+ "description" => @description,
137
+ 'json_class' => self.class.name,
138
+ "default_attributes" => @default_attributes,
139
+ "override_attributes" => @override_attributes,
140
+ "chef_type" => "role",
141
+ "run_list" => @run_list.run_list
142
+ }
143
+ result["_rev"] = couchdb_rev if couchdb_rev
144
+ result
145
+ end
146
+
147
+ # Serialize this object as a hash
148
+ def to_json(*a)
149
+ to_hash.to_json(*a)
150
+ end
151
+
152
+ # Create a Chef::Role from JSON
153
+ def self.json_create(o)
154
+ role = new
155
+ role.name(o["name"])
156
+ role.description(o["description"])
157
+ role.default_attributes(o["default_attributes"])
158
+ role.override_attributes(o["override_attributes"])
159
+ role.run_list(if o.has_key?("run_list")
160
+ o["run_list"]
161
+ else
162
+ o["recipes"]
163
+ end)
164
+ role.couchdb_rev = o["_rev"] if o.has_key?("_rev")
165
+ role.index_id = role.couchdb_id
166
+ role.couchdb_id = o["_id"] if o.has_key?("_id")
167
+ role
168
+ end
169
+
170
+ # List all the Chef::Role objects in the CouchDB. If inflate is set to true, you will get
171
+ # the full list of all Roles, fully inflated.
172
+ def self.cdb_list(inflate=false, couchdb=nil)
173
+ rs = (couchdb || Chef::CouchDB.new).list("roles", inflate)
174
+ lookup = (inflate ? "value" : "key")
175
+ rs["rows"].collect { |r| r[lookup] }
176
+ end
177
+
178
+ # Get the list of all roles from the API.
179
+ def self.list(inflate=false)
180
+ if inflate
181
+ response = Hash.new
182
+ Chef::Search::Query.new.search(:role) do |n|
183
+ response[n.name] = n unless n.nil?
184
+ end
185
+ response
186
+ else
187
+ chef_server_rest.get_rest("roles")
188
+ end
189
+ end
190
+
191
+ # Load a role by name from CouchDB
192
+ def self.cdb_load(name, couchdb=nil)
193
+ (couchdb || Chef::CouchDB.new).load("role", name)
194
+ end
195
+
196
+ # Load a role by name from the API
197
+ def self.load(name)
198
+ chef_server_rest.get_rest("roles/#{name}")
199
+ end
200
+
201
+ def self.exists?(rolename, couchdb)
202
+ begin
203
+ self.cdb_load(rolename, couchdb)
204
+ rescue Chef::Exceptions::CouchDBNotFound
205
+ nil
206
+ end
207
+ end
208
+
209
+ # Remove this role from the CouchDB
210
+ def cdb_destroy
211
+ couchdb.delete("role", @name, couchdb_rev)
212
+ end
213
+
214
+ # Remove this role via the REST API
215
+ def destroy
216
+ chef_server_rest.delete_rest("roles/#{@name}")
217
+ end
218
+
219
+ # Save this role to the CouchDB
220
+ def cdb_save
221
+ self.couchdb_rev = couchdb.store("role", @name, self)["rev"]
222
+ end
223
+
224
+ # Save this role via the REST API
225
+ def save
226
+ begin
227
+ chef_server_rest.put_rest("roles/#{@name}", self)
228
+ rescue Net::HTTPServerException => e
229
+ raise e unless e.response.code == "404"
230
+ chef_server_rest.post_rest("roles", self)
231
+ end
232
+ self
233
+ end
234
+
235
+ # Create the role via the REST API
236
+ def create
237
+ chef_server_rest.post_rest("roles", self)
238
+ self
239
+ end
240
+
241
+ # Set up our CouchDB design document
242
+ def self.create_design_document(couchdb=nil)
243
+ (couchdb || Chef::CouchDB.new).create_design_document("roles", DESIGN_DOCUMENT)
244
+ end
245
+
246
+ # As a string
247
+ def to_s
248
+ "role[#{@name}]"
249
+ end
250
+
251
+ # Load a role from disk - prefers to load the JSON, but will happily load
252
+ # the raw rb files as well.
253
+ def self.from_disk(name, force=nil)
254
+ js_file = File.join(Chef::Config[:role_path], "#{name}.json")
255
+ rb_file = File.join(Chef::Config[:role_path], "#{name}.rb")
256
+
257
+ if File.exists?(js_file) || force == "json"
258
+ JSON.parse(IO.read(js_file))
259
+ elsif File.exists?(rb_file) || force == "ruby"
260
+ role = Chef::Role.new
261
+ role.name(name)
262
+ role.from_file(rb_file)
263
+ role
264
+ else
265
+ raise Chef::Exceptions::RoleNotFound, "Role '#{name}' could not be loaded from disk"
266
+ end
267
+ end
268
+
269
+ # Sync all the json roles with couchdb from disk
270
+ def self.sync_from_disk_to_couchdb
271
+ Dir[File.join(Chef::Config[:role_path], "*.json")].each do |role_file|
272
+ short_name = File.basename(role_file, ".json")
273
+ Chef::Log.warn("Loading #{short_name}")
274
+ r = Chef::Role.from_disk(short_name, "json")
275
+ begin
276
+ couch_role = Chef::Role.cdb_load(short_name)
277
+ r.couchdb_rev = couch_role.couchdb_rev
278
+ Chef::Log.debug("Replacing role #{short_name} with data from #{role_file}")
279
+ rescue Chef::Exceptions::CouchDBNotFound
280
+ Chef::Log.debug("Creating role #{short_name} with data from #{role_file}")
281
+ end
282
+ r.cdb_save
283
+ end
284
+ end
285
+
286
+ end
287
+ end
@@ -0,0 +1,110 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
5
+ # Copyright:: Copyright (c) 2008-2010 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
+ require 'chef/resource_collection'
21
+ require 'chef/node'
22
+ require 'chef/role'
23
+ require 'chef/log'
24
+ require 'chef/mixin/language_include_recipe'
25
+
26
+ class Chef
27
+ # == Chef::RunContext
28
+ # Value object that loads and tracks the context of a Chef run
29
+ class RunContext
30
+
31
+ # Used to load the node's recipes after expanding its run list
32
+ include Chef::Mixin::LanguageIncludeRecipe
33
+
34
+ attr_reader :node, :cookbook_collection, :definitions
35
+
36
+ # Needs to be settable so deploy can run a resource_collection independent
37
+ # of any cookbooks.
38
+ attr_accessor :resource_collection
39
+
40
+ # Creates a new Chef::RunContext object and populates its fields. This object gets
41
+ # used by the Chef Server to generate a fully compiled recipe list for a node.
42
+ #
43
+ # === Returns
44
+ # object<Chef::RunContext>:: Duh. :)
45
+ def initialize(node, cookbook_collection)
46
+ @node = node
47
+ @cookbook_collection = cookbook_collection
48
+ @resource_collection = Chef::ResourceCollection.new
49
+ @definitions = Hash.new
50
+
51
+ # TODO: 5/18/2010 cw/timh - See note on Chef::Node's
52
+ # cookbook_collection attr_accessor
53
+ node.cookbook_collection = cookbook_collection
54
+
55
+ load
56
+ end
57
+
58
+ def load
59
+ foreach_cookbook_load_segment(:libraries) do |cookbook_name, filename|
60
+ Chef::Log.debug("Loading cookbook #{cookbook_name}'s library file: #{filename}")
61
+ require filename
62
+ end
63
+
64
+ foreach_cookbook_load_segment(:providers) do |cookbook_name, filename|
65
+ Chef::Log.debug("Loading cookbook #{cookbook_name}'s providers from #{filename}")
66
+ Chef::Provider.build_from_file(cookbook_name, filename)
67
+ end
68
+
69
+ foreach_cookbook_load_segment(:resources) do |cookbook_name, filename|
70
+ Chef::Log.debug("Loading cookbook #{cookbook_name}'s resources from #{filename}")
71
+ Chef::Resource.build_from_file(cookbook_name, filename)
72
+ end
73
+
74
+ node.load_attributes
75
+
76
+ foreach_cookbook_load_segment(:definitions) do |cookbook_name, filename|
77
+ Chef::Log.debug("Loading cookbook #{cookbook_name}'s definitions from #{filename}")
78
+ resourcelist = Chef::ResourceDefinitionList.new
79
+ resourcelist.from_file(filename)
80
+ definitions.merge!(resourcelist.defines) do |key, oldval, newval|
81
+ Chef::Log.info("Overriding duplicate definition #{key}, new found in #{filename}")
82
+ newval
83
+ end
84
+ end
85
+
86
+ # Retrieve the fully expanded list of recipes for the node by
87
+ # resolving roles; this step also merges attributes into the
88
+ # node from the roles/recipes included.
89
+ recipe_names = node.expand!
90
+
91
+ recipe_names.each do |recipe_name|
92
+ # TODO: timh/cw, 5-14-2010: It's distasteful to be including
93
+ # the DSL in a class outside the context of the DSL
94
+ include_recipe(recipe_name)
95
+ end
96
+ end
97
+
98
+ private
99
+
100
+ def foreach_cookbook_load_segment(segment, &block)
101
+ cookbook_collection.each do |cookbook_name, cookbook|
102
+ segment_filenames = cookbook.segment_filenames(segment)
103
+ segment_filenames.each do |segment_filename|
104
+ block.call(cookbook_name, segment_filename)
105
+ end
106
+ end
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,172 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 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
+ require 'extlib'
19
+
20
+ require 'chef/mixin/deep_merge'
21
+
22
+ require 'chef/role'
23
+ require 'chef/couchdb'
24
+ require 'chef/rest'
25
+
26
+ class Chef
27
+ class RunList
28
+ # Abstract Base class for expanding a run list. Subclasses must handle
29
+ # fetching roles from a data source by defining +fetch_role+
30
+ class RunListExpansion
31
+
32
+ attr_reader :run_list_items
33
+
34
+ attr_reader :recipes
35
+
36
+ attr_reader :default_attrs
37
+
38
+ attr_reader :override_attrs
39
+
40
+ attr_reader :errors
41
+
42
+ # The data source passed to the constructor. Not used in this class.
43
+ # In subclasses, this is a couchdb or Chef::REST object pre-configured
44
+ # to fetch roles from their correct location.
45
+ attr_reader :source
46
+
47
+ def initialize(run_list_items, source=nil)
48
+ @errors = Array.new
49
+
50
+ @run_list_items = run_list_items.dup
51
+ @source = source
52
+
53
+ @default_attrs = Mash.new
54
+ @override_attrs = Mash.new
55
+
56
+ @recipes = []
57
+
58
+ @applied_roles = {}
59
+ end
60
+
61
+ # Did we find any errors (expanding roles)?
62
+ def errors?
63
+ @errors.length > 0
64
+ end
65
+
66
+ alias :invalid? :errors?
67
+
68
+ # Iterates over the run list items, expanding roles. After this,
69
+ # +recipes+ will contain the fully expanded recipe list
70
+ def expand
71
+ @run_list_items.each_with_index do |entry, index|
72
+ case entry.type
73
+ when :recipe
74
+ recipes << entry.name unless recipes.include?(entry.name)
75
+ when :role
76
+ if role = inflate_role(entry.name)
77
+ apply_role_attributes(role)
78
+ @run_list_items.insert(index + 1, *role.run_list.run_list_items)
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ # Fetches and inflates a role
85
+ # === Returns
86
+ # Chef::Role in most cases
87
+ # false if the role has already been applied
88
+ # nil if the role does not exist
89
+ def inflate_role(role_name)
90
+ return false if applied_role?(role_name) # Prevent infinite loops
91
+ applied_role(role_name)
92
+ fetch_role(role_name)
93
+ end
94
+
95
+ def apply_role_attributes(role)
96
+ @default_attrs = Chef::Mixin::DeepMerge.merge(@default_attrs, role.default_attributes)
97
+ @override_attrs = Chef::Mixin::DeepMerge.merge(@override_attrs, role.override_attributes)
98
+ end
99
+
100
+ def applied_role?(role_name)
101
+ @applied_roles.has_key?(role_name)
102
+ end
103
+
104
+ def applied_role(role_name)
105
+ @applied_roles[role_name] = true
106
+ end
107
+
108
+ def roles
109
+ @applied_roles.keys
110
+ end
111
+
112
+ # In subclasses, this method will fetch the role from the data source.
113
+ def fetch_role(name)
114
+ raise NotImplementedError
115
+ end
116
+
117
+ # When a role is not found, an error message is logged, but no
118
+ # exception is raised. We do add an entry in the errors collection.
119
+ # === Returns
120
+ # nil
121
+ def role_not_found(name)
122
+ Chef::Log.error("Role #{name} is in the runlist but does not exist. Skipping expand.")
123
+ @errors << name
124
+ nil
125
+ end
126
+ end
127
+
128
+ # Expand a run list from disk. Suitable for chef-solo
129
+ class RunListExpansionFromDisk < RunListExpansion
130
+
131
+ def fetch_role(name)
132
+ Chef::Role.from_disk(name)
133
+ rescue Chef::Exceptions::RoleNotFound
134
+ role_not_found(name)
135
+ end
136
+
137
+ end
138
+
139
+ # Expand a run list from the chef-server API.
140
+ class RunListExpansionFromAPI < RunListExpansion
141
+
142
+ def rest
143
+ @rest ||= (source || Chef::REST.new(Chef::Config[:role_url]))
144
+ end
145
+
146
+ def fetch_role(name)
147
+ rest.get_rest("roles/#{name}")
148
+ rescue Net::HTTPServerException => e
149
+ if e.message == '404 "Not Found"'
150
+ role_not_found(name)
151
+ else
152
+ raise
153
+ end
154
+ end
155
+ end
156
+
157
+ # Expand a run list from couchdb. Used in chef-server-api
158
+ class RunListExpansionFromCouchDB < RunListExpansion
159
+
160
+ def couchdb
161
+ source
162
+ end
163
+
164
+ def fetch_role(name)
165
+ Chef::Role.cdb_load(name, couchdb)
166
+ rescue Chef::Exceptions::CouchDBNotFound
167
+ role_not_found(name)
168
+ end
169
+
170
+ end
171
+ end
172
+ end