auser-poolparty 1.0.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (368) hide show
  1. data/License.txt +1 -1
  2. data/PostInstall.txt +1 -1
  3. data/README.txt +1 -1
  4. data/Rakefile +13 -37
  5. data/VERSION.yml +4 -0
  6. data/bin/cloud +3 -2
  7. data/bin/cloud-bootstrap +21 -0
  8. data/bin/cloud-configure +21 -10
  9. data/bin/{pool-console → cloud-console} +0 -0
  10. data/bin/cloud-list +9 -12
  11. data/bin/cloud-osxcopy +5 -4
  12. data/bin/cloud-provision +17 -21
  13. data/bin/cloud-setup-dev +11 -11
  14. data/bin/cloud-spec +2 -1
  15. data/bin/cloud-ssh +12 -3
  16. data/bin/cloud-start +19 -23
  17. data/bin/cloud-terminate +1 -1
  18. data/bin/ec2-list-active +24 -0
  19. data/bin/server-become-master +1 -1
  20. data/bin/server-butterfly +25 -0
  21. data/bin/server-clean-cert-for +1 -1
  22. data/bin/server-cloud-elections +26 -0
  23. data/bin/server-ensure-provisioning +1 -2
  24. data/bin/server-get-load +9 -12
  25. data/bin/server-list-active +21 -13
  26. data/bin/server-list-instances +15 -0
  27. data/bin/server-manage-election +67 -0
  28. data/bin/server-monitor.ru +25 -0
  29. data/bin/server-query-agent +1 -1
  30. data/bin/server-rerun +1 -1
  31. data/bin/server-update-hosts +1 -1
  32. data/bin/server-write-new-nodes +1 -1
  33. data/config/jeweler.rb +43 -0
  34. data/config/requirements.rb +1 -9
  35. data/examples/basic.rb +9 -6
  36. data/examples/fairchild.rb +32 -0
  37. data/examples/fairchild_chef.rb +19 -0
  38. data/examples/paparazzi.conf.erb +21 -0
  39. data/generators/poolspec/poolspec_generator.rb +1 -9
  40. data/lib/erlang/messenger/Rakefile +1 -1
  41. data/lib/erlang/messenger/src/pm_node.erl +1 -1
  42. data/lib/erlang/messenger/src/utils.erl +0 -1
  43. data/lib/poolparty/aska/aska.rb +18 -16
  44. data/lib/poolparty/base_packages/bind.rb +11 -0
  45. data/lib/poolparty/base_packages/haproxy.rb +36 -34
  46. data/lib/poolparty/base_packages/heartbeat.rb +47 -61
  47. data/lib/poolparty/base_packages/poolparty.rb +5 -83
  48. data/lib/poolparty/base_packages/ruby.rb +4 -4
  49. data/lib/poolparty/base_packages/runit.rb +1 -1
  50. data/lib/poolparty/capistrano.rb +2 -1
  51. data/lib/poolparty/core/array.rb +9 -3
  52. data/lib/poolparty/core/hash.rb +36 -11
  53. data/lib/poolparty/core/kernel.rb +12 -8
  54. data/lib/poolparty/core/object.rb +20 -21
  55. data/lib/poolparty/core/ordered_hash.rb +99 -0
  56. data/lib/poolparty/core/string.rb +58 -15
  57. data/lib/poolparty/dependencies.rb +49 -0
  58. data/lib/poolparty/dependency_resolver/chef_resolver.rb +209 -0
  59. data/lib/poolparty/dependency_resolver/dependency_resolver.rb +42 -0
  60. data/lib/poolparty/dependency_resolver/dependency_resolver_cloud_extensions.rb +28 -0
  61. data/lib/poolparty/{dependency_resolutions → dependency_resolver}/puppet.rb +29 -28
  62. data/lib/poolparty/dependency_resolver/puppet_resolver.rb +173 -0
  63. data/lib/poolparty/exceptions/RemoteException.rb +1 -1
  64. data/lib/poolparty/exceptions/dependency_resolver_exception.rb +5 -0
  65. data/lib/poolparty/exceptions/package_exception.rb +7 -0
  66. data/lib/poolparty/extra/deployments.rb +7 -7
  67. data/lib/poolparty/helpers/binary.rb +9 -9
  68. data/lib/poolparty/helpers/display.rb +1 -5
  69. data/lib/poolparty/helpers/hash_printer.rb +44 -0
  70. data/lib/poolparty/helpers/optioner.rb +27 -20
  71. data/lib/poolparty/lite.rb +20 -0
  72. data/lib/poolparty/modules/cloud_dsl.rb +6 -0
  73. data/lib/poolparty/modules/cloud_resourcer.rb +48 -111
  74. data/lib/poolparty/modules/daemonizable.rb +141 -140
  75. data/lib/poolparty/modules/definable_resource.rb +7 -10
  76. data/lib/poolparty/modules/file_writer.rb +19 -15
  77. data/lib/poolparty/modules/pretty_printer.rb +1 -1
  78. data/lib/poolparty/modules/resourcing_dsl.rb +46 -41
  79. data/lib/poolparty/monitors/base_monitor.rb +2 -10
  80. data/lib/poolparty/monitors/monitor_rack.rb +125 -0
  81. data/lib/poolparty/monitors/monitors/load_monitor.rb +15 -0
  82. data/lib/poolparty/monitors/monitors/memory_monitor.rb +50 -50
  83. data/lib/poolparty/monitors/monitors/server_monitor.rb +7 -0
  84. data/lib/poolparty/monitors/monitors/web_monitor.rb +18 -18
  85. data/lib/poolparty/monitors/neighborhood_monitor.rb +25 -0
  86. data/lib/poolparty/monitors/stats_monitor.rb +183 -0
  87. data/lib/poolparty/monitors.rb +6 -0
  88. data/lib/poolparty/net/init.rb +11 -0
  89. data/lib/poolparty/net/messenger.rb +1 -18
  90. data/lib/poolparty/net/remote_bases.rb +21 -0
  91. data/lib/poolparty/net/remote_instance.rb +36 -27
  92. data/lib/poolparty/net/remoter/cloud_control.rb +251 -0
  93. data/lib/poolparty/net/remoter/connections.rb +180 -0
  94. data/lib/poolparty/net/remoter/interactive.rb +121 -0
  95. data/lib/poolparty/net/remoter/lists.rb +12 -0
  96. data/lib/poolparty/net/remoter_base.rb +46 -124
  97. data/lib/poolparty/net/{remote_bases → remoter_bases/ec2}/ec2.rb +78 -52
  98. data/lib/poolparty/net/remoter_bases/ec2/ec2_remote_instance.rb +53 -0
  99. data/lib/poolparty/net/{remote_bases → remoter_bases}/ec2/ec2_response_object.rb +2 -4
  100. data/lib/poolparty/plugins/chef.rb +168 -0
  101. data/lib/poolparty/plugins/deploydirectory.rb +22 -46
  102. data/lib/poolparty/plugins/git.rb +27 -18
  103. data/lib/poolparty/plugins/line_in_file.rb +13 -0
  104. data/lib/poolparty/plugins/rsyncmirror.rb +2 -3
  105. data/lib/poolparty/poolparty/cloud.rb +172 -110
  106. data/lib/poolparty/poolparty/custom_resource.rb +2 -2
  107. data/lib/poolparty/poolparty/{base.rb → default.rb} +56 -20
  108. data/lib/poolparty/poolparty/key.rb +75 -0
  109. data/lib/poolparty/poolparty/loggable.rb +28 -27
  110. data/lib/poolparty/poolparty/neighborhoods.rb +69 -0
  111. data/lib/poolparty/poolparty/plugin.rb +52 -19
  112. data/lib/poolparty/poolparty/plugin_model.rb +18 -21
  113. data/lib/poolparty/poolparty/pool.rb +23 -24
  114. data/lib/poolparty/poolparty/poolparty_base_class.rb +181 -0
  115. data/lib/poolparty/poolparty/resource.rb +74 -176
  116. data/lib/poolparty/poolparty/script.rb +32 -20
  117. data/lib/poolparty/poolparty/service.rb +34 -0
  118. data/lib/poolparty/poolparty/template.rb +18 -0
  119. data/lib/poolparty/provision/boot_strapper.rb +140 -0
  120. data/lib/poolparty/provision/configurations/chef.rb +22 -0
  121. data/lib/poolparty/provision/configurations/puppet.rb +28 -0
  122. data/lib/poolparty/provision/dr_configure.rb +85 -0
  123. data/lib/poolparty/provisioners/capistrano/capistrano.rb +21 -19
  124. data/lib/poolparty/provisioners/capistrano/capistrano_configurer.rb +19 -13
  125. data/lib/poolparty/provisioners/capistrano/recipes/aws.rb +21 -0
  126. data/lib/poolparty/provisioners/capistrano/{recipies → recipes}/base.rb +76 -56
  127. data/lib/poolparty/provisioners/capistrano/recipes/master.rb +66 -0
  128. data/lib/poolparty/provisioners/capistrano/recipes/puppet.rb +101 -0
  129. data/lib/poolparty/provisioners/capistrano/{recipies → recipes}/slave.rb +5 -9
  130. data/lib/poolparty/provisioners/provisioner_base.rb +50 -43
  131. data/lib/poolparty/{poolparty/resources → resources}/cron.rb +0 -0
  132. data/lib/poolparty/{poolparty/resources → resources}/custom_service.rb +1 -1
  133. data/lib/poolparty/resources/directory.rb +13 -0
  134. data/lib/poolparty/resources/exec.rb +25 -0
  135. data/lib/poolparty/resources/file.rb +29 -0
  136. data/lib/poolparty/{poolparty/resources → resources}/host.rb +4 -2
  137. data/lib/poolparty/{poolparty/resources → resources}/mount.rb +5 -6
  138. data/lib/poolparty/resources/package.rb +12 -0
  139. data/lib/poolparty/resources/remote_file.rb +20 -0
  140. data/lib/poolparty/{poolparty/resources → resources}/service.rb +1 -2
  141. data/lib/poolparty/resources/sshkey.rb +27 -0
  142. data/lib/poolparty/resources/symlink.rb +21 -0
  143. data/lib/poolparty/{poolparty/resources/remote_user.rb → resources/user.rb} +1 -5
  144. data/lib/poolparty/resources/variable.rb +9 -0
  145. data/lib/poolparty/schema.rb +64 -0
  146. data/lib/poolparty/services/conditional.rb +46 -0
  147. data/lib/poolparty/{poolparty/resources → services}/gem_package.rb +12 -10
  148. data/lib/poolparty/spec.rb +2 -5
  149. data/lib/poolparty/templates/erlang_cookie_maker +6 -0
  150. data/lib/poolparty/templates/gemrc +11 -0
  151. data/lib/poolparty/templates/ha.cf +1 -1
  152. data/lib/poolparty/templates/haproxy.conf +7 -7
  153. data/lib/poolparty/templates/haresources +2 -2
  154. data/lib/poolparty/templates/monitor.ru +16 -0
  155. data/lib/poolparty/templates/puppet/add_puppet_to_hosts +6 -0
  156. data/lib/poolparty/templates/puppet/puppet.conf +2 -0
  157. data/lib/poolparty/templates/puppet/puppetrunner +14 -0
  158. data/lib/poolparty/templates/puppet/site.pp +4 -0
  159. data/lib/poolparty/templates/puppetrunner +11 -5
  160. data/lib/poolparty.rb +67 -14
  161. data/script/destroy +1 -1
  162. data/script/generate +1 -1
  163. data/spec/bin/bin_spec_helper.rb +7 -0
  164. data/spec/bin/fixtures/bin_cloud_for_test.rb +19 -0
  165. data/spec/bin/server-list-active_spec.rb +22 -0
  166. data/spec/poolparty/aska/aska_spec.rb +5 -5
  167. data/spec/poolparty/base_packages/haproxy_spec.rb +2 -8
  168. data/spec/poolparty/base_packages/heartbeat_spec.rb +3 -26
  169. data/spec/poolparty/bin/console_spec.rb +5 -28
  170. data/spec/poolparty/core/array_spec.rb +18 -3
  171. data/spec/poolparty/core/hash_spec.rb +24 -30
  172. data/spec/poolparty/core/object_spec.rb +2 -3
  173. data/spec/poolparty/core/ordered_hash_spec.rb +48 -0
  174. data/spec/poolparty/core/string_spec.rb +1 -27
  175. data/spec/poolparty/dependencies_spec.rb +11 -0
  176. data/spec/poolparty/dependency_resolver/chef_resolver_spec.rb +119 -0
  177. data/spec/poolparty/dependency_resolver/dependency_resolver_cloud_extensions_spec.rb +128 -0
  178. data/spec/poolparty/dependency_resolver/dependency_resolver_spec.rb +16 -0
  179. data/spec/poolparty/dependency_resolver/puppet_resolver_spec.rb +124 -0
  180. data/spec/poolparty/extra/deployments_spec.rb +9 -5
  181. data/spec/poolparty/fixtures/clouds.json +128 -0
  182. data/spec/poolparty/fixtures/test_template.erb +1 -0
  183. data/spec/poolparty/helpers/binary_spec.rb +1 -14
  184. data/spec/poolparty/helpers/hash_printer_spec.rb +34 -0
  185. data/spec/poolparty/helpers/optioner_spec.rb +1 -1
  186. data/spec/poolparty/id_rsa +27 -0
  187. data/spec/poolparty/modules/cloud_resourcer_spec.rb +26 -111
  188. data/spec/poolparty/modules/definable_resource.rb +1 -1
  189. data/spec/poolparty/modules/file_writer_spec.rb +5 -5
  190. data/spec/poolparty/monitors/base_monitor_spec.rb +112 -111
  191. data/spec/poolparty/monitors/monitors/cpu_monitor_spec.rb +18 -16
  192. data/spec/poolparty/monitors/monitors/memory_monitor_spec.rb +48 -47
  193. data/spec/poolparty/net/remote_instance_spec.rb +9 -73
  194. data/spec/poolparty/net/remote_spec.rb +78 -101
  195. data/spec/poolparty/net/remoter_base_spec.rb +3 -59
  196. data/spec/poolparty/net/remoter_bases/ec2_mocks_and_stubs.rb +24 -0
  197. data/spec/poolparty/net/remoter_bases/ec2_remote_instance_spec.rb +125 -0
  198. data/spec/poolparty/net/{remote_bases → remoter_bases}/ec2_spec.rb +32 -49
  199. data/spec/poolparty/net/remoter_spec.rb +51 -44
  200. data/spec/poolparty/plugins/chef_spec.rb +7 -0
  201. data/spec/poolparty/plugins/deploydirectory_spec.rb +51 -52
  202. data/spec/poolparty/plugins/git_spec.rb +14 -19
  203. data/spec/poolparty/plugins/line_spec.rb +14 -8
  204. data/spec/poolparty/poolparty/cloud_spec.rb +87 -128
  205. data/spec/poolparty/poolparty/configurers/files/ruby_basic.rb +3 -4
  206. data/spec/poolparty/poolparty/configurers/ruby_spec.rb +7 -23
  207. data/spec/poolparty/poolparty/custom_resource_spec.rb +2 -43
  208. data/spec/poolparty/poolparty/{base_spec.rb → default_spec.rb} +44 -41
  209. data/spec/poolparty/poolparty/example_spec.rb +43 -11
  210. data/spec/poolparty/poolparty/key_spec.rb +42 -0
  211. data/spec/poolparty/poolparty/neighborhoods_spec.rb +66 -0
  212. data/spec/poolparty/poolparty/plugin_model_spec.rb +14 -24
  213. data/spec/poolparty/poolparty/plugin_spec.rb +25 -96
  214. data/spec/poolparty/poolparty/pool_spec.rb +3 -1
  215. data/spec/poolparty/poolparty/resource_spec.rb +69 -268
  216. data/spec/poolparty/poolparty/script_spec.rb +30 -53
  217. data/spec/poolparty/poolparty/service_spec.rb +5 -0
  218. data/spec/poolparty/poolparty/template_spec.rb +26 -0
  219. data/spec/poolparty/poolparty/test_plugins/webserver.rb +8 -25
  220. data/spec/poolparty/poolparty_base_class_spec.rb +80 -0
  221. data/spec/poolparty/poolparty_spec.rb +4 -4
  222. data/spec/poolparty/provisioners/capistrano/capistrano_spec.rb +31 -23
  223. data/spec/poolparty/provisioners/provisioner_base_spec.rb +128 -122
  224. data/spec/poolparty/resources/cron_spec.rb +44 -0
  225. data/spec/poolparty/resources/directory_spec.rb +40 -0
  226. data/spec/poolparty/resources/exec_spec.rb +37 -0
  227. data/spec/poolparty/resources/file_spec.rb +62 -0
  228. data/spec/poolparty/resources/gem_spec.rb +7 -0
  229. data/spec/poolparty/resources/host_spec.rb +35 -0
  230. data/spec/poolparty/resources/package_spec.rb +29 -0
  231. data/spec/poolparty/resources/service_spec.rb +29 -0
  232. data/spec/poolparty/resources/sshkey_spec.rb +40 -0
  233. data/spec/poolparty/resources/symlink_spec.rb +29 -0
  234. data/spec/poolparty/resources/user_spec.rb +48 -0
  235. data/spec/poolparty/resources/variable_spec.rb +26 -0
  236. data/spec/poolparty/schema_spec.rb +53 -0
  237. data/spec/poolparty/services/conditional_spec.rb +52 -0
  238. data/spec/poolparty/spec_helper.rb +104 -23
  239. data/spec/poolparty/test_spec_helper.rb +13 -0
  240. data/tasks/development.rake +76 -69
  241. data/tasks/poolparty.rake +54 -0
  242. data/tasks/server.rake +41 -39
  243. data/test/poolparty/core/hash_test.rb +23 -0
  244. data/test/test_helper.rb +3 -2
  245. data/vendor/gems/butterfly/History.txt +4 -0
  246. data/vendor/gems/butterfly/PostInstall.txt +2 -0
  247. data/vendor/gems/butterfly/README.rdoc +48 -0
  248. data/vendor/gems/butterfly/Rakefile +62 -0
  249. data/vendor/gems/butterfly/VERSION.yml +4 -0
  250. data/vendor/gems/butterfly/bin/flutter +4 -0
  251. data/vendor/gems/butterfly/butterfly.gemspec +37 -0
  252. data/vendor/gems/butterfly/examples/config.ru +15 -0
  253. data/vendor/gems/butterfly/examples/my_app.rb +12 -0
  254. data/vendor/gems/butterfly/lib/butterfly.rb +14 -0
  255. data/vendor/gems/butterfly/lib/handler.rb +48 -0
  256. data/vendor/gems/butterfly/lib/request.rb +29 -0
  257. data/vendor/gems/butterfly/lib/response.rb +49 -0
  258. data/vendor/gems/butterfly/script/console +10 -0
  259. data/vendor/gems/butterfly/script/destroy +14 -0
  260. data/vendor/gems/butterfly/script/generate +14 -0
  261. data/vendor/gems/butterfly/test/test_adapter_base.rb +23 -0
  262. data/vendor/gems/butterfly/test/test_butterfly_request.rb +46 -0
  263. data/vendor/gems/butterfly/test/test_butterfly_response.rb +43 -0
  264. data/vendor/gems/butterfly/test/test_butterfly_server.rb +16 -0
  265. data/vendor/gems/butterfly/test/test_default.rb +12 -0
  266. data/vendor/gems/butterfly/test/test_helper.rb +6 -0
  267. data/vendor/gems/dslify/History.txt +4 -0
  268. data/vendor/gems/dslify/Manifest.txt +25 -0
  269. data/vendor/gems/dslify/PostInstall.txt +5 -0
  270. data/vendor/gems/dslify/README.txt +60 -0
  271. data/vendor/gems/dslify/Rakefile +56 -0
  272. data/{config → vendor/gems/dslify/config}/hoe.rb +12 -55
  273. data/vendor/gems/dslify/config/requirements.rb +15 -0
  274. data/vendor/gems/dslify/dslify.gemspec +40 -0
  275. data/vendor/gems/dslify/lib/dslify/dslify.rb +69 -0
  276. data/vendor/gems/dslify/lib/dslify/version.rb +10 -0
  277. data/vendor/gems/dslify/lib/dslify.rb +7 -0
  278. data/vendor/gems/dslify/script/console +10 -0
  279. data/vendor/gems/dslify/script/destroy +14 -0
  280. data/vendor/gems/dslify/script/generate +14 -0
  281. data/{script → vendor/gems/dslify/script}/txt2html +4 -4
  282. data/{setup.rb → vendor/gems/dslify/setup.rb} +3 -3
  283. data/{tasks → vendor/gems/dslify/tasks}/deployment.rake +4 -18
  284. data/vendor/gems/dslify/tasks/environment.rake +7 -0
  285. data/{tasks → vendor/gems/dslify/tasks}/website.rake +0 -0
  286. data/vendor/gems/dslify/test/test_dslify.rb +114 -0
  287. data/vendor/gems/dslify/website/index.html +86 -0
  288. data/vendor/gems/dslify/website/index.txt +83 -0
  289. data/{website → vendor/gems/dslify/website}/javascripts/rounded_corners_lite.inc.js +0 -0
  290. data/{website → vendor/gems/dslify/website}/stylesheets/screen.css +18 -27
  291. data/{website → vendor/gems/dslify/website}/template.html.erb +1 -2
  292. data/vendor/gems/parenting/History.txt +4 -0
  293. data/vendor/gems/parenting/Manifest.txt +13 -0
  294. data/vendor/gems/parenting/PostInstall.txt +2 -0
  295. data/vendor/gems/parenting/README.rdoc +47 -0
  296. data/vendor/gems/parenting/Rakefile +28 -0
  297. data/vendor/gems/parenting/lib/parenting/base.rb +65 -0
  298. data/vendor/gems/parenting/lib/parenting.rb +10 -0
  299. data/vendor/gems/parenting/parenting.gemspec +39 -0
  300. data/vendor/gems/parenting/script/console +10 -0
  301. data/vendor/gems/parenting/script/destroy +14 -0
  302. data/vendor/gems/parenting/script/generate +14 -0
  303. data/vendor/gems/parenting/test/file_to_eval.rb +9 -0
  304. data/vendor/gems/parenting/test/test_helper.rb +5 -0
  305. data/vendor/gems/parenting/test/test_parenting.rb +89 -0
  306. data/vendor/gems/suitcase/LICENSE +20 -0
  307. data/vendor/gems/suitcase/README.rdoc +31 -0
  308. data/vendor/gems/suitcase/Rakefile +57 -0
  309. data/vendor/gems/suitcase/VERSION.yml +4 -0
  310. data/vendor/gems/suitcase/lib/suitcase/unzipper.rb +15 -0
  311. data/vendor/gems/suitcase/lib/suitcase/zipper.rb +103 -0
  312. data/vendor/gems/suitcase/lib/suitcase.rb +5 -0
  313. data/vendor/gems/suitcase/suitcase.gemspec +52 -0
  314. data/vendor/gems/suitcase/test/suitcase_test.rb +89 -0
  315. data/vendor/gems/suitcase/test/test_dir/box.rb +1 -0
  316. data/vendor/gems/suitcase/test/test_dir/test.txt +1 -0
  317. data/vendor/gems/suitcase/test/test_helper.rb +12 -0
  318. metadata +428 -184
  319. data/Capfile +0 -1
  320. data/Manifest.txt +0 -404
  321. data/bin/cloud-add-access +0 -29
  322. data/bin/cloud-add-keypair +0 -28
  323. data/bin/cloud-maintain +0 -30
  324. data/bin/cloud-refresh +0 -17
  325. data/bin/server-list-responding +0 -24
  326. data/lib/poolparty/dependency_resolutions/base.rb +0 -12
  327. data/lib/poolparty/modules/configurable.rb +0 -36
  328. data/lib/poolparty/modules/method_missing_sugar.rb +0 -58
  329. data/lib/poolparty/monitors/monitors/cpu_monitor.rb +0 -15
  330. data/lib/poolparty/net/remote.rb +0 -38
  331. data/lib/poolparty/net/remoter.rb +0 -313
  332. data/lib/poolparty/plugins/line.rb +0 -77
  333. data/lib/poolparty/poolparty/resources/class_package.rb +0 -112
  334. data/lib/poolparty/poolparty/resources/conditional.rb +0 -67
  335. data/lib/poolparty/poolparty/resources/directory.rb +0 -26
  336. data/lib/poolparty/poolparty/resources/exec.rb +0 -28
  337. data/lib/poolparty/poolparty/resources/file.rb +0 -23
  338. data/lib/poolparty/poolparty/resources/package.rb +0 -24
  339. data/lib/poolparty/poolparty/resources/remote_file.rb +0 -26
  340. data/lib/poolparty/poolparty/resources/sshkey.rb +0 -23
  341. data/lib/poolparty/poolparty/resources/symlink.rb +0 -31
  342. data/lib/poolparty/poolparty/resources/variable.rb +0 -32
  343. data/lib/poolparty/provisioners/capistrano/recipies/master.rb +0 -112
  344. data/lib/poolparty/server/agent.rb +0 -59
  345. data/lib/poolparty/templates/puppet.conf +0 -28
  346. data/lib/poolparty/templates/puppetcleaner +0 -12
  347. data/lib/poolparty/templates/puppetrerun +0 -22
  348. data/poolparty.gemspec +0 -64
  349. data/spec/poolparty/dependency_resolutions/base_spec.rb +0 -11
  350. data/spec/poolparty/modules/configurable_spec.rb +0 -29
  351. data/spec/poolparty/poolparty/resources/class_package_spec.rb +0 -120
  352. data/spec/poolparty/poolparty/resources/conditional_spec.rb +0 -77
  353. data/spec/poolparty/poolparty/resources/cron_spec.rb +0 -50
  354. data/spec/poolparty/poolparty/resources/directory_spec.rb +0 -40
  355. data/spec/poolparty/poolparty/resources/exec_spec.rb +0 -37
  356. data/spec/poolparty/poolparty/resources/file_spec.rb +0 -40
  357. data/spec/poolparty/poolparty/resources/gem_spec.rb +0 -46
  358. data/spec/poolparty/poolparty/resources/host_spec.rb +0 -28
  359. data/spec/poolparty/poolparty/resources/package_spec.rb +0 -44
  360. data/spec/poolparty/poolparty/resources/remote_file_spec.rb +0 -40
  361. data/spec/poolparty/poolparty/resources/service_spec.rb +0 -45
  362. data/spec/poolparty/poolparty/resources/sshkey_spec.rb +0 -48
  363. data/spec/poolparty/poolparty/resources/symlink_spec.rb +0 -22
  364. data/spec/poolparty/poolparty/resources/user_spec.rb +0 -39
  365. data/spec/poolparty/poolparty/resources/variable_spec.rb +0 -24
  366. data/website/index.html +0 -107
  367. data/website/index.txt +0 -95
  368. data/website/stylesheets/code.css +0 -29
