fairchild-poolparty 1.1.5 → 1.2.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (385) hide show
  1. data/History.txt +3 -0
  2. data/README.txt +13 -9
  3. data/Rakefile +0 -1
  4. data/VERSION.yml +2 -2
  5. data/bin/cloud +43 -46
  6. data/bin/cloud-bootstrap +33 -23
  7. data/bin/cloud-configure +33 -34
  8. data/bin/cloud-console +31 -9
  9. data/bin/cloud-contract +27 -11
  10. data/bin/cloud-expand +32 -19
  11. data/bin/cloud-list +43 -15
  12. data/bin/cloud-osxcopy +22 -12
  13. data/bin/cloud-provision +39 -24
  14. data/bin/cloud-run +37 -0
  15. data/bin/cloud-setup-dev +31 -20
  16. data/bin/cloud-show +40 -21
  17. data/bin/cloud-ssh +24 -15
  18. data/bin/cloud-start +33 -19
  19. data/bin/cloud-terminate +34 -15
  20. data/bin/cloud-verify +41 -0
  21. data/bin/install-poolparty +22 -0
  22. data/bin/server-cloud-elections +17 -23
  23. data/bin/server-list-active +23 -22
  24. data/bin/server-manage-election +14 -23
  25. data/bin/server-show-stats +1 -1
  26. data/config/jeweler.rb +6 -6
  27. data/examples/basic.rb +13 -14
  28. data/examples/fairchild.rb +25 -20
  29. data/examples/maize.rb +37 -0
  30. data/examples/metavirt_cloud.rb +33 -0
  31. data/examples/simple.rb +13 -0
  32. data/examples/vmrun_cloud.rb +17 -0
  33. data/lib/poolparty/{aska/aska.rb → aska.rb} +3 -0
  34. data/lib/poolparty/core/array.rb +13 -1
  35. data/lib/poolparty/core/exception.rb +1 -1
  36. data/lib/poolparty/core/hash.rb +63 -2
  37. data/lib/poolparty/core/integer.rb +11 -0
  38. data/lib/poolparty/core/object.rb +41 -19
  39. data/lib/poolparty/core/proc.rb +0 -7
  40. data/lib/poolparty/core/string.rb +35 -2
  41. data/lib/poolparty/core/symbol.rb +10 -0
  42. data/lib/poolparty/core/time.rb +6 -0
  43. data/lib/poolparty/dependency_resolver/chef_resolver.rb +40 -41
  44. data/lib/poolparty/dependency_resolver/dependency_resolver.rb +1 -1
  45. data/lib/poolparty/dependency_resolver/dependency_resolver_cloud_extensions.rb +6 -6
  46. data/lib/poolparty/dependency_resolver/puppet.rb +0 -1
  47. data/lib/poolparty/dependency_resolver/puppet_resolver.rb +14 -48
  48. data/lib/poolparty/exceptions/MasterException.rb +2 -2
  49. data/lib/poolparty/extra/duration.rb +96 -0
  50. data/lib/poolparty/helpers/binary.rb +1 -1
  51. data/lib/poolparty/helpers/console.rb +0 -5
  52. data/lib/poolparty/helpers/optioner.rb +18 -13
  53. data/lib/poolparty/installers/base_installer.rb +113 -0
  54. data/lib/poolparty/installers/ec2.rb +141 -0
  55. data/lib/poolparty/installers/vmrun.rb +144 -0
  56. data/lib/poolparty/lite.rb +5 -2
  57. data/lib/poolparty/modules/callbacks.rb +15 -2
  58. data/lib/poolparty/modules/cloud_dsl.rb +10 -8
  59. data/lib/poolparty/modules/cloud_resourcer.rb +39 -59
  60. data/lib/poolparty/modules/daemonizable.rb +4 -5
  61. data/lib/poolparty/modules/definable_resource.rb +6 -7
  62. data/lib/poolparty/modules/file_writer.rb +2 -2
  63. data/lib/poolparty/modules/output.rb +2 -2
  64. data/lib/poolparty/modules/pinger.rb +9 -2
  65. data/lib/poolparty/modules/pretty_printer.rb +1 -1
  66. data/lib/poolparty/modules/resourcing_dsl.rb +1 -29
  67. data/lib/poolparty/modules/searchable_paths.rb +100 -0
  68. data/lib/poolparty/modules/user_helpers.rb +1 -1
  69. data/lib/poolparty/monitors/base_monitor.rb +65 -0
  70. data/lib/poolparty/monitors/monitor_daemon.rb +168 -0
  71. data/lib/poolparty/monitors/monitor_rack.rb +29 -15
  72. data/lib/poolparty/monitors/monitors/{time_monitor.rb → clock_monitor.rb} +7 -2
  73. data/lib/poolparty/monitors/monitors/cloud_monitor.rb +36 -0
  74. data/lib/poolparty/monitors/monitors/elections_monitor.rb +76 -0
  75. data/lib/poolparty/monitors/monitors/neighborhood_monitor.rb +15 -12
  76. data/lib/poolparty/monitors/monitors/stats_monitor.rb +68 -49
  77. data/lib/poolparty/net/init.rb +12 -7
  78. data/lib/poolparty/net/remote_instance.rb +48 -64
  79. data/lib/poolparty/net/remoter/cloud_control.rb +0 -177
  80. data/lib/poolparty/net/remoter/connections.rb +19 -14
  81. data/lib/poolparty/net/remoter/interactive.rb +30 -24
  82. data/lib/poolparty/net/remoter_base.rb +140 -48
  83. data/lib/poolparty/net/remoter_bases/ec2/ec2.rb +119 -71
  84. data/lib/poolparty/net/remoter_bases/ec2/ec2_remote_instance.rb +42 -31
  85. data/lib/poolparty/net/remoter_bases/ec2/ec2_response_object.rb +75 -10
  86. data/lib/poolparty/net/remoter_bases/libvirt/libvirt.rb +73 -0
  87. data/lib/poolparty/net/remoter_bases/libvirt/libvirt_instance.rb +64 -0
  88. data/lib/poolparty/net/remoter_bases/metavirt/metavirt.rb +110 -0
  89. data/lib/poolparty/net/remoter_bases/metavirt/metavirt_instance.rb +37 -0
  90. data/lib/poolparty/net/remoter_bases/vmrun/utilities/vm_disk.rb +1 -1
  91. data/lib/poolparty/net/remoter_bases/vmrun/utilities/vmx.rb +1 -1
  92. data/lib/poolparty/net/remoter_bases/vmrun/utilities/vmx_file.rb +117 -117
  93. data/lib/poolparty/net/remoter_bases/vmrun/vmrun.rb +59 -43
  94. data/lib/poolparty/net/remoter_bases/vmrun/vmrun_instance.rb +37 -21
  95. data/lib/poolparty/plugins/apache2/apache.rb +266 -0
  96. data/lib/poolparty/plugins/apache2/passenger_site.rb +86 -0
  97. data/lib/poolparty/plugins/apache2/php5.rb +40 -0
  98. data/lib/poolparty/plugins/apache2/virtual_host.rb +53 -0
  99. data/lib/poolparty/plugins/authorized_key.rb +29 -0
  100. data/lib/poolparty/plugins/bind.rb +5 -6
  101. data/lib/poolparty/plugins/{chef.rb → chef/chef.rb} +32 -44
  102. data/lib/poolparty/plugins/chef/chef_deploy.rb +55 -0
  103. data/lib/poolparty/plugins/chef/chef_deploy_definition.rb +32 -0
  104. data/lib/poolparty/plugins/chef/chef_library.rb +7 -0
  105. data/lib/poolparty/plugins/chef/chef_recipe.rb +7 -0
  106. data/lib/poolparty/plugins/chef/include_chef_recipe.rb +14 -0
  107. data/lib/poolparty/plugins/deploy_directory.rb +41 -26
  108. data/lib/poolparty/plugins/gem_package.rb +42 -14
  109. data/lib/poolparty/plugins/git.rb +62 -33
  110. data/lib/poolparty/{base_packages → plugins}/haproxy.rb +21 -20
  111. data/lib/poolparty/plugins/heartbeat.rb +16 -0
  112. data/lib/poolparty/plugins/host.rb +39 -0
  113. data/lib/poolparty/plugins/line_in_file.rb +24 -2
  114. data/lib/poolparty/plugins/plugin_template.rb +13 -0
  115. data/lib/poolparty/{base_packages/poolparty.rb → plugins/poolparty_base_packages.rb} +4 -6
  116. data/lib/poolparty/plugins/rails_deploy.rb +128 -0
  117. data/lib/poolparty/{base_packages → plugins}/ruby.rb +3 -3
  118. data/lib/poolparty/plugins/runit.rb +17 -92
  119. data/lib/poolparty/plugins/sshkey.rb +50 -0
  120. data/lib/poolparty/plugins/svn.rb +10 -8
  121. data/lib/poolparty/poolparty/cloud.rb +224 -61
  122. data/lib/poolparty/poolparty/default.rb +22 -15
  123. data/lib/poolparty/poolparty/key.rb +19 -28
  124. data/lib/poolparty/poolparty/neighborhoods.rb +16 -5
  125. data/lib/poolparty/poolparty/plugin.rb +49 -13
  126. data/lib/poolparty/poolparty/pool.rb +32 -9
  127. data/lib/poolparty/poolparty/poolparty_base_class.rb +65 -45
  128. data/lib/poolparty/poolparty/resource.rb +24 -49
  129. data/lib/poolparty/poolparty/service.rb +11 -9
  130. data/lib/poolparty/provision/boot_strapper.rb +48 -37
  131. data/lib/poolparty/provision/configurations/chef.rb +6 -5
  132. data/lib/poolparty/provision/dr_configure.rb +25 -19
  133. data/lib/poolparty/resources/cron.rb +37 -4
  134. data/lib/poolparty/resources/directory.rb +30 -0
  135. data/lib/poolparty/resources/exec.rb +31 -1
  136. data/lib/poolparty/resources/file.rb +54 -12
  137. data/lib/poolparty/resources/group.rb +21 -0
  138. data/lib/poolparty/resources/mount.rb +24 -4
  139. data/lib/poolparty/resources/package.rb +30 -6
  140. data/lib/poolparty/resources/remote_file.rb +33 -1
  141. data/lib/poolparty/resources/service.rb +22 -1
  142. data/lib/poolparty/resources/symlink.rb +37 -2
  143. data/lib/poolparty/resources/user.rb +25 -0
  144. data/lib/poolparty/resources/variable.rb +26 -1
  145. data/lib/poolparty/resources.rb +42 -0
  146. data/lib/poolparty/schema.rb +6 -8
  147. data/lib/poolparty/templates/apache2/apache2.conf +14 -0
  148. data/lib/poolparty/templates/apache2/base.conf.erb +168 -0
  149. data/lib/poolparty/templates/apache2/browser_fixes.conf.erb +26 -0
  150. data/lib/poolparty/templates/apache2/debian.conf.erb +675 -0
  151. data/lib/poolparty/templates/apache2/default-site.conf.erb +41 -0
  152. data/lib/poolparty/templates/apache2/directory_indexes.conf.erb +101 -0
  153. data/lib/poolparty/templates/apache2/logging-syslog.conf.erb +42 -0
  154. data/lib/poolparty/templates/apache2/mime-extras.conf.erb +211 -0
  155. data/lib/poolparty/templates/apache2/mime-minimal.conf.erb +15 -0
  156. data/lib/poolparty/templates/apache2/mpm-worker.conf.erb +20 -0
  157. data/lib/poolparty/templates/apache2/mpm-worker.erb +20 -0
  158. data/lib/poolparty/templates/apache2/passenger.conf.erb +20 -0
  159. data/lib/poolparty/templates/apache2/php.ini.erb +1253 -0
  160. data/lib/poolparty/templates/apache2/server-status.erb +19 -0
  161. data/lib/poolparty/templates/{gemrc → gemrc_template} +0 -0
  162. data/lib/poolparty/templates/haproxy.conf +2 -2
  163. data/lib/poolparty/templates/monitor.ru +13 -0
  164. data/lib/poolparty/templates/php.ini.erb +1253 -0
  165. data/lib/poolparty/verification/verifier_base.rb +10 -0
  166. data/lib/poolparty/verification/verifiers/http_match.rb +43 -0
  167. data/lib/poolparty/verification/verifiers/http_status.rb +59 -0
  168. data/lib/poolparty/verification/verifiers/ping.rb +18 -1
  169. data/lib/poolparty/verification/verify.rb +6 -0
  170. data/lib/poolparty.rb +14 -15
  171. data/lib/poolpartycl.rb +1 -1
  172. data/spec/bin/bin_spec_helper.rb +1 -0
  173. data/spec/bin/fixtures/bin_cloud_for_test.rb +0 -6
  174. data/spec/bin/server-list-active_spec.rb +4 -6
  175. data/spec/poolparty/core/object_spec.rb +1 -62
  176. data/spec/poolparty/core/ordered_hash_spec.rb +7 -7
  177. data/spec/poolparty/core/string_spec.rb +1 -1
  178. data/spec/poolparty/dependency_resolver/chef_resolver_spec.rb +0 -8
  179. data/spec/poolparty/dependency_resolver/dependency_resolver_cloud_extensions_spec.rb +35 -32
  180. data/spec/poolparty/extra/deployments_spec.rb +68 -68
  181. data/spec/poolparty/fixtures/clouds.json +1 -1
  182. data/spec/poolparty/fixtures/fake_key.pub +1 -0
  183. data/spec/poolparty/helpers/optioner_spec.rb +4 -11
  184. data/spec/poolparty/modules/cloud_resourcer_spec.rb +1 -1
  185. data/spec/poolparty/modules/searchable_paths_spec.rb +83 -0
  186. data/spec/poolparty/net/remote_instance_spec.rb +1 -2
  187. data/spec/poolparty/net/remoter_base_spec.rb +7 -11
  188. data/spec/poolparty/net/remoter_bases/ec2_mocks_and_stubs.rb +9 -11
  189. data/spec/poolparty/net/remoter_bases/ec2_remote_instance_spec.rb +6 -56
  190. data/spec/poolparty/net/remoter_bases/ec2_spec.rb +10 -7
  191. data/spec/poolparty/net/remoter_spec.rb +2 -3
  192. data/spec/poolparty/plugins/authorized_key_spec.rb +23 -0
  193. data/spec/poolparty/plugins/deploydirectory_spec.rb +64 -51
  194. data/spec/poolparty/plugins/git_spec.rb +8 -10
  195. data/spec/poolparty/poolparty/cloud_spec.rb +61 -64
  196. data/spec/poolparty/poolparty/configurers/files/ruby_basic.rb +2 -4
  197. data/spec/poolparty/poolparty/configurers/files/ruby_plugins.rb +1 -1
  198. data/spec/poolparty/poolparty/configurers/ruby_spec.rb +1 -6
  199. data/spec/poolparty/poolparty/default_spec.rb +23 -22
  200. data/spec/poolparty/poolparty/example_spec.rb +47 -26
  201. data/spec/poolparty/{base_packages → poolparty}/haproxy_spec.rb +1 -1
  202. data/spec/poolparty/{base_packages → poolparty}/heartbeat_spec.rb +1 -1
  203. data/spec/poolparty/poolparty/key_spec.rb +2 -2
  204. data/spec/poolparty/poolparty/neighborhoods_spec.rb +1 -1
  205. data/spec/poolparty/poolparty/plugin_model_spec.rb +13 -17
  206. data/spec/poolparty/poolparty/plugin_spec.rb +7 -7
  207. data/spec/poolparty/poolparty/pool_spec.rb +4 -10
  208. data/spec/poolparty/poolparty/resource_spec.rb +25 -29
  209. data/spec/poolparty/poolparty/script_spec.rb +1 -4
  210. data/spec/poolparty/poolparty/test_plugins/webserver.rb +27 -25
  211. data/spec/poolparty/resources/file_spec.rb +5 -4
  212. data/spec/poolparty/resources/sshkey_spec.rb +39 -40
  213. data/spec/poolparty/spec_helper.rb +9 -39
  214. data/tasks/poolparty.rake +29 -1
  215. data/tasks/spec.rake +39 -1
  216. data/test/fixtures/fake_clouds.rb +11 -0
  217. data/test/fixtures/metavirt_cloud.json +1 -0
  218. data/test/fixtures/test_key +1 -0
  219. data/test/poolparty/core/array_test.rb +11 -0
  220. data/test/poolparty/core/hash_test.rb +5 -7
  221. data/test/poolparty/core/object_test.rb +29 -0
  222. data/test/poolparty/dependency_resolver/chef_resolver_test.rb +82 -0
  223. data/test/poolparty/dependency_resolver/puppet_resolver_test.rb +5 -26
  224. data/test/poolparty/modules/callbacks_test.rb +1 -1
  225. data/test/poolparty/modules/cloud_dsl_test.rb +10 -8
  226. data/test/poolparty/monitors/test_base_monitor.rb +17 -0
  227. data/test/poolparty/monitors/test_monitor_rack.rb +26 -0
  228. data/test/poolparty/net/remoter_base_test.rb +17 -0
  229. data/test/poolparty/net/remoter_bases/libvirt/libvirt_test.rb +70 -0
  230. data/test/poolparty/net/remoter_bases/metavirt/metavirt_test.rb +81 -0
  231. data/test/poolparty/net/remoter_bases/vmrun/vmrun_test.rb +58 -27
  232. data/test/poolparty/plugins/chef_deploy_test.rb +37 -0
  233. data/test/poolparty/plugins/chef_plugin_test.rb +23 -0
  234. data/test/poolparty/plugins/rails_deploy_test.rb +50 -0
  235. data/test/poolparty/poolparty/cloud_test.rb +65 -0
  236. data/test/poolparty/poolparty/isolated_cloud_test.rb +25 -0
  237. data/test/poolparty/poolparty/neighborhood_test.rb +1 -1
  238. data/test/poolparty/poolparty/plugin_test.rb +19 -0
  239. data/test/poolparty/poolparty/pool_test.rb +22 -0
  240. data/test/poolparty/poolparty/poolparty_base_class_test.rb +53 -15
  241. data/test/poolparty/poolparty/schema_test.rb +13 -0
  242. data/test/poolparty/poolparty/template_test.rb +6 -6
  243. data/test/poolparty/verification/verify_test.rb +7 -3
  244. data/test/test_helper.rb +15 -4
  245. data/test/test_methods.rb +11 -0
  246. data/vendor/chef/apache2/attributes/apache.rb +1 -1
  247. data/vendor/gems/dslify/LICENSE +20 -0
  248. data/vendor/gems/dslify/README.rdoc +33 -0
  249. data/vendor/gems/dslify/Rakefile +56 -0
  250. data/vendor/gems/dslify/VERSION.yml +4 -0
  251. data/vendor/gems/dslify/dslify.gemspec +29 -0
  252. data/vendor/gems/dslify/lib/dslify.rb +81 -0
  253. data/vendor/gems/dslify/test/dslify_test.rb +283 -0
  254. data/vendor/gems/dslify/test/test_helper.rb +7 -0
  255. data/vendor/gems/git-style-binaries/README.markdown +280 -0
  256. data/vendor/gems/git-style-binaries/Rakefile +64 -0
  257. data/vendor/gems/git-style-binaries/VERSION.yml +4 -0
  258. data/vendor/gems/git-style-binaries/doc/EXAMPLES +1 -0
  259. data/vendor/gems/git-style-binaries/doc/gsb-screencast.png +0 -0
  260. data/vendor/gems/git-style-binaries/doc/poolparty-binaries.screenplay +412 -0
  261. data/vendor/gems/git-style-binaries/git-style-binaries.gemspec +78 -0
  262. data/vendor/gems/git-style-binaries/lib/ext/colorize.rb +198 -0
  263. data/vendor/gems/git-style-binaries/lib/ext/core.rb +16 -0
  264. data/vendor/gems/git-style-binaries/lib/git-style-binary/autorunner.rb +21 -0
  265. data/vendor/gems/git-style-binaries/lib/git-style-binary/command.rb +204 -0
  266. data/vendor/gems/git-style-binaries/lib/git-style-binary/commands/help.rb +32 -0
  267. data/vendor/gems/git-style-binaries/lib/git-style-binary/helpers/name_resolver.rb +78 -0
  268. data/vendor/gems/git-style-binaries/lib/git-style-binary/helpers/pager.rb +37 -0
  269. data/vendor/gems/git-style-binaries/lib/git-style-binary/parser.rb +223 -0
  270. data/vendor/gems/git-style-binaries/lib/git-style-binary.rb +88 -0
  271. data/vendor/gems/git-style-binaries/test/fixtures/flickr +4 -0
  272. data/vendor/gems/git-style-binaries/test/fixtures/flickr-download +17 -0
  273. data/vendor/gems/git-style-binaries/test/fixtures/wordpress +42 -0
  274. data/vendor/gems/git-style-binaries/test/fixtures/wordpress-categories +18 -0
  275. data/vendor/gems/git-style-binaries/test/fixtures/wordpress-list +18 -0
  276. data/vendor/gems/git-style-binaries/test/fixtures/wordpress-post +26 -0
  277. data/vendor/gems/git-style-binaries/test/git-style-binary/command_test.rb +17 -0
  278. data/vendor/gems/git-style-binaries/test/git_style_binary_test.rb +21 -0
  279. data/vendor/gems/git-style-binaries/test/running_binaries_test.rb +224 -0
  280. data/vendor/gems/git-style-binaries/test/shoulda_macros/matching_stdio.rb +13 -0
  281. data/vendor/gems/git-style-binaries/test/test_helper.rb +28 -0
  282. data/vendor/gems/parenting/History.txt +4 -0
  283. data/vendor/gems/parenting/Manifest.txt +14 -0
  284. data/vendor/gems/parenting/PostInstall.txt +2 -0
  285. data/vendor/gems/parenting/README.rdoc +47 -0
  286. data/vendor/gems/parenting/Rakefile +28 -0
  287. data/vendor/gems/parenting/lib/parenting/parenting.rb +70 -0
  288. data/vendor/gems/parenting/lib/parenting.rb +10 -0
  289. data/vendor/gems/parenting/parenting.gemspec +39 -0
  290. data/vendor/gems/parenting/script/console +10 -0
  291. data/vendor/gems/parenting/script/destroy +14 -0
  292. data/vendor/gems/parenting/script/generate +14 -0
  293. data/vendor/gems/parenting/test/file_to_eval.rb +9 -0
  294. data/vendor/gems/parenting/test/test_helper.rb +5 -0
  295. data/vendor/gems/parenting/test/test_parenting.rb +117 -0
  296. data/vendor/gems/suitcase/LICENSE +20 -0
  297. data/vendor/gems/suitcase/README.rdoc +31 -0
  298. data/vendor/gems/suitcase/Rakefile +57 -0
  299. data/vendor/gems/suitcase/VERSION.yml +4 -0
  300. data/vendor/gems/suitcase/lib/suitcase/unzipper.rb +15 -0
  301. data/vendor/gems/suitcase/lib/suitcase/zipper.rb +167 -0
  302. data/vendor/gems/suitcase/lib/suitcase.rb +5 -0
  303. data/vendor/gems/suitcase/suitcase.gemspec +32 -0
  304. data/vendor/gems/suitcase/test/suitcase_test.rb +108 -0
  305. data/vendor/gems/suitcase/test/test_dir/box.rb +1 -0
  306. data/vendor/gems/suitcase/test/test_dir/gems/famoseagle-carrot-0.6.0.gem +0 -0
  307. data/vendor/gems/suitcase/test/test_dir/test.txt +1 -0
  308. data/vendor/gems/suitcase/test/test_helper.rb +12 -0
  309. data/vendor/gems/trollop/FAQ.txt +35 -0
  310. data/vendor/gems/trollop/History.txt +97 -0
  311. data/vendor/gems/trollop/Manifest.txt +7 -0
  312. data/vendor/gems/trollop/README.txt +40 -0
  313. data/vendor/gems/trollop/Rakefile +36 -0
  314. data/vendor/gems/trollop/lib/trollop.rb +735 -0
  315. data/vendor/gems/trollop/release-script.txt +13 -0
  316. data/vendor/gems/trollop/test/test_trollop.rb +1042 -0
  317. data/vendor/gems/trollop/www/index.html +167 -0
  318. metadata +205 -150
  319. data/bin/cloud-describe +0 -28
  320. data/bin/cloud-handle-load +0 -27
  321. data/bin/cloud-rsync +0 -28
  322. data/bin/cloud-spec +0 -41
  323. data/bin/messenger-get-current-nodes +0 -14
  324. data/bin/server-become-master +0 -24
  325. data/bin/server-build-messenger +0 -28
  326. data/bin/server-clean-cert-for +0 -15
  327. data/bin/server-provision +0 -32
  328. data/bin/server-start-agent +0 -15
  329. data/bin/server-start-client +0 -29
  330. data/bin/server-start-master +0 -26
  331. data/bin/server-start-node +0 -32
  332. data/bin/server-stop-client +0 -3
  333. data/bin/server-stop-master +0 -3
  334. data/bin/server-stop-node +0 -3
  335. data/bin/server-update-hosts +0 -49
  336. data/examples/poolparty.rb +0 -12
  337. data/lib/poolparty/base_packages/heartbeat.rb +0 -58
  338. data/lib/poolparty/base_packages/runit.rb +0 -21
  339. data/lib/poolparty/capistrano/cloud_tasks.rb +0 -10
  340. data/lib/poolparty/capistrano.rb +0 -54
  341. data/lib/poolparty/config/postlaunchmessage.txt +0 -5
  342. data/lib/poolparty/core/metaid.rb +0 -15
  343. data/lib/poolparty/core/module.rb +0 -40
  344. data/lib/poolparty/extra/deployments.rb +0 -31
  345. data/lib/poolparty/helpers/display.rb +0 -30
  346. data/lib/poolparty/net/messenger.rb +0 -57
  347. data/lib/poolparty/net/remote_bases.rb +0 -21
  348. data/lib/poolparty/plugins/chef_deploy.rb +0 -58
  349. data/lib/poolparty/plugins/dynomite.rb +0 -14
  350. data/lib/poolparty/plugins/nanite.rb +0 -41
  351. data/lib/poolparty/plugins/rsyncmirror.rb +0 -28
  352. data/lib/poolparty/plugins/tokyo_tyrant.rb +0 -23
  353. data/lib/poolparty/poolparty/plugin_model.rb +0 -45
  354. data/lib/poolparty/resources/host.rb +0 -16
  355. data/lib/poolparty/resources/sshkey.rb +0 -27
  356. data/lib/poolparty/services/conditional.rb +0 -46
  357. data/lib/poolparty/spec/core/string.rb +0 -18
  358. data/lib/poolparty/spec/matchers/a_spec_extensions_base.rb +0 -26
  359. data/lib/poolparty/spec/matchers/have_cron.rb +0 -28
  360. data/lib/poolparty/spec/matchers/have_deploydirectory.rb +0 -15
  361. data/lib/poolparty/spec/matchers/have_directory.rb +0 -31
  362. data/lib/poolparty/spec/matchers/have_exec.rb +0 -28
  363. data/lib/poolparty/spec/matchers/have_file.rb +0 -28
  364. data/lib/poolparty/spec/matchers/have_gempackage.rb +0 -28
  365. data/lib/poolparty/spec/matchers/have_git.rb +0 -28
  366. data/lib/poolparty/spec/matchers/have_host.rb +0 -28
  367. data/lib/poolparty/spec/matchers/have_mount.rb +0 -28
  368. data/lib/poolparty/spec/matchers/have_package.rb +0 -28
  369. data/lib/poolparty/spec/matchers/have_remotefile.rb +0 -28
  370. data/lib/poolparty/spec/matchers/have_rsyncmirror.rb +0 -28
  371. data/lib/poolparty/spec/matchers/have_service.rb +0 -28
  372. data/lib/poolparty/spec/matchers/have_sshkey.rb +0 -28
  373. data/lib/poolparty/spec/matchers/have_symlink.rb +0 -28
  374. data/lib/poolparty/spec/matchers/have_variable.rb +0 -32
  375. data/lib/poolparty/spec/spec/dynamic_matchers.rb +0 -63
  376. data/lib/poolparty/spec/spec/ensure_matchers_exist.rb +0 -7
  377. data/lib/poolparty/spec/templates/have_base.rb +0 -28
  378. data/lib/poolparty/spec.rb +0 -31
  379. data/spec/poolparty/core/module_spec.rb +0 -15
  380. data/spec/poolparty/helpers/display_spec.rb +0 -13
  381. data/spec/poolparty/id_rsa +0 -27
  382. data/spec/poolparty/net/messenger_spec.rb +0 -16
  383. data/spec/poolparty/resources/host_spec.rb +0 -35
  384. data/spec/poolparty/services/conditional_spec.rb +0 -52
  385. data/spec/poolparty/spec/core/string_spec.rb +0 -57
