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
@@ -0,0 +1,183 @@
1
+ require ::File.dirname(__FILE__)+"/monitor_rack.rb"
2
+
3
+ module Monitors
4
+
5
+ class Stats
6
+ attr_reader :stats, :request
7
+ attr_accessor :response
8
+
9
+ def initialize(env, o={})
10
+ @env = env
11
+ @request = Rack::Request.new env
12
+ @response = Rack::Response.new
13
+
14
+ begin
15
+ @cloud = JSON.parse( open('/etc/poolparty/clouds.json' ).read )
16
+ rescue
17
+ @cloud = ::PoolParty::Default.options.merge({"options" =>
18
+ {"rules" => {"expand" => PoolParty::Default.expand_when,
19
+ "contract" => PoolParty::Default.contract_when
20
+ }
21
+ }
22
+ })
23
+ end
24
+ # Our cloud.options.rules looks like
25
+ # {"expand_when" => "load > 0.9", "contract_when" => "load < 0.4"}
26
+ # We set these as rules on ourselves so we can use aska to parse the rules
27
+ # So later, we can call vote_rules on ourself and we'll get back Aska::Rule(s)
28
+ # which we'll call valid_rule? for each Rule and return the result
29
+ @cloud["options"]["rules"].each do |name, rul|
30
+ r = Aska::Rule.new(rul)
31
+ rule(name) << r
32
+ end
33
+ log << "#{Time.now.strftime("%Y-%m-%d-%H-%M")}, #{stats.to_json}\n"
34
+ end
35
+
36
+ def default
37
+ stats.to_json
38
+ end
39
+
40
+ def log(log_file_path="/var/log/poolparty/stats_monitor.log")
41
+ ::File.file? log_file_path
42
+ @logfile ||= ::File.new(log_file_path, 'a')
43
+ end
44
+
45
+ def default
46
+ begin
47
+ if !request.params || request.params.empty?
48
+ default_stats
49
+ else
50
+ stats[request.params[0].to_sym] ||= self.send(request.params[0])
51
+ stats[request.params[0].to_sym]
52
+ stats.to_json
53
+ end
54
+ rescue Exception => e
55
+ response.fail!
56
+ "Error: #{e}"
57
+ end
58
+ end
59
+ alias :get :default
60
+
61
+ def put
62
+ if d = JSON.parse(request.params)
63
+ hsh = d.reject {|ip, _node| ip == my_ip }
64
+ stats.merge!(hsh)
65
+ handle_election
66
+ else
67
+ "boom"
68
+ end
69
+ end
70
+ alias :update :put
71
+
72
+ # Handle the elections
73
+ def handle_election
74
+ # Ballots look like:
75
+ # host => ["contract"]
76
+ candidates = {:expand => 0, :contract => 0}
77
+ candidates.each do |action, ballots|
78
+ stats.each do |ip, node_hsh|
79
+ candidates[action]+=1 if node_hsh["nominations"] && node_hsh["nominations"].include?(action.to_s)
80
+ end
81
+ end
82
+ # TODO: Move?
83
+ # Expand the cloud if 50+% of the votes are for expansion
84
+ # Contract the cloud if 51+% of the votes are for contraction
85
+ if (candidates[:expand] - candidates[:contract])/stats.keys.size > 0.5
86
+ %x[/usr/bin/server-cloud-elections expand] unless elected_action == "expand"
87
+ @elected_action = "expand"
88
+ elsif (candidates[:contract] - candidates[:expand])/stats.keys.size > 0.5
89
+ %x[/usr/bin/server-cloud-elections contract] unless elected_action == "contract"
90
+ @elected_action = "contract"
91
+ end
92
+
93
+ reload_data!
94
+ stats[my_ip]["elected_action"] = @elected_action if @elected_action
95
+ log << "#{Time.now.strftime("%Y-%m-%d-%H-%M")}, #{stats.to_json}\n"
96
+ stats.to_json
97
+ end
98
+
99
+
100
+ def elected_action
101
+ @elected_action ||= nil
102
+ end
103
+
104
+ def rules
105
+ @rules ||= {}
106
+ end
107
+
108
+ def rule(name)
109
+ rules[name] ||= []
110
+ end
111
+
112
+ def default_stats
113
+ %w(load nominations).each do |var|
114
+ stats[my_ip][var] ||= self.send(var.to_sym)
115
+ end
116
+ stats
117
+ end
118
+
119
+ def stats
120
+ @stats ||= {my_ip => {}}
121
+ end
122
+
123
+ def load
124
+ %x{"uptime"}.split[-3].to_f
125
+ end
126
+
127
+ def instances
128
+ # res = PoolParty::Neighborhoods.load_default.instances
129
+ res ||= %x[/usr/bin/server-list-active internal_ip].split("\t")
130
+ res
131
+ end
132
+
133
+ def can_expand?
134
+ instances.size < max_instances
135
+ end
136
+
137
+ def can_contract?
138
+ instances.size > min_instances
139
+ end
140
+
141
+ def min_instances
142
+ (@cloud["options"]["minimum_instances"] || PoolParty::Default.minimum_instances).to_i
143
+ end
144
+
145
+ def max_instances
146
+ (@cloud["options"]["maximum_instances"] || PoolParty::Default.maximum_instances).to_i
147
+ end
148
+
149
+ def nominations
150
+ load = stats[my_ip]["load"] ||= self.send(:load)
151
+ stats[my_ip]["nominations"] ||= rules.collect do |k,cld_rules|
152
+ t = cld_rules.collect do |r|
153
+ # If the comparison works
154
+ if self.send(r.key.to_sym).to_f.send(r.comparison, r.var.to_f)
155
+ # if we are facing an expansion rule
156
+ if k =~ /expand/
157
+ k if can_expand?
158
+ # if we are facing a contraction rule
159
+ elsif k =~ /contract/
160
+ k if can_contract?
161
+ else
162
+ k
163
+ end
164
+ end
165
+ end.compact
166
+ end.flatten.compact
167
+ end
168
+
169
+ def my_ip
170
+ @my_ip ||= ohai["ipaddress"]
171
+ end
172
+
173
+ def ohai
174
+ @ohai ||= JSON.parse(%x[ohai])
175
+ end
176
+
177
+ def reload_data!
178
+ @stats[my_ip] = {}
179
+ instances.each {|inst| @stats[inst] = {} }
180
+ end
181
+
182
+ end
183
+ end
@@ -0,0 +1,6 @@
1
+ require "rubygems"
2
+ require "json"
3
+ require ::File.join(::File.dirname(__FILE__), 'monitors/', 'monitor_rack.rb')
4
+
5
+ module PoolParty
6
+ end
@@ -0,0 +1,11 @@
1
+ # Load the core net libraries. These are neccessary for any of the remoter_bases to function.
2
+ %w(remote_instance messenger remote_bases remoter_base).each do |file|
3
+ require File.join(::File.dirname(__FILE__),file+'.rb')
4
+ end
5
+
6
+ # Register available remoter_bases
7
+ Dir["#{::File.dirname(__FILE__)}/remoter_bases/*/*.rb"].each do |base|
8
+ name = File.join(::File.basename(base, ::File.extname(base)))
9
+ require base
10
+ register_remote_base name
11
+ end
@@ -9,7 +9,7 @@ module PoolParty
9
9
  def with_socket(testing=false, &block)