@@ -5,7 +5,7 @@
5
5
  cluster.
6
6
  =end
7
7
  require "date"
8
- require "#{::File.dirname(__FILE__)}/ec2/ec2_response_object"
8
+ require "#{::File.dirname(__FILE__)}/ec2_response_object"
9
9
 
10
10
  begin
11
11
  require 'EC2'
@@ -18,53 +18,58 @@ a different remoter base, specify it with:
18
18
 
19
19
  using :remoter_name
20
20
 
21
- in your config file, otherwise, to continue install amazon-ec2 with
21
+ in your config file, otherwise, to continue install grempe-amazon-ec2 with
22
22
 
23
- gem install amazon-ec2
23
+ sudo gem install grempe-amazon-ec2 --source http://gems.github.com
24
24
  EOM
25
25
  end
26
26
 
27
- class String
28
- def convert_from_ec2_to_ip
29
- self.gsub(/.compute-1.amazonaws.com*/, '').gsub(/ec2-/, '').gsub(/-/, '.')
30
- end
31
- def parse_datetime
32
- DateTime.parse( self.chomp ) rescue self
33
- end
27
+ class String
28
+ def convert_from_ec2_to_ip
29
+ self.gsub(/.compute-1.amazonaws.com*/, '').gsub(/ec2-/, '').gsub(/-/, '.')
34
30
  end