@@ -1,4 +1,3 @@
1
- require File.dirname(__FILE__) + "/plugin_model"
2
1
  require File.dirname(__FILE__) + "/resource"
3
2
 
4
3
  module PoolParty
@@ -16,30 +15,43 @@ module PoolParty
16
15
  # TODO: Deprecate
17
16
  def with_cloud(cl, opts={}, &block)
18
17
  raise CloudNotFoundException.new("Cloud not found") unless cl
19
- cl.options.merge!(opts) if opts
18
+ cl.dsl_options.merge!(opts) if opts
20
19
  cl.run_in_context &block if block
21
20
  end
22
21
 
23
22
  class Cloud < PoolParty::PoolPartyBaseClass
24
23
  attr_reader :templates, :cloud_name, :remote_base
24
+ attr_accessor :started_instance, :running_action
25
+
26
+ # Default set of options. Most take the Default options from the default class
27
+ default_options(
28
+ {
29
+ :expand_when => Default.expand_when,
30
+ :contract_when => Default.contract_when,
31
+ :minimum_instances => 2,
32
+ :maximum_instances => 5,
33
+ :ec2_dir => ENV["EC2_HOME"],
34
+ :minimum_runtime => Default.minimum_runtime,
35
+ # :dependency_resolver => ChefResolver,
36
+ :remoter_base => Default.remoter_base,
37
+ :keypair => nil,
38
+ :keypair_path => nil,
39
+ :keypair_name => nil
40
+ }.merge(Remote::Ec2.default_options)
41
+ )
25
42
 