10
10
  host = testing ? "localhost" : (master.ip)
11
11
  vputs "Pinging #{host} with the messenger"
12
- socket = TCPSocket.open(host, Base.messenger_client_port)
12
+ socket = TCPSocket.open(host, Default.messenger_client_port)
13
13
  out = yield(socket)
14
14
  socket.close
15
15
  out
@@ -52,21 +52,4 @@ module PoolParty
52
52
  end
53
53
 
54
54
  end
55
- end
56
-
57
- module PoolParty
58
- module Cloud
59
- class Cloud
60
- include PoolParty::Messenger
61
-
62
- def get_current_nodes
63
- nodes = messenger_send!("get_current_nodes")
64
- nodes.split(" ").map {|a| a.split(/@/)[-1] }
65
- end
66
-
67
- def reconfigure_cloud!(msg="force_reconfig")
68
- messenger_cast!(msg)
69
- end
70
- end
71
- end
72
55
  end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + "/remoter_base"
2
+
3
+ class Object
4
+ def remote_bases
5
+ $remote_bases ||= []
6
+ end
7
+ # Register the remoter base in the remote_bases global store
8
+ def register_remote_base(*args)
9
+ args.each do |arg|
10
+ base_name = "#{arg}".downcase.to_sym
11
+ (remote_bases << base_name) unless remote_bases.include?(base_name)
12
+ end
13
+ end
14
+ alias :available_bases :remote_bases
15
+ end
16
+
17
+ Dir["#{File.dirname(__FILE__)}/remote_bases/*.rb"].each do |base|
18
+ name = ::File.basename(base, ::File.extname(base))
19
+ require base
20
+ register_remote_base name
21
+ end
@@ -1,19 +1,14 @@
1
- require File.dirname(__FILE__) + "/remoter"
2
-
3
1
  module PoolParty