35
- module PoolParty
36
- module Ec2
37
- include PoolParty::Remote::RemoterBase
38
-
39
- def launch_new_instance!(num=1)
40
- instance = ec2.run_instances(
41
- :image_id => (ami || Base.ami),
42
- :user_data => "",
31
+ def parse_datetime
32
+ DateTime.parse( self.chomp ) rescue self
33
+ end
34
+ end
35
+
36
+ module PoolParty
37
+ module Remote
38
+ class Ec2 < Remote::RemoterBase
39
+
40
+ def self.launch_new_instance!(o = options)
41
+ raise "You must pass a keypair to launch an instance, or else you wont be able to login. options = #{o.inspect}" if !o[:keypair]
42
+ instance = ec2(o).run_instances(
43
+ :image_id => o[:ami],
44
+ :user_data => o[:user_data],
43
45
  :minCount => 1,
44
- :maxCount => num,
45
- :key_name => (keypair || Base.keypair),
46
- :availability_zone => (availabilty_zone || Base.availabilty_zone),
47
- :instance_type => "#{size || Base.size}",
48
- :group_id => ["#{security_group || Base.security_group}"])
46
+ :maxCount => o[:num],
47
+ :key_name => o[:keypair],
48
+ :availability_zone => o[:availabilty_zone],
49
+ :instance_type => o[:size],
50
+ :group_id => o[:security_group])
51
+
49
52
  begin