26
43
  include CloudResourcer
27
- include PoolParty::PluginModel
28
44
  include PoolParty::Resources
29
45
  include PoolParty::Callbacks
30
46
  include PoolParty::DependencyResolverCloudExtensions
31
47
  include PrettyPrinter
32
48
 
33
49
  # Net methods
34
- include ::PoolParty::Remote
50
+ include PoolParty::Remote
35
51
  include PoolParty::CloudDsl
36
52
  include PoolParty::Verification
37
53
  # include PoolParty::Monitors
38
54
 
39
- def verbose
40
- true
41
- end
42
-
43
55
  def self.immutable_methods
44
56
  [:name]
45
57
  end
@@ -51,27 +63,28 @@ module PoolParty
51
63
 
52
64
  alias :name :cloud_name
53
65
 
54
- # Call the remoter commands on the cloud if they don't exist on the cloud itself
55
- # This gives the cloud access to the remote_base's methods
66
+ # Call the remoter commands on the remoter_base if they don't exist on the cloud itself.
67
+ # This gives the cloud access to the remote_base's methods.
56
68
  def method_missing(m, *args, &block)
57
- remote_base.respond_to?(m) ? remote_base.send(m, *args, &block) : super
69
+ if remote_base.respond_to?(m)
70
+ remoter_opts = dsl_options.merge(remote_base.dsl_options).choose do |k,v|
71
+ remote_base.dsl_options.has_key?(k)
72
+ end
73
+ if args.size==1 && args.first.respond_to?(:merge)
74
+ new_args = [remoter_opts.merge(args.first)]
75
+ else
76
+ new_args = args.push(remoter_opts)
77
+ end
78
+ remote_base.send(m, *(new_args), &block)
79
+ else
80
+ super
81
+ end
58
82
  end