4
2
  module Remote
5
3
 
6
4
  class RemoteInstance
7
- include Remote
8
- include Configurable
9
- include CloudResourcer
5
+ include Dslify
10
6
 
11
- def initialize(opts, parent=self)
12
- run_setup(parent)
7
+ def initialize(opts={}, containing_cloud=nil)
8
+ @parent = containing_cloud
13
9
 
14
- set_vars_from_options(parent.options) if parent && parent.respond_to?(:options)
15
- set_vars_from_options(opts) unless opts.nil? || opts.empty?
16
-
10
+ set_vars_from_options(containing_cloud.options) if containing_cloud && containing_cloud.respond_to?(:options)
11
+ set_vars_from_options(opts) if opts.is_a?(Hash)
17
12
  on_init
18
13
  end
19
14
 
@@ -26,50 +21,69 @@ module PoolParty
26
21
  end
27
22
 
28
23
  # Is this remote instance the master?
24
+ # DEPRECATE
29
25
  def master?
30
26
  name == "master"
31
27
  end
32
28
 
33
29
  # The remote instances is only valid if there is an ip and a name
34
30
  def valid?
35
- !(ip.nil? || name.nil?)
31
+ (ip.nil? || name.nil?) ? false : true
36
32
  end
37
33
 
38
34
  # Determine if the RemoteInstance is responding
39
35
  def responding?
40
- !responding.nil?
36
+ running?
37
+ # !responding.nil? #TODO MF this needs to actually ping the node or something similar. stubbed to running? for now
41
38
  end
42
39
 
43
40
  # This is how we get the current load of the instance
44
41
  # The approach of this may change entirely, but the usage of
45
42
  # it will always be the same
46
43
  def load
47
- current_load ||= 0.0
44
+ current_load ||= 0.0 #NOTE MF: returning 0.0 seems like a bad idea here. should return nil if we dont have a real value
48
45
  end
49
-
46
+
47
+ # Note, the next 4 methods will be overridden by the cloud specific remoter_base
50
48
  # Is this instance running?
51
49
  def running?
52
- !(status =~ /running/).nil?
50
+ true
53
51
  end
54
52
  # Is this instance pending?
55
53
  def pending?
56
- !(status =~ /pending/).nil?
54
+ false
57
55
  end
58
56
  # Is this instance terminating?
59
57
  def terminating?
60
- !(status =~ /shutting/).nil?
58
+ false
61
59
  end
62
60
  # Has this instance been terminated?
63
61
  def terminated?
64
- !(status =~ /terminated/).nil?
62
+ false
65
63
  end
66
64
 
67
65
  # Printing. This is how we extract the instances into the listing on the
68
66
  # local side into the local listing file
69
67
  def to_s