50
- h = EC2ResponseObject.get_hash_from_response(instance)
53
+ h = EC2ResponseObject.get_hash_from_response(instance.instancesSet.item.first)
51
54
  #h = instance.instancesSet.item.first
52
55
  rescue Exception => e
53
- h = instance
56
+ h = EC2ResponseObject.get_hash_from_response(instance) rescue instance
57
+ # h = instance
54
58
  end
55
59
  h
56
60
  end
57
61
  # Terminate an instance by id
58
- def terminate_instance!(instance_id=nil)
59
- ec2.terminate_instances(:instance_id => instance_id)
62
+ def self.terminate_instance!(o={}) #NOTE: maybe we should not allow this command wihtout an instance_idˇ
63
+ ec2(o).terminate_instances(:instance_id => o[:instance_id])
60
64
  end
61
65
  # Describe an instance's status
62
- def describe_instance(id=nil)
63
- describe_instances.select {|a| a[:name] == id}[0] rescue nil
66
+ def self.describe_instance(o={})
67
+ return describe_instances.first if o[:instance_id].nil?
68
+ describe_instances.detect {|a| a[:name] == o[:instance_id] || a[:ip] == o[:instance_id] || a[:instance_id] == o[:instance_id] }
64
69
  end
65
- def describe_instances
70
+ def self.describe_instances(o={})
66
71
  id = 0