59
83
 
60
- # Default set of options. Most take the Default options from the default class
61
- default_options(
62
- :expand_when => Default.expand_when,
63
- :contract_when => Default.contract_when,
64
- :minimum_instances => 2,
65
- :maximum_instances => 5,
66
- :access_key => Default.access_key,
67
- :secret_access_key => Default.secret_access_key,
68
- :ec2_dir => ENV["EC2_HOME"],
69
- :minimum_runtime => Default.minimum_runtime,
70
- :user => Default.user
71
- )
72
-
73
84
  additional_callbacks [
74
- "after_launch_instance"
85
+ "after_launch_instance",
86
+ "before_provision",
87
+ "after_provision"
75
88
  ]
76
89
 
77
90
  # Freeze the cloud_name so we can't modify it at all, set the plugin_directory
@@ -80,7 +93,9 @@ module PoolParty
80
93
  @cloud_name = name
81
94
  @cloud_name.freeze
82
95
 
83
- plugin_directory "#{pool_specfile ? ::File.dirname(pool_specfile) : Dir.pwd}/plugins"
96
+ setup_callbacks
97
+
98
+ plugin_directory "#{pool_specfile ? ::File.dirname(pool_specfile) : Dir.pwd}/plugins"
84
99
  before_create
85
100
  super