70
- "#{name}\t#{ip}\t#{instance_id}"
68
+ "#{name}\t#{ip}\t#{instance_id rescue ""}"
69
+ end
70
+
71
+ # Class method to disect a neighborhood line
72
+ def self.hash_from_s(s)
73
+ arr = s.split("\t")
74
+ {:name => arr[0], :ip => arr[1]}
75
+ end
76
+
77
+ def self.to_s(hsh)
78
+ new(hsh).to_s
79
+ end
80
+
81
+ #TODO: Diet the next 5 commands
82
+ def dependency_resolver_command
83
+ cloud.dependency_resolver_command
71
84
  end
72
85
 
86
+ #FIXME: deprecate puppet specific commands in this class
73
87
  def puppet_runner_command
74
88
  self.class.send :puppet_runner_command
75
89
  end
@@ -83,13 +97,8 @@ module PoolParty
83
97
  def self.puppet_rerun_commad
84
98
  puppet_runner_command
85
99
  end
86
- def my_cloud
87
- @pa = parent
88
- while !(@pa.is_a?(PoolParty::Cloud::Cloud) || @pa.nil? || @pa == self)
89
- @pa = @pa.parent
90
- end
91
- @pa
92
- end
100
+ #
101
+
93
102
  def hosts_file_listing_for(cl)
94
103
  string = (cl.name == cloud.name) ? "#{name}.#{my_cloud.name}\t#{name}" : "#{name}.#{my_cloud.name}"
95
104
  "#{internal_ip}\t#{string}"
@@ -97,4 +106,4 @@ module PoolParty
97
106
  end
98
107
 
99
108
  end