67
- get_instances_description.each_with_index do |h,i|
72
+ get_instances_description(o).each_with_index do |h,i|
68
73
  if h[:status] == "running"
69
74
  inst_name = id == 0 ? "master" : "node#{id}"
70
75
  id += 1
@@ -75,14 +80,34 @@ end
75
80
  :name => inst_name,
76
81
  :hostname => h[:ip],
77
82
  :ip => h[:ip].convert_from_ec2_to_ip,
78
- :index => i,
83
+ :index => i, #TODO MF get the instance id from the aws result instead
79
84
  :launching_time => (h[:launching_time])
80
85
  })
81
86
  end.sort {|a,b| a[:index] <=> b[:index] }
82
87
  end
83
- # Get the s3 description for the response in a hash format
84
- def get_instances_description
85
- EC2ResponseObject.get_descriptions(ec2.describe_instances)
88
+
89
+ def self.ec2(o={})
90
+ @ec2 ||= EC2::Base.new( :access_key_id => o[:access_key],
91
+ :secret_access_key => o[:secret_access_key]
92
+ )
93
+ end
94
+ # Get the ec2 description for the response in a hash format
95
+ def self.get_instances_description(o={})
96
+ EC2ResponseObject.get_descriptions(ec2(o).describe_instances)
97
+ end
98
+ def get_descriptions(o={})
99
+ self.class.get_descriptions(o)
100
+ end
101
+
102
+ # Class method helpers
103
+ def self.aws_keys
104
+ unless @access_key && @secret_access_key
105
+ aws_keys = {}
106
+ aws_keys = YAML::load( File.open('/etc/poolparty/aws_keys.yml') ) rescue 'No aws_keys.yml file. Will try to use enviornment variables'
107
+ @access_key ||= aws_keys[:access_key] || ENV['AMAZON_ACCESS_KEY_ID'] || ENV['AWS_ACCESS_KEY']
108
+ @secret_access_key ||= aws_keys[:secret_access_key] || ENV['AMAZON_SECRET_ACCESS_KEY'] || ENV['AWS_SECRET_ACCESS_KEY']
109
+ end
110
+ [@access_key, @secret_access_key]
86
111
  end
87
112
 
88
113
  def after_launch_master(inst=nil)
@@ -104,8 +129,9 @@ end
104
129
  reset_remoter_base!
105
130
  when_all_assigned_ips {wait "5.seconds"}
106
131
  end
107
-
132
+
108
133
  # Attach a volume to the instance
134
+ # DEPRECATE this relies on master. master will be removed in next major release. This method will be in ec2_remote_instance instead, or require an instance id
109
135
  def attach_volume(instance=nil)