86
101
  after_create
@@ -91,10 +106,8 @@ module PoolParty
91
106
  @cloud_name ||= @cloud_name ? @cloud_name : (args.empty? ? :default_cloud : args.first)
92
107
  end
93
108
 
94
- def before_create
95
- context_stack.push self
96
- (parent ? parent : self).add_poolparty_base_requirements
97
- context_stack.pop
109
+ def before_create
110
+ add_poolparty_base_requirements
98
111
  end
99
112
 
100
113
  # Callback
@@ -102,7 +115,7 @@ module PoolParty
102
115
  # here the base requirements are added as well as an empty chef recipe is called
103
116
  # Also, the after_create hook on the plugins used by the cloud are called here
104
117
  def after_create
105
- ::FileUtils.mkdir_p("#{Default.tmp_path}/dr_configure")
118
+ ::FileUtils.mkdir_p("#{tmp_path}/dr_configure")
106
119
 
107
120
  run_in_context do
108
121
  add_optional_enabled_services
@@ -112,30 +125,86 @@ module PoolParty
112
125
 
113
126
  plugin_store.each {|a| a.call_after_create_callbacks }
114
127
  setup_defaults
115
-
116
- setup_callbacks
128
+ end
129
+
130
+ # CALLBACKS
131
+ # To hook into the chain of processes that PoolParty uses
132
+ # when launching, bootstrapping, configuring tasks, call
133
+ # these methods in your clouds.rb.
134
+ # Example:
135
+ #
136
+ # after :bootstrap do
137
+ # stuff
138
+ # end
139
+ #
140
+ # These store the blocks into the after/before_blocks on self
141
+ # and are called as appropriate at the runtime
142
+ def after time, &block
143
+ (after_blocks[time.to_sym] ||= []) << block
144
+ end
145
+ def before time, &block
146
+ (before_blocks[time.to_sym] ||= []) << block
117
147
  end