100
- end
109
+ end
@@ -0,0 +1,251 @@
1
+ require "ping"
2
+
3
+ module PoolParty
4
+ module Remote
5
+
6
+ # TODO: Rename and modularize the @inst.status =~ /pending/ so that it works on all
7
+ # remoter_bases
8
+ def launch_instance!(o={}, &block)
9
+ @inst = launch_new_instance!( o )
10
+ wait "2.seconds"
11
+ 500.times do |i|
12
+ if @inst.status =~ /pending/
13
+ sleep(2)
14
+ @inst = describe_instance(@inst)
15
+ end
16
+ end
17
+ when_instance_is_responding @inst do
18
+ block.call(@inst) if block
19
+ after_launch_instance(@inst)
20
+ end
21
+ @inst
22
+ end
23
+
24
+ # Called after an instance is launched
25
+ def after_launch_instance(instance=nil)
26
+ end
27
+
28
+ def when_instance_is_responding(inst, &block)
29
+ if ping_port(inst.ip, 22)
30
+ block.call if block
31
+ else
32
+ raise "Instance not responding at #{inst.ip}"
33
+ end
34
+ end
35
+
36
+ # A convenience method for waiting until there are no more
37
+ # pending instances and then running the block
38
+ def when_no_pending_instances(&block)
39
+ reset!
40
+ if list_of_pending_instances && list_of_pending_instances.size == 0
41
+ vputs "" # Clear the terminal with a newline
42
+ block.call if block
43
+ else
44
+ vprint "."
45
+ wait "5.seconds"
46
+ when_no_pending_instances(&block)
47
+ end
48
+ end
49
+
50
+ # Stub method for the time being to handle expansion of the cloud
51
+ def can_expand_cloud?(force=false)
52
+ (are_too_few_instances_running? || are_expansion_rules_valid? ) || force || false
53
+ end
54
+ def are_expansion_rules_valid?
55
+ valid_rules?(:expand_when)
56
+ end
57
+ # Stub method for the time being to handle the contraction of the cloud
58
+ def can_contract_cloud?(force=false)
59
+ return true if force
60
+ ((are_any_nodes_exceeding_minimum_runtime? and are_too_many_instances_running?) || are_contraction_rules_valid?) || false
61
+ end
62
+ def are_contraction_rules_valid?
63
+ valid_rules?(:contract_when)
64
+ end
65
+ # Expand the cloud
66
+ # If we can start a new instance and the load requires us to expand
67
+ # the cloud, then we should request_launch_new_instances
68
+ # Wait for the instance to boot up and when it does come back
69
+ # online, then provision it as a slave, this way, it is ready for action from the
70
+ # get go
71
+ def expand_cloud_if_necessary(force=false)
72
+ if can_start_a_new_instance? && can_expand_cloud?(force)
73
+ vputs "Expanding the cloud based on load"
74
+ @num = 1
75
+ @num.times do |i|
76
+ list_of_pending_instances.size == 0 ? request_launch_one_instance_at_a_time : wait("5.seconds")
77
+ reset!
78
+ vputs "request_launch_new_instances: #{@num}"
79
+ provision_slaves_from_n(@num)
80
+ after_launched
81
+ end
82
+ end
83
+ end
84
+ # Contract the cloud
85
+ # If we can shutdown an instnace and the load allows us to contract
86
+ # the cloud, then we should request_termination_of_non_master_instance
87
+ def contract_cloud_if_necessary(force=false)
88
+ if can_shutdown_an_instance? && can_contract_cloud?(force)
89
+ vputs "Shrinking the cloud by 1"
90
+ before_shutdown
91
+ request_termination_of_non_master_instance
92
+ end
93
+ end
94
+
95
+ # List calculation methods
96
+ #
97
+ # Are the minimum number of instances running?
98
+ def minimum_number_of_instances_are_running?
99
+ list_of_running_instances.size >= minimum_instances.to_i
100
+ end
101
+ # Are the minimum number of instances NOT running?
102
+ def minimum_number_of_instances_are_not_running?
103
+ !(minimum_number_of_instances_are_running?)
104
+ end
105
+ # Can we shutdown an instance?
106
+ def can_shutdown_an_instance?
107
+ list_of_running_instances.size > minimum_instances.to_i
108
+ end
109
+ # Are too few instances running?
110
+ def are_too_few_instances_running?
111
+ list_of_running_instances.size < minimum_instances.to_i
112
+ end
113
+ # Are there more instances than allowed?
114
+ def are_too_many_instances_running?
115
+ list_of_running_instances.size > maximum_instances.to_i
116
+ end
117
+
118
+ ########
119
+ # TODO: deprecate methods below here (only if they are deprecate-able)
120
+ ########
121
+
122
+ # Request to launch a number of instances
123
+ def request_launch_new_instances(num=1)
124
+ out = []
125
+ num.times {out << launch_new_instance!(options) }
126
+ out
127
+ end
128
+ def request_launch_master_instance
129
+ @inst = launch_new_instance!
130
+ wait "5.seconds"
131
+ when_no_pending_instances do
132
+ vputs "Master has launched"
133
+ reset!
134
+ after_launch_master(@inst)
135
+ end
136
+ end
137
+
138
+
139
+ def after_launch_master(inst=nil)
140
+ vputs "After launch master in remoter"
141
+ end
142
+ # Let's terminate an instance that is not the master instance
143
+ def request_termination_of_non_master_instance
144
+ inst = nonmaster_nonterminated_instances.last
145
+ terminate_instance!(inst.instance_id) if inst
146
+ end
147
+ # Can we start a new instance?
148
+ def can_start_a_new_instance?
149
+ maximum_number_of_instances_are_not_running? && list_of_pending_instances.size == 0
150
+ end
151
+ # Are the maximum number of instances not running?
152
+ def maximum_number_of_instances_are_not_running?
153
+ list_of_running_instances.size < maximum_instances.to_i
154
+ end
155
+ # Are the maximum number of instances running?
156
+ def maximum_number_of_instances_are_running?
157
+ list_of_running_instances.size >= maximum_instances.to_i
158
+ end
159
+ # Launch new instance while waiting for the number of pending instances
160
+ # to be zero before actually launching. This ensures that we only
161
+ # launch one instance at a time
162
+ def request_launch_one_instance_at_a_time
163
+ when_no_pending_instances { launch_new_instance! }
164
+ end
165
+
166
+ # A convenience method for waiting until all the instances have an ip
167
+ # assigned to them. This is useful when shifting the ip addresses
168
+ # around on the instances
169
+ def when_all_assigned_ips(&block)
170
+ reset!
171
+ if list_of_nonterminated_instances.select {|a| a.ip == 'not.assigned' }.empty?
172
+ block.call if block
173
+ else
174
+ vprint "."
175
+ wait "5.seconds"
176
+ when_all_assigned_ips(&block)
177
+ end
178
+ end
179
+ def running_instance_ips
180
+ remote_instances_list.select {|inst|
181
+ inst.running? and inst.ip!='not.assigned'
182
+ }.collect{|n| n.ip}
183
+ end
184
+
185
+ # This will launch the minimum_instances if the minimum number of instances are not running
186
+ # If the minimum number of instances are not running and if we can start a new instance
187
+ def launch_minimum_number_of_instances
188
+ if can_start_a_new_instance? && !minimum_number_of_instances_are_running?
189
+ list_of_pending_instances.size == 0 ? request_launch_one_instance_at_a_time : wait("5.seconds")
190
+ reset!
191
+ launch_minimum_number_of_instances
192
+ provision_slaves_from_n(minimum_instances.to_i)
193
+ after_launched
194
+ end
195
+ end
196
+
197
+ def provision_slaves_from_n(num=1)
198
+ vputs "In provision_slaves_from_n: #{num}"
199
+ reset!
200
+ when_no_pending_instances do
201
+ vputs "Waiting for 10 seconds"
202
+ wait "10.seconds" # Give some time for ssh to startup
203
+ @num_instances = list_of_running_instances.size
204
+ vputs "(@num_instances - (num))..(@num_instances): #{(@num_instances - (num))..(@num_instances)}"
205
+ last_instances = nonmaster_nonterminated_instances[(@num_instances - (num))..(@num_instances)]
206
+ last_instances.each do |inst|
207
+ vputs "Provision slave: #{inst}"
208
+ verbose ? provisioner_for(inst).install(testing) : hide_output { provisioner_for(inst).install(testing)}
209
+ end
210
+ # PoolParty::Provisioner.reconfigure_master(self)
211
+ end
212
+ end
213
+ # Launch the master and let the master handle the starting of the cloud
214
+ # We should only launch an instance if there are no pending instances, in the case
215
+ # that the master has launched, but is still pending
216
+ # and if the master is not running AND we can start a new instance
217
+ # Then wait for the master to launch
218
+ def launch_and_configure_master!(testing=false)
219
+ vputs "Requesting to launch new instance"
220
+ dputs "Launching master"
221
+ request_launch_master_instance if list_of_pending_instances.size.zero? && can_start_a_new_instance? && !is_master_running? && !testing
222
+ reset!
223
+ unless testing
224
+ vputs ""
225
+ vputs "Waiting for there to be no pending instances..."
226
+ when_no_pending_instances do
227
+ when_all_assigned_ips {wait "20.seconds"}
228
+ vputs ""
229
+ vputs "Provisioning master..."
230
+ # cleanup_storage_directory
231
+ @provisioner = PoolParty::Provisioner::Capistrano.new(master, self, :ubuntu)
232
+ verbose ? @provisioner.install(testing) : hide_output { @provisioner.install(testing) }
233
+
234
+ after_launched
235
+ end
236
+ end
237
+ end
238
+ def list_of_nodes_exceeding_minimum_runtime
239
+ list_of_running_instances.reject{|i| i.elapsed_runtime < minimum_runtime}
240
+ end
241
+
242
+ def are_any_nodes_exceeding_minimum_runtime?
243
+ !list_of_nodes_exceeding_minimum_runtime.blank?
244
+ end
245
+ # Is there a node that is running with the name master
246
+ def is_master_running?
247
+ !list_of_running_instances.select {|a| a.name == "master"}.first.nil?
248
+ end
249
+
250
+ end
251
+ end