110
136
  if ebs_volume_id
111
137
  vputs "Attaching volume #{ebs_volume_id} to the master at #{ebs_volume_device}"
@@ -114,6 +140,7 @@ end
114
140
  end
115
141
  end
116
142
  # Associate an address with the instance using ec2
143
+ # DEPRECATE relies on master
117
144
  def associate_address(instance=nil)
118
145
  if set_master_ip_to
119
146
  dputs "Associating master with #{set_master_ip_to}"
@@ -132,33 +159,31 @@ end
132
159
  Kernel.system "ec2-add-keypair #{keypair} > #{new_keypair_path} && chmod 600 #{new_keypair_path}"
133
160
  end
134
161
  end
135
-
162
+
136
163
  # wrapper for remote base to perform a snapshot backup for the ebs volume
137
164
  def create_snapshot
138
165
  return nil if ebs_volume_id.nil?
139
166
  ec2.create_snapshot(:volume_id => ebs_volume_id)
140
167
  end
141
-
168
+
142
169
  # EC2 connections
143
- def ec2
144
- @ec2 ||= EC2::Base.new( :access_key_id => (access_key || Base.access_key),
145
- :secret_access_key => (secret_access_key || Base.secret_access_key)
146
- )
170
+ def ec2(o={})
171
+ @ec2 ||= self.class.ec2(o)
147
172
  end
148
-
173
+
149
174
  # These are tasks that run before the configuration runs
150
175
  def before_configuration_tasks
151
176
  if set_master_ip_to && master.ip && master.ip.to_s != set_master_ip_to.to_s
152
177
  associate_address(master)
153
178
  reset_remoter_base!
154
-
179
+
155
180
  when_no_pending_instances do
156
181
  when_all_assigned_ips do
157
182
  vputs "Associated master with #{set_master_ip_to}"
158
183
  end
159
184
  end
160
185
  end
161
-
186
+
162
187
  end
163
188
  def has_cert_and_key?
164
189
  pub_key && private_key
@@ -173,7 +198,7 @@ end
173
198
  def private_key
174
199
  @private_key ||= ENV["EC2_PRIVATE_KEY"] ? ENV["EC2_PRIVATE_KEY"] : nil
175
200
  end
176
-
201
+
177
202
  def custom_minimum_runnable_options
178
203
  [:ami, :availabilty_zone, :security_group]
179
204
  end
@@ -188,11 +213,11 @@ end
188
213
  "echo #{o.name} > /etc/hostname"
189
214
  ]
190
215
  end
191
-
216
+
192
217
  def after_install_tasks_for(o)
193
218
  [
194
- "cd /var/poolparty && wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-ec2.gem 2>&1",
195
- "/usr/bin/gem install --no-ri --no-rdoc amazon-ec2.gem 2>&1"
219
+ # "cd /var/poolparty && wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-ec2.gem 2>&1",
220
+ # "/usr/bin/gem install --no-ri --no-rdoc amazon-ec2.gem 2>&1"
196
221
  ]
197
222
  end
198
223
 
@@ -203,7 +228,8 @@ end
203
228
 
204
229
  def reset_base!
205
230
  @describe_instances = @cached_descriptions = nil
206
- end
231
+ end
207
232
  end
208
- register_remote_base :Ec2
209
- end
233
+
234
+ end
235
+ end
@@ -0,0 +1,53 @@
1
+ module PoolParty
2
+ module Remote
3
+ class Ec2RemoteInstance < RemoteInstance
4
+ include Dslify
5
+
6
+ attr_reader :my_cloud, :uniquely_identifiable_by, :found_at
7
+
8
+
9
+ # A new instance will be created from the passed in hash.
10
+ # This hash of passed in values will be converted to methods on this instance.
11
+ # The parent clouds describe_instances list will be searched for the first one matching any of this instance's provided unique identifiers.
12
+ # If an instance is found, this instance's properties will be set to the properties provided
13
+ # If the found instance has properties of the same key as the provided options, the found instance's values will override the passed in options
14
+ def initialize(opts={}, prnt=Ec2.new)
15
+ @uniquely_identifiable_by = [:ip, :name, :dns_name, :instance_id]
16
+ @original_options = opts
17
+ @my_cloud = prnt
18
+ super(opts, prnt)
19
+ find_myself(@uniquely_identifiable_by && opts.keys) if prnt.respond_to?(:describe_instances)
20
+ end
21
+
22
+ # Search the clouds describe_instances list for the first match on one of this nodes unique identifiers
23
+ def find_myself(unique_identifiers = @original_options.keys)
24
+ description_hash = @my_cloud.describe_instances.detect do|node|
25
+ unique_identifiers.detect{|identifier_key| node[identifier_key] == options[identifier_key]
26
+ }
27
+ end
28
+ return nil if description_hash.blank?
29
+ @found_at = Time.now
30
+ self.set_vars_from_options(description_hash)
31
+ self
32
+ end
33
+
34
+ # Is this instance running?
35
+ def running?
36
+ !(status =~ /running/).nil?
37
+ end
38
+ # Is this instance pending?
39
+ def pending?
40
+ !(status =~ /pending/).nil?
41
+ end
42
+ # Is this instance terminating?
43
+ def terminating?
44
+ !(status =~ /shutting/).nil?
45
+ end
46
+ # Has this instance been terminated?
47
+ def terminated?
48
+ !(status =~ /terminated/).nil?
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,5 @@
1
+ # Convenience class to convert standard amazon-ec2 responses from their camel cased style to a hash using underscore style.
2
+ # For example: instanceId to instance_id
1
3
  class EC2ResponseObject
2
4
  def self.get_descriptions(resp)
3
5
  rs = get_instance_from_response(resp)
@@ -48,7 +50,6 @@ class EC2ResponseObject
48
50
  group
49
51
  end
50
52
  def self.get_hash_from_response(resp, group = 'default')
51
- begin
52
53
  {
53
54
  :instance_id => resp.instanceId,
54
55
  :name => resp.instanceId,
@@ -59,8 +60,5 @@ class EC2ResponseObject
59
60
  :keypair => resp.keyName,
60
61
  :security_group => group
61
62
  }
62
- rescue Exception => e
63
- nil
64
- end
65
63
  end
66
64
  end