118
148
 
119
149
  # setup defaults for the cloud
120
150
  def setup_defaults
121
- # this can be overridden in the spec, but ec2 is the default
122
- using :ec2
123
- options[:keypair] ||= keypair rescue nil
124
- options[:rules] = {:expand => dsl_options[:expand_when], :contract => dsl_options[:contract_when]}
125
- dependency_resolver 'chef'
126
- # enable :haproxy unless dsl_options[:haproxy] == :disabled
151
+ set_vars_from_options(:keypair_name => key.basename, :keypair_path => key.full_filepath) rescue nil
152
+
153
+ dsl_options[:rules] = {:expand => "#{dsl_options[:expand_when]}",
154
+ :contract => dsl_options[:contract_when]}
155
+
156
+ dependency_resolver 'chef'
157
+ using Default.remoter_base unless @remote_base
127
158
  end
128
159
 
129
160
  def after_launch_instance(inst=nil)
130
161
  remote_base.send :after_launch_instance, inst
131
162
  end
132
163
 
164
+ # Keypairs
165
+ # Use the keypair path
166
+ def keypair(*args)
167
+ if args && !args.empty?
168
+ args.each do |arg|
169
+ unless arg.nil? || _keypair_filepaths.include?(arg)
170
+ k = arg.is_a?(Key) ? arg : Key.new(arg)
171
+ _keypairs.unshift k
172
+ end
173
+ end
174
+ self.keypair
175
+ else
176
+ unless @keypair
177
+ @keypair = _keypairs.select {|key| key.exists? }.first
178
+ self.keypair_path = @keypair.full_filepath
179
+ self.keypair_name = @keypair.basename
180
+ self.keypair = @keypair
181
+ end
182
+ @keypair
183
+ end
184
+ end
185
+
186
+ alias :set_keypairs :keypair
187
+ alias :key :keypair
188
+
189
+ def _keypairs
190
+ @keypairs ||= [Key.new]
191
+ end
192
+
193
+ # Collect the filepaths of the already loaded keypairs
194
+ def _keypair_filepaths
195
+ _keypairs.map {|a| a.filepath }
196
+ end
197
+
198
+ #TODO: deprecate: use key.full_filepath
199
+ def full_keypair_path
200
+ @full_keypair_path ||= keypair.full_filepath
201
+ end
202
+
133
203
  # provide list of public ips to get into the cloud
134
204
  def ips
135
205
  nodes(:status => "running").map {|ri| ri.ip }
136
206
  end
137
207
 
138
- # TODO: make this be a random ip, since we should not rely on it being the same each time
139
208
  def ip
140
209
  ips.first
141
210
  end
@@ -171,15 +240,15 @@ module PoolParty
171
240
  end
172
241
  end
173
242
 
174
- #FIXME MOVE TO DEPENDECY RESOL
243
+ #FIXME MOVE TO DEPENDENCY RESOLVER
175
244
  # Configuration files
176
245
  def build_manifest
177
246
  vputs "Building manifest"
178
247
  @build_manifest ||= build_from_existing_file
179
- unless @build_manifest
248
+ unless @build_manifest
180
249
  props = to_properties_hash
181
250
 
182
- @build_manifest = options[:dependency_resolver].send(:compile, props, self)
251
+ @build_manifest = dependency_resolver.send(:compile, props, self)
183
252
  end
184
253
  dputs "Finished creating manifest"
185
254
  @build_manifest
@@ -197,7 +266,7 @@ module PoolParty
197
266
  ::FileTest.file?("#{Default.base_config_directory}/poolparty.pp") ? open("#{Default.base_config_directory}/poolparty.pp").read : nil
198
267
  end
199
268
 
200
- def write_properties_hash(filename=::File.join(Default.tmp_path, Default.properties_hash_filename) )
269
+ def write_properties_hash(filename=::File.join(tmp_path, Default.properties_hash_filename) )
201
270
  file_path = ::File.dirname(filename)
202
271
  file_name = "#{::File.basename(filename, ::File.extname(filename))}_#{name}#{::File.extname(filename)}"
203
272
  output = to_properties_hash.to_json
@@ -205,32 +274,126 @@ module PoolParty
205
274
  true
206
275
  end
207
276
 
208
- # Add all the poolparty requirements here
209
- # NOTE: These are written as plugins in the lib/poolparty/base_packages directory
210
- # for examples.
211
- # Also note that there is no block associated. This is because we have written
212
- # all that is necessary in a method called enable
213
- # which is called when there is no block
214
- def add_poolparty_base_requirements
215
- # poolparty_base_heartbeat
216
- poolparty_base_ruby
217
- poolparty_base_packages
277
+ def to_hash
278
+ hsh = to_properties_hash
279
+ hsh[:options].merge!({:remote_base => remote_base.to_hash})
280
+ hsh
281
+ end
282
+
283
+ def to_h
284
+ to_hash
218
285
  end
219
286
 
220
- # TODO: Deprecate
221
- def other_clouds
222
- arr = []
223
- clouds.each do |name, cl|
224
- arr << cl if name != self.name
287
+ # TODO: test
288
+ # ruby -rrubygems -e 'require "poolparty";puts Cloud.load_from_json(open("/etc/poolparty/clouds.json").read).minimum_instances'
289
+ def self.load_from_json(str, o={})
290
+ if ::File.file?(str)
291
+ str = open(str).read
292
+ end
293
+ parsed = JSON.parse(str).symbolize_keys!
294
+ opts = parsed.options
295
+ opts["keypair"] = opts["keypair_path"] = opts["keypair_name"]
296
+
297
+ cld = Cloud.new opts.cloud_name.to_sym
298
+ cld.dsl_options.merge! opts
299
+ cld.using opts.remoter_base.to_sym, opts.remote_base
300
+ cld.dependency_resolver opts[:dependency_resolver]
301
+
302
+ #TODO: will never run
303
+ unless true || o[:full_stack]
304
+ context_stack.push cld
305
+ cld.ordered_resources = parsed.resources.map do |r|
306
+ case typ = r.delete(:pp_type)
307
+ when "plugin"
308
+ # This may become a problem on the server where the plugins
309
+ # cannot be found. TODO: Fix?!? How? Uh... fake plugin maybe?
310
+ cld.send(r[:name].gsub(/_class/, '').to_sym) do
311
+ set_vars_from_options(r)
312
+ end
313
+ else
314
+ cld.send("has_#{typ}".to_sym, r)
315
+ end
316
+ context_stack.pop
317
+ end
318
+ else
319
+ cld.ordered_resources = parsed.resources
225
320
  end
226
- arr
321
+ cld
227
322
  end
228
323
 
324
+ def remote_base(n=nil)
325
+ if n.nil?
326
+ @remote_base
327
+ else
328
+ @remote_base = n
329
+ end
330
+ end
331
+
332
+ def tmp_path
333
+ Default.tmp_path / pool.name / name
334
+ end
335
+
229
336
  # Reset the entire cloud
230
337
  def reset!
231
338
  reset_remoter_base!
232
339
  @build_manifest = @describe_instances = @remote_instances_list = nil
233
- end
340
+ end
341
+
342
+ # Call before and after configure callbacks
343
+ # on the cloud.
344
+ # These are called from the dynamically defined callback method
345
+ # call_before/after_configure/bootstrap_callbacks
346
+ # from within callbacks.rb
347
+ # If there is a callback block defined for the specific runtime
348
+ # method being called, then the appropriate callback blocks
349
+ # will be accessed and called from within the before/after_ callback
350
+ def before_bootstrap
351
+ before_blocks[:bootstrap].each {|b| b.call(self) } if before_blocks.has_key?(:bootstrap)
352
+ end
353
+ def after_bootstrap
354
+ after_blocks[:bootstrap].each {|b| b.call(self) } if after_blocks.has_key?(:bootstrap)
355
+ end
356
+ def before_provision
357
+ before_blocks[:provision].each {|b| b.call(self) } if before_blocks.has_key?(:provision)
358
+ end
359
+ def after_provision
360
+ after_blocks[:provision].each {|b| b.call(self) } if after_blocks.has_key?(:provision)
361
+ end
362
+ def before_configure
363
+ before_blocks[:configure].each {|b| b.call(self) } if before_blocks.has_key?(:configure)
364
+ end
365
+ def after_configure
366
+ after_blocks[:configure].each {|b| b.call(self) } if after_blocks.has_key?(:configure)
367
+ end
368
+
369
+ private
370
+
371
+ # Storage for the after and before callback blocks
372
+ # when calling the callbacks in the cloud. They are stored as hashes with
373
+ # and are filled with arrays of blocks during load-time
374
+ def after_blocks
375
+ @after_blocks ||= {}
376
+ end
377
+ def before_blocks
378
+ @before_blocks ||= {}
379
+ end
380
+
381
+ def pool
382
+ parent && parent.is_a?(Pool) ? parent : self
383
+ end
384
+
385
+ # Add all the poolparty requirements here
386
+ # NOTE: These are written as plugins in the lib/poolparty/plugins directory
387
+ # for examples.
388
+ # Also note that there is no block associated. This is because we have written
389
+ # all that is necessary in a method called enable
390
+ # which is called when there is no block
391
+ def add_poolparty_base_requirements
392
+ # poolparty_base_heartbeat
393
+ ruby
394
+ pool_party_base_packages
395
+ end
396
+
234
397
  end
235
398
  end
236
399
  end
@@ -3,18 +3,19 @@
3
3
  This handles user interaction, loading the parameters, etc.
4
4
  =end
5
5
  require "open-uri"
6
- require "ftools"
6
+ require "fileutils"
7
7
  module PoolParty
8
8
  class Default
9
9
  include Dslify
10
10
 
11
11
  # def self.options
12
12
  default_options(
13
+ :verbose => false,
13
14
  :testing => false,
14
- :debugging => false,
15
15
  :minimum_instances => 2,
16
16
  :maximum_instances => 5,
17
17
  :user => "root", # This should change here
18
+ :keypair_name => nil,
18
19
  :base_keypair_path => "#{ENV["HOME"]}/.ec2",
19
20
  :base_ssh_path => "#{ENV["HOME"]}/.ssh",
20
21
  :tmp_path => "/tmp/poolparty",
@@ -29,6 +30,7 @@ module PoolParty
29
30
  :default_specfile_name => "clouds.rb",
30
31
  :properties_hash_filename => "clouds.json",
31
32
  :vendor_path => "#{::File.dirname(__FILE__)}/../../../vendor",
33
+ :poolparty_src_path => "#{::File.dirname(__FILE__)}/../../..",
32
34
  :port => "80",
33
35
  :forwarding_port => "8080",
34
36
  :monitor_port => 8081,
@@ -36,22 +38,22 @@ module PoolParty
36
38
  :butterfly_port => 8642,
37
39
  :minimum_runtime => 3000, #50.minutes in seconds
38
40
  :contract_when => "load < 0.25",
39
- :expand_when => "load > 0.9"
41
+ :expand_when => "load > 0.9",
42
+ :ec2_dir => ENV["EC2_HOME"], #TODO: move to ec2 class
43
+ :image_id => nil,
44
+ :access_key => nil,
45
+ :secret_access_key => nil,
46
+ :remoter_base => :ec2,
47
+ :availabilty_zone => 'us-east-1a'
40
48
  )
41
49
 
42
- def options
43
- default_options
44
- end
45
50
 
46
51
  # Class methods
47
52
  class << self
48
53
  def method_missing(m,*a,&block)
49
- default_options.include?(m) ? default_options[m] : super
50
- end
51
- def options
52
- default_options
54
+ dsl_options.include?(m) ? dsl_options[m] : super
53
55
  end
54
- # Get the access_key
56
+ # # Get the access_key
55
57
  def access_key
56
58
  @access_key ||= load_access_keys_from_environment_var || load_keys_from_file[:access_key]
57
59
  end
@@ -72,11 +74,14 @@ module PoolParty
72
74
  end
73
75
  # Store the keys in a yaml format to give the master access
74
76
  # So that the master has access to the files
75
- def store_keys_in_file
77
+ def store_keys_in_file(f=nil)
76
78
  unless access_key.nil? || secret_access_key.nil?
77
- write_to_file( key_file_locations.first, YAML::dump({:access_key => access_key, :secret_access_key => secret_access_key}))
79
+ write_to_file( (f ? f : key_file_locations.first), keys_in_yaml)
78
80
  end
79
81
  end
82
+ def keys_in_yaml
83
+ YAML::dump({:access_key => access_key, :secret_access_key => secret_access_key})
84
+ end
80
85
  def store_keys_in_file_for(obj=nil)