@@ -0,0 +1,168 @@
1
+ require "tempfile"
2
+ module PoolParty
3
+ class ChefRecipe
4
+ include Dslify
5
+ end
6
+ class Chef
7
+
8
+ plugin :chef do
9
+ def before_load(o, &block)
10
+ bootstrap_gems "chef", "ohai"
11
+ bootstrap_commands [
12
+ "mkdir -p /etc/chef/cookbooks /etc/chef/cache"
13
+ ]
14
+ end
15
+
16
+ def loaded o={}, &block
17
+ end
18
+
19
+ def recipe_files
20
+ @recipe_files ||= []
21
+ end
22
+
23
+ def basedir
24
+ @basedir ||= "#{Default.tmp_path}/dr_configure/chef/recipes/main"
25
+ end
26
+
27
+ def recipe file=nil, o={}, &block
28
+ if file
29
+ ::FileUtils.mkdir_p "#{basedir}/recipes" unless ::File.directory? basedir
30
+
31
+ unless ::File.file?(file)
32
+ tfile = Tempfile.new("main-poolparty-recipe")
33
+ tfile << file # copy the string into the temp file
34
+ file = tfile.path
35
+ end
36
+
37
+ ::File.cp file, "#{basedir}/recipes/default.rb"
38
+
39
+ templates o[:templates] if o[:templates]
40
+
41
+ recipe_files << basedir
42
+ # TODO: Enable neat syntax from within poolparty
43
+ else
44
+ raise <<-EOR
45
+ PoolParty currently only supports passing recipes as files. Please specify a file in your chef block and try again"
46
+ EOR
47
+ end
48
+ end
49
+
50
+ def templates templates=[]
51
+ if templates
52
+ ::FileUtils.mkdir_p "#{basedir}/templates/default/"
53
+ templates.each do |f|
54
+ if ::File.file?(f)
55
+ ::File.cp f, "#{basedir}/templates/default/#{::File.basename(f)}"
56
+ elsif ::File.directory?(f)
57
+ Dir["#{f}/*"].each {|f| ::File.cp f, "#{basedir}/templates/default/#{::File.basename(f)}" }
58
+ else
59
+ tfile = Tempfile.new("main-poolparty-recipe")
60
+ tfile << f # copy the string into the temp file
61
+ ::File.cp tfile.path, "#{basedir}/templates/default/#{::File.basename(f)}"
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ def json file=nil, &block
68
+ if @json_file
69
+ @json_file
70
+ else
71
+ if file
72
+ if ::File.file? file
73
+ ::File.cp file, "#{Default.tmp_path}/dr_configure/dna.json"
74
+ elsif file.is_a?(String)
75
+ ::File.open("#{Default.tmp_path}/dr_configure/dna.json", "w+"){|tf| tf << file } # is really a string
76
+ else
77
+ raise <<-EOM
78
+ Your json must either point to a file that exists or a string. Please check your configuration and try again
79
+ EOM
80
+ end
81
+ @json_file = "#{Default.tmp_path}/dr_configure/dna.json"
82
+ else
83
+ unless @recipe
84
+ @recipe = ChefRecipe.new
85
+ @recipe.instance_eval &block if block
86
+ @recipe.recipes(recipe_files.empty? ? ["poolparty"] : ["poolparty", "main"])
87
+ ::File.open("#{Default.tmp_path}/dr_configure/dna.json", "w+") {|f| f << @recipe.options.to_json }
88
+ @json_file = "#{Default.tmp_path}/dr_configure/dna.json"
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ def include_recipes *recps
95
+ unless recps.empty?
96
+ recps.each do |rcp|
97
+ Dir[::File.expand_path(rcp)].each do |f|
98
+ added_recipes << f
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ def config file=""
105
+ if @config_file
106
+ @config_file
107
+ else
108
+ if ::File.file? file
109
+ @config_file = file
110
+ else
111
+ conf_string = if file.empty?
112
+ # default config
113
+ <<-EOE
114
+ cookbook_path "/etc/chef/cookbooks"
115
+ node_path "/etc/chef/nodes"
116
+ log_level :info
117
+ file_store_path "/etc/chef"
118
+ file_cache_path "/etc/chef"
119
+ EOE
120
+ else
121
+ open(file).read
122
+ end
123
+ ::File.open("#{Default.tmp_path}/dr_configure/chef_config.rb", "w+") do |tf|
124
+ tf << conf_string
125
+ end
126
+ @config_file = "#{Default.tmp_path}/dr_configure/chef_config.rb"
127
+ end
128
+ end
129
+ end
130
+
131
+ def added_recipes
132
+ @added_recipes ||= []
133
+ end
134
+
135
+ def after_create
136
+ before_configure
137
+ end
138
+
139
+ def before_configure
140
+ config
141
+ json
142
+
143
+ if ::File.directory?("/etc/chef")
144
+ ::Suitcase::Zipper.add("/etc/chef/cookbooks/*", "chef/recipes")
145
+ ::Suitcase::Zipper.add("/etc/chef/dna.json", "chef/json")
146
+ ::Suitcase::Zipper.add("/etc/chef/solo.rb", "chef/")
147
+ end
148
+
149
+ ::Suitcase::Zipper.add(@config_file, "chef")
150
+ added_recipes.each do |rcp|
151
+ # ::FileUtils.cp_r rcp, "/tmp/poolparty/dr_configure/recipes/"
152
+ ::Suitcase::Zipper.add(rcp, "chef/recipes")
153
+ end
154
+
155
+ ::Suitcase::Zipper.add(@json_file, "chef/json")
156
+ configure_commands ["cp -f /var/poolparty/dr_configure/chef/json/dna.json /etc/chef/dna.json"]
157
+
158
+ recipe_files.each do |rf|
159
+ ::FileUtils.mkdir_p "/tmp/poolparty/dr_configure/recipes/#{::File.basename(rf)}"
160
+ ::FileUtils.cp_r rf, "/tmp/poolparty/dr_configure/recipes/#{::File.basename(rf)}"
161
+ # ::Suitcase::Zipper.add(rf, "chef/recipes")
162
+ end
163
+ end
164
+
165
+ end
166
+
167
+ end
168
+ end
@@ -5,64 +5,40 @@
5
5
  the master instance of the cloud. This enables you to send a directory
6
6
  up to the cloud and let the master host it for the remote slaves
7
7
  =end
8
- module PoolParty
8
+ module PoolParty
9
9
  class Deploydirectory
10
-
11
- virtual_resource(:deploydirectory) do
10
+
11
+ virtual_resource(:deploy_directory) do
12
12
 
13
- def loaded(opts={}, parent=self)
14
- package_directory
15
- unpack_directory
16
- sync_directories
17
- end
18
-
19
- def package_directory
20
- path = ::File.join( Base.tmp_path, "#{::File.basename(from_dir)}.tar.gz" )
21
- archive_name = "#{::File.basename(name).dir_safe}.tar.gz"
22
- cmd = "cd #{::File.expand_path(from_dir)} && tar -czf #{archive_name} . && mv #{archive_name} #{Base.tmp_path}"
23
- Kernel.system(cmd) unless testing
13
+ def loaded(opts={}, &block)
14
+ # raise(Exception.new("You must include a directory for the git repos set by :at")) if at?.nil?
15
+ # opts.has_key?(:at) ? at(opts.delete(:at)) : raise(Exception.new("You must include a directory for the git repos set by :at"))
16
+
17
+ package_deploy_directory
18
+ add_unpack_directory
24
19
  end