81
86
  if obj
82
87
  @access_key = obj.access_key
@@ -98,7 +103,9 @@ module PoolParty
98
103
  [
99
104
  ".ppkeys",
100
105
  "#{Default.base_config_directory}/.ppkeys",
101
- "#{Default.storage_directory}/ppkeys",
106
+ "#{Default.storage_directory}/ppkeys",
107
+ "#{ENV["HOME"]}/.ssh/ppkeys",
108
+ "#{ENV["HOME"]}/.ssh/.ppkeys",
102
109
  "~/.ppkeys",
103
110
  "ppkeys"
104
111
  ]
@@ -117,7 +124,7 @@ module PoolParty
117
124
  "/var/poolparty"
118
125
  ].select do |dir|
119
126
  dir if viable_directory?(dir)
120
- end.first || ::File.join( "/tmp/poolparty")
127
+ end.first || ::File.join( "/tmp/poolparty/#{name}")
121
128
  end
122
129
  def logger_location
123
130
  [
@@ -3,6 +3,8 @@
3
3
  =end
4
4
  module PoolParty
5
5
  class Key
6
+ include SearchablePaths
7
+ has_searchable_paths(:dirs => ["/", "keys"], :prepend_paths => ["#{ENV["HOME"]}/.ssh"])
6
8
 
7
9
  attr_accessor :filepath
8
10
 
@@ -24,10 +26,25 @@ module PoolParty
24
26
  # Returns the full_filepath of the key. If a full filepath is passed, we just return the expanded filepath
25
27
  # for the keypair, otherwise query where it is against known locations
26
28
  def full_filepath
27
- @full_filepath ||= ::File.file?(::File.expand_path(filepath)) ? ::File.expand_path(filepath) : search_in_known_locations
29
+ @full_filepath ||= ::File.file?(::File.expand_path(filepath)) ? ::File.expand_path(filepath) : search_in_known_locations(filepath)
28
30
  end
29
31
  alias :to_s :full_filepath
30
32
 
33
+ #TODO: gracefully handle the case when a passpharase is needed
34
+ # Generate a public key from the private key
35
+ def public_key
36
+ if !@public_key_string || @public_key_string.empty?
37
+ @public_key_string = `ssh-keygen -y -f #{full_filepath}`
38
+ raise 'Unable to generate public_key_string' if @public_key_string.empty?
39
+ else
40
+ @public_key_string
41
+ end
42
+ end
43
+
44
+ def public_key=(str)
45
+ @public_key_string = str
46
+ end
47
+
31
48
  # Basename of the keypair
32
49
  def basename
33
50
  @basename ||= ::File.basename(full_filepath, ::File.extname(full_filepath)) rescue filepath
@@ -38,39 +55,13 @@ module PoolParty
38
55
  @filename ||= ::File.basename(full_filepath) rescue filepath
39
56
  end
40
57
 
41
- # Search for the key in default locations with the entire filepath
42
- # if the file exists. If it doesn't exist in the default locations,
43
- # then it returns nil and assumes we it doesn't exist
44
- def search_in_known_locations
45
- self.class.keypair_paths.each do |path|
46
- full_path = ::File.join( ::File.expand_path(path), ::File.basename(filepath))
47
- return full_path if ::File.exists?(full_path)
48
- end
49
- # raise Exception.new("We cannot continue without a keypair. Please define a keypair in your clouds.rb")
50
- # TODO: Add raise for keypair
51
- nil
52
- end
53
-
54
- # Default locations to search for the key
55
- def self.keypair_paths
56
- [
57
- "#{ENV["HOME"]}/.ssh",
58
- "#{Default.poolparty_home_path}/keys",
59
- PoolParty::Default.base_keypair_path,
60
- PoolParty::Default.base_config_directory,
61
- PoolParty::Default.base_ssh_path,
62
- PoolParty::Default.remote_storage_path,
63
- Dir.pwd
64
- ]
65
- end
66
-
67
58
  # Support to add the enumerable each to keys
68
59
  def each
69
60
  yield full_filepath
70
61
  end
71
62
 
72
63
  # Turn the keypair into the a useful json string
73
- def to_json
64
+ def to_hash
74
65
  "{\"basename\":\"#{basename}\",\"full_filepath\": \"/etc/poolparty/#{filename}\"}"
75
66
  end
76
67
 
@@ -10,7 +10,7 @@ require "#{::File.dirname(__FILE__)}/../schema"
10
10
 
11
11
  module PoolParty
12
12
  class Neighborhoods
13
- include ::PoolParty::Pinger
13
+ include ::PoolParty::Pinger
14
14
  attr_reader :schema
15
15
 
16
16
  # Create a neighborhood from a string, array or hash given.
@@ -20,7 +20,7 @@ module PoolParty
20
20
  when Array
21
21
  {:instances => data.map {|entry| disect(entry) }}
22
22
  when String
23
- {:instances => JSON.parse(data)}#.map "#{inst["instance_id"]}\t#{inst["ip"]}"}}
23
+ JSON.parse(data)#.map "#{inst["instance_id"]}\t#{inst["ip"]}"}}
24
24
  when Hash
25
25
  data
26
26
  end
@@ -30,7 +30,7 @@ module PoolParty
30
30
 
31
31
  # Get the known instances from the neighborhood.json file on the server
32
32
  def instances
33
- @instances ||= @schema.to_hash[:instances] rescue @schema.instances.collect {|line| disect(line) }
33
+ @instances ||= @schema.to_hash[:instances] #rescue @schema.instances.collect {|line| disect(line) }
34
34
  end
35
35
 
36
36
  # Returns empty if the neighborhood has no instances
@@ -92,9 +92,20 @@ module PoolParty
92
92
  new( open("/etc/poolparty/neighborhood.json").read )
93
93
  elsif ping_port("127.0.0.1", Default.butterfly_port, 1)# butterfly responding?
94
94
  require "open-uri"
95
- new( open("http://127.0.0.1:8642/neighborhood").read )
95
+ begin
96
+ timeout(2) do
97
+ new( open("http://127.0.0.1:8642/neighborhood").read )
98
+ end
99
+ rescue TimeoutError => e
100
+ require "#{::File.dirname(__FILE__)}/../../poolparty"
101
+ cld = ::PoolParty::Cloud::Cloud.load_from_json(open("/etc/poolparty/clouds.json").read)
102
+ nodes = cld.nodes({:status => "running"}, false)
103
+ data = nodes.map {|hsh| hsh.reject {|k,v| v.nil? }}.map {|a| a.merge(:launching_time => a[:launching_time].to_s) }
104
+ # ::File.open("/etc/poolparty/neighborhood.json", "w") {|f| f << "{\"instances\":#{data.to_json}}" }
105
+ new(data)
106
+ end
96
107
  else
97
- new("[]")
108
+ new("{\"instances\":[]}")
98
109
  end
99
110
  end
100
111