25
20
 
26
- def unpack_directory
27
- execute_on_master do
28
- has_exec({:name => "deploy-directory-#{name}", :requires => get_directory("#{cwd}"), :cwd => cwd}) do
29
- # && rm #{Base.tmp_path}/#{parent.name.dir_safe}.tar.gz
30
- archive_name = "#{::File.basename(name).dir_safe}.tar.gz"
31
- command "cd #{cwd}; tar -zxf #{Base.remote_storage_path}/#{archive_name}; rm #{Base.remote_storage_path}/#{archive_name}; chown #{owner} #{::File.basename(name).dir_safe}"
32
- onlyif "test -f #{Base.remote_storage_path}/#{archive_name}"
33
- end
34
- end
21
+ def package_deploy_directory
22
+ ::Suitcase::Zipper.add(sync_dir, "user_directory/")
35
23
  end
36
24
 
37
- def sync_directories
38
- execute_on_node do
39
- has_rsyncmirror(:dir => cwd, :name => "deploydirectory-#{name}")
25
+ def add_unpack_directory
26
+ has_directory("#{::File.dirname(basedir)}")
27
+
28
+ has_exec("unpack-#{::File.basename(basedir)}-deploy-directory") do
29
+ requires get_directory("#{::File.dirname(basedir)}")
30
+ cwd basedir
31
+ onlyif "test -f #{basedir}/#{sync_dir}"
32
+ command "cd #{cwd}; cp -R /var/poolparty/dr_configure/user_directory/#{sync_dir}; rm -rf /var/poolparty/dr_configure/#{name}"
40
33
  end
41
34
  end
42
-
35
+
43
36
  def from(dir)
44
- from_dir (dir.include?(" ") ? dir.gsub(/[ ]/, '') : dir)
37
+ sync_dir dir
45
38
  end
46
39
 
47
40
  def to(dir)
48
- cwd dir
49
- name dir
50
- has_directory(:name => "#{dir}",
51
- :requires => get_directory("#{::File.dirname(dir)}"),
52
- :owner => owner,
53
- :mode => mode)
54
- end
55
-
56
- # Since git is not a native type, we have to say which core resource
57
- # it is using to be able to require it
58
- def class_type_name
59
- "exec"
60
- end
61
-
62
- # Because we are requiring an exec, instead of a built-in package of the git, we have to overload
63
- # the to_s method and prepend it with the same name as above
64
- def key
65
- "deploy-directory-#{name}"
41
+ basedir dir
66
42
  end
67
43
 
68
44
  end
@@ -9,26 +9,41 @@ module PoolParty
9
9
 
10
10
  virtual_resource(:git_repos) do
11
11
 
12
- def loaded(opts={}, parent=self, &block)
13
- has_git
14
- has_git_repos
15
- end
16
-
17
- def has_git_repos
18
- has_exec({:name => key, :requires => [get_directory("#{working_dir}"), get_package("git-core")] }) do
19
- command requires_user ? "git clone #{requires_user}@#{source} #{working_dir}" : "cd #{working_dir} && git clone #{source}"
12
+ def loaded(opts={}, &block)
13
+ raise(Exception.new("You must include a directory for the git repos set by :at")) if at?.nil?
14
+ # opts.has_key?(:at) ? at(opts.delete(:at)) : raise(Exception.new("You must include a directory for the git repos set by :at"))
15
+ # opts.has_key?(:source) ? git_repos(opts.delete(:source) || opts[:name]) : raise(Exception.new("You must include the git source set by :source"))
16
+ has_package("git-core")
17
+ has_git_repository
18
+ end
19
+
20
+ def has_git_repository
21
+
22
+ has_directory(::File.dirname(working_dir))
23
+ has_directory(:name => "#{working_dir}", :requires => get_directory("#{::File.dirname(working_dir)}"))
24
+
25
+ has_exec(:name => "git-#{name}", :requires => [get_directory("#{working_dir}"), get_package("git-core")] ) do
26
+ # Cloud, GitRepos, Exec
27
+ command parent.requires_user? ? "git clone #{requires_user}@#{source} #{working_dir}" : "cd #{working_dir} && git clone #{source}"
20
28
  cwd "#{working_dir if working_dir}"
21
29
  creates creates_dir
22
30
  end
23
- has_exec(:name => "update-#{name}") do
24
- cwd ::File.dirname( creates_dir )
31
+ has_exec(:name => "update-#{name}", :cwd => ::File.dirname( creates_dir )) do
25
32
  command "git pull"
26
- end
33
+ end
34
+ if owner?
35
+ has_exec(:name => "chown-#{name}", :cwd => ::File.dirname( creates_dir )) do
36
+ command "chown #{owner} * -R"
37
+ end
38
+ end
39
+ end
40
+
41
+ def git_repos(src)
42
+ source src
27
43
  end
28
44
 
29
45
  def at(dir)
30
46
  working_dir dir
31
- has_directory(:name => "#{dir}", :requires => get_directory("#{::File.dirname(dir)}"))
32
47
  end
33
48
 
34
49
  def to(dir)
@@ -45,12 +60,6 @@ module PoolParty
45
60
  "exec"
46
61
  end
47
62
 
48
- # Because we are requiring an exec, instead of a built-in package of the git, we have to overload
49
- # the to_s method and prepend it with the same name as above
50
- def key
51
- "git-#{name}"
52
- end
53
-
54
63
  end
55
64
 
56
65
  end
@@ -0,0 +1,13 @@
1
+ module PoolParty
2
+ class LineInFile
3
+
4
+ virtual_resource(:line_in_file) do
5
+ def loaded(opts={}, &block)
6
+ has_exec "line_in_#{file}" do
7
+ command "grep -q \'#{line.safe_quote}\' #{file} || echo \'#{line.safe_quote}\' >> #{file}"
8
+ end
9
+ end
10
+ end
11
+
12
+ end
13
+ end
@@ -3,11 +3,10 @@ module PoolParty
3
3
 
4
4
  virtual_resource(:rsyncmirror) do
5
5
 
6
- def loaded(opts={}, parent=self)
7
- @parent = parent
6
+ def loaded(opts={})
8
7
  execute_on_node do
9
8
  @dir = dir || name
10
- has_exec(opts.merge({:command => "#{cloud.remote_rsync_command} --no-implied-dirs --delete-excluded #{Base.user}@master:#{@dir}/ #{@dir}/".safe_quote, :name => "rsync-#{name}"}))
9
+ has_exec(opts.merge({:command => "#{cloud.remote_rsync_command} --no-implied-dirs --delete-excluded #{Default.user}@master:#{@dir}/ #{@dir}/".safe_quote, :name => "rsync-#{name}"}))
11
10
  end
12
11
  end
13
12