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.
- data/History.txt +3 -0
- data/README.txt +13 -9
- data/Rakefile +0 -1
- data/VERSION.yml +2 -2
- data/bin/cloud +43 -46
- data/bin/cloud-bootstrap +33 -23
- data/bin/cloud-configure +33 -34
- data/bin/cloud-console +31 -9
- data/bin/cloud-contract +27 -11
- data/bin/cloud-expand +32 -19
- data/bin/cloud-list +43 -15
- data/bin/cloud-osxcopy +22 -12
- data/bin/cloud-provision +39 -24
- data/bin/cloud-run +37 -0
- data/bin/cloud-setup-dev +31 -20
- data/bin/cloud-show +40 -21
- data/bin/cloud-ssh +24 -15
- data/bin/cloud-start +33 -19
- data/bin/cloud-terminate +34 -15
- data/bin/cloud-verify +41 -0
- data/bin/install-poolparty +22 -0
- data/bin/server-cloud-elections +17 -23
- data/bin/server-list-active +23 -22
- data/bin/server-manage-election +14 -23
- data/bin/server-show-stats +1 -1
- data/config/jeweler.rb +6 -6
- data/examples/basic.rb +13 -14
- data/examples/fairchild.rb +25 -20
- data/examples/maize.rb +37 -0
- data/examples/metavirt_cloud.rb +33 -0
- data/examples/simple.rb +13 -0
- data/examples/vmrun_cloud.rb +17 -0
- data/lib/poolparty/{aska/aska.rb → aska.rb} +3 -0
- data/lib/poolparty/core/array.rb +13 -1
- data/lib/poolparty/core/exception.rb +1 -1
- data/lib/poolparty/core/hash.rb +63 -2
- data/lib/poolparty/core/integer.rb +11 -0
- data/lib/poolparty/core/object.rb +41 -19
- data/lib/poolparty/core/proc.rb +0 -7
- data/lib/poolparty/core/string.rb +35 -2
- data/lib/poolparty/core/symbol.rb +10 -0
- data/lib/poolparty/core/time.rb +6 -0
- data/lib/poolparty/dependency_resolver/chef_resolver.rb +40 -41
- data/lib/poolparty/dependency_resolver/dependency_resolver.rb +1 -1
- data/lib/poolparty/dependency_resolver/dependency_resolver_cloud_extensions.rb +6 -6
- data/lib/poolparty/dependency_resolver/puppet.rb +0 -1
- data/lib/poolparty/dependency_resolver/puppet_resolver.rb +14 -48
- data/lib/poolparty/exceptions/MasterException.rb +2 -2
- data/lib/poolparty/extra/duration.rb +96 -0
- data/lib/poolparty/helpers/binary.rb +1 -1
- data/lib/poolparty/helpers/console.rb +0 -5
- data/lib/poolparty/helpers/optioner.rb +18 -13
- data/lib/poolparty/installers/base_installer.rb +113 -0
- data/lib/poolparty/installers/ec2.rb +141 -0
- data/lib/poolparty/installers/vmrun.rb +144 -0
- data/lib/poolparty/lite.rb +5 -2
- data/lib/poolparty/modules/callbacks.rb +15 -2
- data/lib/poolparty/modules/cloud_dsl.rb +10 -8
- data/lib/poolparty/modules/cloud_resourcer.rb +39 -59
- data/lib/poolparty/modules/daemonizable.rb +4 -5
- data/lib/poolparty/modules/definable_resource.rb +6 -7
- data/lib/poolparty/modules/file_writer.rb +2 -2
- data/lib/poolparty/modules/output.rb +2 -2
- data/lib/poolparty/modules/pinger.rb +9 -2
- data/lib/poolparty/modules/pretty_printer.rb +1 -1
- data/lib/poolparty/modules/resourcing_dsl.rb +1 -29
- data/lib/poolparty/modules/searchable_paths.rb +100 -0
- data/lib/poolparty/modules/user_helpers.rb +1 -1
- data/lib/poolparty/monitors/base_monitor.rb +65 -0
- data/lib/poolparty/monitors/monitor_daemon.rb +168 -0
- data/lib/poolparty/monitors/monitor_rack.rb +29 -15
- data/lib/poolparty/monitors/monitors/{time_monitor.rb → clock_monitor.rb} +7 -2
- data/lib/poolparty/monitors/monitors/cloud_monitor.rb +36 -0
- data/lib/poolparty/monitors/monitors/elections_monitor.rb +76 -0
- data/lib/poolparty/monitors/monitors/neighborhood_monitor.rb +15 -12
- data/lib/poolparty/monitors/monitors/stats_monitor.rb +68 -49
- data/lib/poolparty/net/init.rb +12 -7
- data/lib/poolparty/net/remote_instance.rb +48 -64
- data/lib/poolparty/net/remoter/cloud_control.rb +0 -177
- data/lib/poolparty/net/remoter/connections.rb +19 -14
- data/lib/poolparty/net/remoter/interactive.rb +30 -24
- data/lib/poolparty/net/remoter_base.rb +140 -48
- data/lib/poolparty/net/remoter_bases/ec2/ec2.rb +119 -71
- data/lib/poolparty/net/remoter_bases/ec2/ec2_remote_instance.rb +42 -31
- data/lib/poolparty/net/remoter_bases/ec2/ec2_response_object.rb +75 -10
- data/lib/poolparty/net/remoter_bases/libvirt/libvirt.rb +73 -0
- data/lib/poolparty/net/remoter_bases/libvirt/libvirt_instance.rb +64 -0
- data/lib/poolparty/net/remoter_bases/metavirt/metavirt.rb +110 -0
- data/lib/poolparty/net/remoter_bases/metavirt/metavirt_instance.rb +37 -0
- data/lib/poolparty/net/remoter_bases/vmrun/utilities/vm_disk.rb +1 -1
- data/lib/poolparty/net/remoter_bases/vmrun/utilities/vmx.rb +1 -1
- data/lib/poolparty/net/remoter_bases/vmrun/utilities/vmx_file.rb +117 -117
- data/lib/poolparty/net/remoter_bases/vmrun/vmrun.rb +59 -43
- data/lib/poolparty/net/remoter_bases/vmrun/vmrun_instance.rb +37 -21
- data/lib/poolparty/plugins/apache2/apache.rb +266 -0
- data/lib/poolparty/plugins/apache2/passenger_site.rb +86 -0
- data/lib/poolparty/plugins/apache2/php5.rb +40 -0
- data/lib/poolparty/plugins/apache2/virtual_host.rb +53 -0
- data/lib/poolparty/plugins/authorized_key.rb +29 -0
- data/lib/poolparty/plugins/bind.rb +5 -6
- data/lib/poolparty/plugins/{chef.rb → chef/chef.rb} +32 -44
- data/lib/poolparty/plugins/chef/chef_deploy.rb +55 -0
- data/lib/poolparty/plugins/chef/chef_deploy_definition.rb +32 -0
- data/lib/poolparty/plugins/chef/chef_library.rb +7 -0
- data/lib/poolparty/plugins/chef/chef_recipe.rb +7 -0
- data/lib/poolparty/plugins/chef/include_chef_recipe.rb +14 -0
- data/lib/poolparty/plugins/deploy_directory.rb +41 -26
- data/lib/poolparty/plugins/gem_package.rb +42 -14
- data/lib/poolparty/plugins/git.rb +62 -33
- data/lib/poolparty/{base_packages → plugins}/haproxy.rb +21 -20
- data/lib/poolparty/plugins/heartbeat.rb +16 -0
- data/lib/poolparty/plugins/host.rb +39 -0
- data/lib/poolparty/plugins/line_in_file.rb +24 -2
- data/lib/poolparty/plugins/plugin_template.rb +13 -0
- data/lib/poolparty/{base_packages/poolparty.rb → plugins/poolparty_base_packages.rb} +4 -6
- data/lib/poolparty/plugins/rails_deploy.rb +128 -0
- data/lib/poolparty/{base_packages → plugins}/ruby.rb +3 -3
- data/lib/poolparty/plugins/runit.rb +17 -92
- data/lib/poolparty/plugins/sshkey.rb +50 -0
- data/lib/poolparty/plugins/svn.rb +10 -8
- data/lib/poolparty/poolparty/cloud.rb +224 -61
- data/lib/poolparty/poolparty/default.rb +22 -15
- data/lib/poolparty/poolparty/key.rb +19 -28
- data/lib/poolparty/poolparty/neighborhoods.rb +16 -5
- data/lib/poolparty/poolparty/plugin.rb +49 -13
- data/lib/poolparty/poolparty/pool.rb +32 -9
- data/lib/poolparty/poolparty/poolparty_base_class.rb +65 -45
- data/lib/poolparty/poolparty/resource.rb +24 -49
- data/lib/poolparty/poolparty/service.rb +11 -9
- data/lib/poolparty/provision/boot_strapper.rb +48 -37
- data/lib/poolparty/provision/configurations/chef.rb +6 -5
- data/lib/poolparty/provision/dr_configure.rb +25 -19
- data/lib/poolparty/resources/cron.rb +37 -4
- data/lib/poolparty/resources/directory.rb +30 -0
- data/lib/poolparty/resources/exec.rb +31 -1
- data/lib/poolparty/resources/file.rb +54 -12
- data/lib/poolparty/resources/group.rb +21 -0
- data/lib/poolparty/resources/mount.rb +24 -4
- data/lib/poolparty/resources/package.rb +30 -6
- data/lib/poolparty/resources/remote_file.rb +33 -1
- data/lib/poolparty/resources/service.rb +22 -1
- data/lib/poolparty/resources/symlink.rb +37 -2
- data/lib/poolparty/resources/user.rb +25 -0
- data/lib/poolparty/resources/variable.rb +26 -1
- data/lib/poolparty/resources.rb +42 -0
- data/lib/poolparty/schema.rb +6 -8
- data/lib/poolparty/templates/apache2/apache2.conf +14 -0
- data/lib/poolparty/templates/apache2/base.conf.erb +168 -0
- data/lib/poolparty/templates/apache2/browser_fixes.conf.erb +26 -0
- data/lib/poolparty/templates/apache2/debian.conf.erb +675 -0
- data/lib/poolparty/templates/apache2/default-site.conf.erb +41 -0
- data/lib/poolparty/templates/apache2/directory_indexes.conf.erb +101 -0
- data/lib/poolparty/templates/apache2/logging-syslog.conf.erb +42 -0
- data/lib/poolparty/templates/apache2/mime-extras.conf.erb +211 -0
- data/lib/poolparty/templates/apache2/mime-minimal.conf.erb +15 -0
- data/lib/poolparty/templates/apache2/mpm-worker.conf.erb +20 -0
- data/lib/poolparty/templates/apache2/mpm-worker.erb +20 -0
- data/lib/poolparty/templates/apache2/passenger.conf.erb +20 -0
- data/lib/poolparty/templates/apache2/php.ini.erb +1253 -0
- data/lib/poolparty/templates/apache2/server-status.erb +19 -0
- data/lib/poolparty/templates/{gemrc → gemrc_template} +0 -0
- data/lib/poolparty/templates/haproxy.conf +2 -2
- data/lib/poolparty/templates/monitor.ru +13 -0
- data/lib/poolparty/templates/php.ini.erb +1253 -0
- data/lib/poolparty/verification/verifier_base.rb +10 -0
- data/lib/poolparty/verification/verifiers/http_match.rb +43 -0
- data/lib/poolparty/verification/verifiers/http_status.rb +59 -0
- data/lib/poolparty/verification/verifiers/ping.rb +18 -1
- data/lib/poolparty/verification/verify.rb +6 -0
- data/lib/poolparty.rb +14 -15
- data/lib/poolpartycl.rb +1 -1
- data/spec/bin/bin_spec_helper.rb +1 -0
- data/spec/bin/fixtures/bin_cloud_for_test.rb +0 -6
- data/spec/bin/server-list-active_spec.rb +4 -6
- data/spec/poolparty/core/object_spec.rb +1 -62
- data/spec/poolparty/core/ordered_hash_spec.rb +7 -7
- data/spec/poolparty/core/string_spec.rb +1 -1
- data/spec/poolparty/dependency_resolver/chef_resolver_spec.rb +0 -8
- data/spec/poolparty/dependency_resolver/dependency_resolver_cloud_extensions_spec.rb +35 -32
- data/spec/poolparty/extra/deployments_spec.rb +68 -68
- data/spec/poolparty/fixtures/clouds.json +1 -1
- data/spec/poolparty/fixtures/fake_key.pub +1 -0
- data/spec/poolparty/helpers/optioner_spec.rb +4 -11
- data/spec/poolparty/modules/cloud_resourcer_spec.rb +1 -1
- data/spec/poolparty/modules/searchable_paths_spec.rb +83 -0
- data/spec/poolparty/net/remote_instance_spec.rb +1 -2
- data/spec/poolparty/net/remoter_base_spec.rb +7 -11
- data/spec/poolparty/net/remoter_bases/ec2_mocks_and_stubs.rb +9 -11
- data/spec/poolparty/net/remoter_bases/ec2_remote_instance_spec.rb +6 -56
- data/spec/poolparty/net/remoter_bases/ec2_spec.rb +10 -7
- data/spec/poolparty/net/remoter_spec.rb +2 -3
- data/spec/poolparty/plugins/authorized_key_spec.rb +23 -0
- data/spec/poolparty/plugins/deploydirectory_spec.rb +64 -51
- data/spec/poolparty/plugins/git_spec.rb +8 -10
- data/spec/poolparty/poolparty/cloud_spec.rb +61 -64
- data/spec/poolparty/poolparty/configurers/files/ruby_basic.rb +2 -4
- data/spec/poolparty/poolparty/configurers/files/ruby_plugins.rb +1 -1
- data/spec/poolparty/poolparty/configurers/ruby_spec.rb +1 -6
- data/spec/poolparty/poolparty/default_spec.rb +23 -22
- data/spec/poolparty/poolparty/example_spec.rb +47 -26
- data/spec/poolparty/{base_packages → poolparty}/haproxy_spec.rb +1 -1
- data/spec/poolparty/{base_packages → poolparty}/heartbeat_spec.rb +1 -1
- data/spec/poolparty/poolparty/key_spec.rb +2 -2
- data/spec/poolparty/poolparty/neighborhoods_spec.rb +1 -1
- data/spec/poolparty/poolparty/plugin_model_spec.rb +13 -17
- data/spec/poolparty/poolparty/plugin_spec.rb +7 -7
- data/spec/poolparty/poolparty/pool_spec.rb +4 -10
- data/spec/poolparty/poolparty/resource_spec.rb +25 -29
- data/spec/poolparty/poolparty/script_spec.rb +1 -4
- data/spec/poolparty/poolparty/test_plugins/webserver.rb +27 -25
- data/spec/poolparty/resources/file_spec.rb +5 -4
- data/spec/poolparty/resources/sshkey_spec.rb +39 -40
- data/spec/poolparty/spec_helper.rb +9 -39
- data/tasks/poolparty.rake +29 -1
- data/tasks/spec.rake +39 -1
- data/test/fixtures/fake_clouds.rb +11 -0
- data/test/fixtures/metavirt_cloud.json +1 -0
- data/test/fixtures/test_key +1 -0
- data/test/poolparty/core/array_test.rb +11 -0
- data/test/poolparty/core/hash_test.rb +5 -7
- data/test/poolparty/core/object_test.rb +29 -0
- data/test/poolparty/dependency_resolver/chef_resolver_test.rb +82 -0
- data/test/poolparty/dependency_resolver/puppet_resolver_test.rb +5 -26
- data/test/poolparty/modules/callbacks_test.rb +1 -1
- data/test/poolparty/modules/cloud_dsl_test.rb +10 -8
- data/test/poolparty/monitors/test_base_monitor.rb +17 -0
- data/test/poolparty/monitors/test_monitor_rack.rb +26 -0
- data/test/poolparty/net/remoter_base_test.rb +17 -0
- data/test/poolparty/net/remoter_bases/libvirt/libvirt_test.rb +70 -0
- data/test/poolparty/net/remoter_bases/metavirt/metavirt_test.rb +81 -0
- data/test/poolparty/net/remoter_bases/vmrun/vmrun_test.rb +58 -27
- data/test/poolparty/plugins/chef_deploy_test.rb +37 -0
- data/test/poolparty/plugins/chef_plugin_test.rb +23 -0
- data/test/poolparty/plugins/rails_deploy_test.rb +50 -0
- data/test/poolparty/poolparty/cloud_test.rb +65 -0
- data/test/poolparty/poolparty/isolated_cloud_test.rb +25 -0
- data/test/poolparty/poolparty/neighborhood_test.rb +1 -1
- data/test/poolparty/poolparty/plugin_test.rb +19 -0
- data/test/poolparty/poolparty/pool_test.rb +22 -0
- data/test/poolparty/poolparty/poolparty_base_class_test.rb +53 -15
- data/test/poolparty/poolparty/schema_test.rb +13 -0
- data/test/poolparty/poolparty/template_test.rb +6 -6
- data/test/poolparty/verification/verify_test.rb +7 -3
- data/test/test_helper.rb +15 -4
- data/test/test_methods.rb +11 -0
- data/vendor/chef/apache2/attributes/apache.rb +1 -1
- data/vendor/gems/dslify/LICENSE +20 -0
- data/vendor/gems/dslify/README.rdoc +33 -0
- data/vendor/gems/dslify/Rakefile +56 -0
- data/vendor/gems/dslify/VERSION.yml +4 -0
- data/vendor/gems/dslify/dslify.gemspec +29 -0
- data/vendor/gems/dslify/lib/dslify.rb +81 -0
- data/vendor/gems/dslify/test/dslify_test.rb +283 -0
- data/vendor/gems/dslify/test/test_helper.rb +7 -0
- data/vendor/gems/git-style-binaries/README.markdown +280 -0
- data/vendor/gems/git-style-binaries/Rakefile +64 -0
- data/vendor/gems/git-style-binaries/VERSION.yml +4 -0
- data/vendor/gems/git-style-binaries/doc/EXAMPLES +1 -0
- data/vendor/gems/git-style-binaries/doc/gsb-screencast.png +0 -0
- data/vendor/gems/git-style-binaries/doc/poolparty-binaries.screenplay +412 -0
- data/vendor/gems/git-style-binaries/git-style-binaries.gemspec +78 -0
- data/vendor/gems/git-style-binaries/lib/ext/colorize.rb +198 -0
- data/vendor/gems/git-style-binaries/lib/ext/core.rb +16 -0
- data/vendor/gems/git-style-binaries/lib/git-style-binary/autorunner.rb +21 -0
- data/vendor/gems/git-style-binaries/lib/git-style-binary/command.rb +204 -0
- data/vendor/gems/git-style-binaries/lib/git-style-binary/commands/help.rb +32 -0
- data/vendor/gems/git-style-binaries/lib/git-style-binary/helpers/name_resolver.rb +78 -0
- data/vendor/gems/git-style-binaries/lib/git-style-binary/helpers/pager.rb +37 -0
- data/vendor/gems/git-style-binaries/lib/git-style-binary/parser.rb +223 -0
- data/vendor/gems/git-style-binaries/lib/git-style-binary.rb +88 -0
- data/vendor/gems/git-style-binaries/test/fixtures/flickr +4 -0
- data/vendor/gems/git-style-binaries/test/fixtures/flickr-download +17 -0
- data/vendor/gems/git-style-binaries/test/fixtures/wordpress +42 -0
- data/vendor/gems/git-style-binaries/test/fixtures/wordpress-categories +18 -0
- data/vendor/gems/git-style-binaries/test/fixtures/wordpress-list +18 -0
- data/vendor/gems/git-style-binaries/test/fixtures/wordpress-post +26 -0
- data/vendor/gems/git-style-binaries/test/git-style-binary/command_test.rb +17 -0
- data/vendor/gems/git-style-binaries/test/git_style_binary_test.rb +21 -0
- data/vendor/gems/git-style-binaries/test/running_binaries_test.rb +224 -0
- data/vendor/gems/git-style-binaries/test/shoulda_macros/matching_stdio.rb +13 -0
- data/vendor/gems/git-style-binaries/test/test_helper.rb +28 -0
- data/vendor/gems/parenting/History.txt +4 -0
- data/vendor/gems/parenting/Manifest.txt +14 -0
- data/vendor/gems/parenting/PostInstall.txt +2 -0
- data/vendor/gems/parenting/README.rdoc +47 -0
- data/vendor/gems/parenting/Rakefile +28 -0
- data/vendor/gems/parenting/lib/parenting/parenting.rb +70 -0
- data/vendor/gems/parenting/lib/parenting.rb +10 -0
- data/vendor/gems/parenting/parenting.gemspec +39 -0
- data/vendor/gems/parenting/script/console +10 -0
- data/vendor/gems/parenting/script/destroy +14 -0
- data/vendor/gems/parenting/script/generate +14 -0
- data/vendor/gems/parenting/test/file_to_eval.rb +9 -0
- data/vendor/gems/parenting/test/test_helper.rb +5 -0
- data/vendor/gems/parenting/test/test_parenting.rb +117 -0
- data/vendor/gems/suitcase/LICENSE +20 -0
- data/vendor/gems/suitcase/README.rdoc +31 -0
- data/vendor/gems/suitcase/Rakefile +57 -0
- data/vendor/gems/suitcase/VERSION.yml +4 -0
- data/vendor/gems/suitcase/lib/suitcase/unzipper.rb +15 -0
- data/vendor/gems/suitcase/lib/suitcase/zipper.rb +167 -0
- data/vendor/gems/suitcase/lib/suitcase.rb +5 -0
- data/vendor/gems/suitcase/suitcase.gemspec +32 -0
- data/vendor/gems/suitcase/test/suitcase_test.rb +108 -0
- data/vendor/gems/suitcase/test/test_dir/box.rb +1 -0
- data/vendor/gems/suitcase/test/test_dir/gems/famoseagle-carrot-0.6.0.gem +0 -0
- data/vendor/gems/suitcase/test/test_dir/test.txt +1 -0
- data/vendor/gems/suitcase/test/test_helper.rb +12 -0
- data/vendor/gems/trollop/FAQ.txt +35 -0
- data/vendor/gems/trollop/History.txt +97 -0
- data/vendor/gems/trollop/Manifest.txt +7 -0
- data/vendor/gems/trollop/README.txt +40 -0
- data/vendor/gems/trollop/Rakefile +36 -0
- data/vendor/gems/trollop/lib/trollop.rb +735 -0
- data/vendor/gems/trollop/release-script.txt +13 -0
- data/vendor/gems/trollop/test/test_trollop.rb +1042 -0
- data/vendor/gems/trollop/www/index.html +167 -0
- metadata +205 -150
- data/bin/cloud-describe +0 -28
- data/bin/cloud-handle-load +0 -27
- data/bin/cloud-rsync +0 -28
- data/bin/cloud-spec +0 -41
- data/bin/messenger-get-current-nodes +0 -14
- data/bin/server-become-master +0 -24
- data/bin/server-build-messenger +0 -28
- data/bin/server-clean-cert-for +0 -15
- data/bin/server-provision +0 -32
- data/bin/server-start-agent +0 -15
- data/bin/server-start-client +0 -29
- data/bin/server-start-master +0 -26
- data/bin/server-start-node +0 -32
- data/bin/server-stop-client +0 -3
- data/bin/server-stop-master +0 -3
- data/bin/server-stop-node +0 -3
- data/bin/server-update-hosts +0 -49
- data/examples/poolparty.rb +0 -12
- data/lib/poolparty/base_packages/heartbeat.rb +0 -58
- data/lib/poolparty/base_packages/runit.rb +0 -21
- data/lib/poolparty/capistrano/cloud_tasks.rb +0 -10
- data/lib/poolparty/capistrano.rb +0 -54
- data/lib/poolparty/config/postlaunchmessage.txt +0 -5
- data/lib/poolparty/core/metaid.rb +0 -15
- data/lib/poolparty/core/module.rb +0 -40
- data/lib/poolparty/extra/deployments.rb +0 -31
- data/lib/poolparty/helpers/display.rb +0 -30
- data/lib/poolparty/net/messenger.rb +0 -57
- data/lib/poolparty/net/remote_bases.rb +0 -21
- data/lib/poolparty/plugins/chef_deploy.rb +0 -58
- data/lib/poolparty/plugins/dynomite.rb +0 -14
- data/lib/poolparty/plugins/nanite.rb +0 -41
- data/lib/poolparty/plugins/rsyncmirror.rb +0 -28
- data/lib/poolparty/plugins/tokyo_tyrant.rb +0 -23
- data/lib/poolparty/poolparty/plugin_model.rb +0 -45
- data/lib/poolparty/resources/host.rb +0 -16
- data/lib/poolparty/resources/sshkey.rb +0 -27
- data/lib/poolparty/services/conditional.rb +0 -46
- data/lib/poolparty/spec/core/string.rb +0 -18
- data/lib/poolparty/spec/matchers/a_spec_extensions_base.rb +0 -26
- data/lib/poolparty/spec/matchers/have_cron.rb +0 -28
- data/lib/poolparty/spec/matchers/have_deploydirectory.rb +0 -15
- data/lib/poolparty/spec/matchers/have_directory.rb +0 -31
- data/lib/poolparty/spec/matchers/have_exec.rb +0 -28
- data/lib/poolparty/spec/matchers/have_file.rb +0 -28
- data/lib/poolparty/spec/matchers/have_gempackage.rb +0 -28
- data/lib/poolparty/spec/matchers/have_git.rb +0 -28
- data/lib/poolparty/spec/matchers/have_host.rb +0 -28
- data/lib/poolparty/spec/matchers/have_mount.rb +0 -28
- data/lib/poolparty/spec/matchers/have_package.rb +0 -28
- data/lib/poolparty/spec/matchers/have_remotefile.rb +0 -28
- data/lib/poolparty/spec/matchers/have_rsyncmirror.rb +0 -28
- data/lib/poolparty/spec/matchers/have_service.rb +0 -28
- data/lib/poolparty/spec/matchers/have_sshkey.rb +0 -28
- data/lib/poolparty/spec/matchers/have_symlink.rb +0 -28
- data/lib/poolparty/spec/matchers/have_variable.rb +0 -32
- data/lib/poolparty/spec/spec/dynamic_matchers.rb +0 -63
- data/lib/poolparty/spec/spec/ensure_matchers_exist.rb +0 -7
- data/lib/poolparty/spec/templates/have_base.rb +0 -28
- data/lib/poolparty/spec.rb +0 -31
- data/spec/poolparty/core/module_spec.rb +0 -15
- data/spec/poolparty/helpers/display_spec.rb +0 -13
- data/spec/poolparty/id_rsa +0 -27
- data/spec/poolparty/net/messenger_spec.rb +0 -16
- data/spec/poolparty/resources/host_spec.rb +0 -35
- data/spec/poolparty/services/conditional_spec.rb +0 -52
- data/spec/poolparty/spec/core/string_spec.rb +0 -57
@@ -0,0 +1,100 @@
|
|
1
|
+
module PoolParty
|
2
|
+
# Abstracts out the searchable path for a resource such as a
|
3
|
+
# template file, key, or clouds.rb
|
4
|
+
#
|
5
|
+
# NOTE: this is currently _only_ implemented on templates
|
6
|
+
# (PoolParty::Resources::File) and not yet working on clouds.rb or key files.
|
7
|
+
# These will eventually be refactored to use this class.
|
8
|
+
module SearchablePaths
|
9
|
+
def self.included(mod)
|
10
|
+
mod.extend(ClassMethods)
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
# Specify that a particular class has methods for searchable paths.
|
15
|
+
#
|
16
|
+
# Options:
|
17
|
+
# * <tt>:dirs</tt>: array of directories to look in *under* the search paths. (default: <tt>["/"]</tt>)
|
18
|
+
# * <tt>:dir</tt>: set the directory to look in *under* the search paths. Use either dir or dirs, not both. (default: +/+)
|
19
|
+
# * <tt>:paths</tt>: overwrite all default paths and set the paths to this array exactly
|
20
|
+
# * <tt>:append_paths</tt>: append these paths to any existing paths
|
21
|
+
# * <tt>:prepend_paths</tt>: prepend these paths to any existing paths
|
22
|
+
def has_searchable_paths(opts={})
|
23
|
+
class_eval do
|
24
|
+
extend PoolParty::SearchablePaths::SingletonMethods
|
25
|
+
|
26
|
+
@searchable_paths_dirs = [opts[:dir]] if opts[:dir]
|
27
|
+
@searchable_paths_dirs = opts[:dirs] if opts[:dirs]
|
28
|
+
@paths_override = opts[:paths] if opts[:paths]
|
29
|
+
@paths_prepend = opts[:prepend_paths] || []
|
30
|
+
@paths_append = opts[:append_paths] || []
|
31
|
+
end
|
32
|
+
include PoolParty::SearchablePaths::InstanceMethods
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module SingletonMethods
|
37
|
+
def searchable_paths_dir; @searchable_paths_dirs.first; end
|
38
|
+
def searchable_paths_dirs
|
39
|
+
@searchable_paths_dirs && @searchable_paths_dirs.size > 0 ? @searchable_paths_dirs : ["/"]
|
40
|
+
end
|
41
|
+
|
42
|
+
# The default paths are primarily defined in PoolParty::Default. These are the default search paths in order:
|
43
|
+
#
|
44
|
+
# * current working directory (Dir.pwd)
|
45
|
+
# * ~/.poolparty
|
46
|
+
# * ~/.ec2
|
47
|
+
# * /etc/poolparty
|
48
|
+
# * /var/poolparty
|
49
|
+
def default_paths
|
50
|
+
@default_searchable_paths ||= [
|
51
|
+
Dir.pwd,
|
52
|
+
PoolParty::Default.poolparty_home_path,
|
53
|
+
PoolParty::Default.base_keypair_path,
|
54
|
+
PoolParty::Default.poolparty_src_path,
|
55
|
+
PoolParty::Default.poolparty_src_path/:lib/:poolparty,
|
56
|
+
PoolParty::Default.base_config_directory,
|
57
|
+
PoolParty::Default.remote_storage_path
|
58
|
+
]
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_searchable_path(path)
|
62
|
+
default_paths # instantiate @default_searchable_paths
|
63
|
+
@default_searchable_paths << path
|
64
|
+
end
|
65
|
+
|
66
|
+
# returns the full set of valid searchable paths, given the options
|
67
|
+
def searchable_paths
|
68
|
+
return @paths_override if @paths_override && @paths_override.size > 0
|
69
|
+
@paths_prepend + default_paths + @paths_append
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
module InstanceMethods
|
74
|
+
|
75
|
+
# Searches for +filepath+ in the <tt>searchable_paths</tt> iff +filepath+
|
76
|
+
# doesn't exist. e.g. +filepath+ is interpreted *first* as an absolute
|
77
|
+
# path, if +filepath+ doesn't exist verbatim then it looks for the file
|
78
|
+
# in the searchable_paths.
|
79
|
+
#
|
80
|
+
# Returns +nil+ if the file cannot be found.
|
81
|
+
def search_in_known_locations(filepath, additional_search_paths=[])
|
82
|
+
return filepath if ::File.exists?(filepath) # return the file if its an absolute path
|
83
|
+
additional_search_paths.each do |path|
|
84
|
+
full_path = ::File.expand_path(path / filepath)
|
85
|
+
return full_path if ::File.exists?(full_path)
|
86
|
+
end
|
87
|
+
self.class.searchable_paths.each do |path|
|
88
|
+
self.class.searchable_paths_dirs.each do |dir|
|
89
|
+
full_path = ::File.expand_path(path / dir / filepath)
|
90
|
+
return full_path if ::File.exists?(full_path)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
nil
|
94
|
+
end
|
95
|
+
alias_method :find_file, :search_in_known_locations
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -12,7 +12,7 @@ module PoolParty
|
|
12
12
|
# Add to the suitcase files below the clouds.rb base directory
|
13
13
|
def pack_user_directory(dirname)
|
14
14
|
begin
|
15
|
-
::Suitcase::Zipper.add("#{::File.dirname($pool_specfile)}/#{dirname}", "etc")
|
15
|
+
::Suitcase::Zipper.add("#{::File.dirname($pool_specfile)}/#{dirname}", "/etc/poolparty")
|
16
16
|
rescue Exception => e
|
17
17
|
vputs "Error packing user directory #{dirname}: #{e}"
|
18
18
|
end
|
@@ -5,10 +5,35 @@
|
|
5
5
|
monitors
|
6
6
|
=end
|
7
7
|
module Monitors
|
8
|
+
|
9
|
+
@available_monitors =[]
|
10
|
+
def self.available
|
11
|
+
@available_monitors
|
12
|
+
end
|
13
|
+
|
8
14
|
class BaseMonitor
|
15
|
+
attr_reader :log_file, :log_file_path, :last_cloud_loaded_time
|
16
|
+
|
17
|
+
def self.inherited(subclass)
|
18
|
+
unless Monitors.available.include?(subclass)
|
19
|
+
Monitors.available << subclass unless subclass.to_s =~ /MonitorDaemon/
|
20
|
+
end
|
21
|
+
end
|
9
22
|
|
10
23
|
def initialize(env=nil)
|
11
24
|
@env=env
|
25
|
+
log_filename = "poolparty_monitor.log"
|
26
|
+
@log_file_path = "/var/log/poolparty/#{log_filename}"
|
27
|
+
|
28
|
+
unless ::File.file?(log_file_path)
|
29
|
+
::FileUtils.mkdir_p ::File.dirname(log_file_path) unless ::File.directory?(::File.dirname(log_file_path))
|
30
|
+
::File.open(log_file_path, 'a+') {|f| f << "------ #{Time.now} ------"}
|
31
|
+
log_file_path
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def env(env=@env)
|
36
|
+
@env=env
|
12
37
|
end
|
13
38
|
|
14
39
|
%w(close).each do |event|
|
@@ -22,11 +47,51 @@ module Monitors
|
|
22
47
|
|
23
48
|
end
|
24
49
|
|
50
|
+
# Load the cloud
|
51
|
+
# Reload the cloud if necessary after 60 seconds
|
52
|
+
# of cache time
|
53
|
+
def my_cloud
|
54
|
+
@my_cloud = nil if last_cloud_loaded_time && last_cloud_loaded_time > 60
|
55
|
+
@my_cloud ||= begin
|
56
|
+
require '/etc/poolparty/clouds.rb'
|
57
|
+
name = open("/etc/poolparty/cloud_name").read
|
58
|
+
last_cloud_loaded_time = Time.now.to_i
|
59
|
+
clouds[name.chomp.to_sym]
|
60
|
+
rescue Exception => e
|
61
|
+
JSON.parse( open('/etc/poolparty/clouds.json' ).read )
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
25
66
|
def before_close_callbacks
|
26
67
|
@before_close_callbacks ||= []
|
27
68
|
end
|
28
69
|
def after_close_callbacks
|
29
70
|
@after_close_callbacks ||= []
|
30
71
|
end
|
72
|
+
|
73
|
+
def log(msg)
|
74
|
+
log_file.flush
|
75
|
+
log_file << "[INFO] - #{Time.now} -- #{msg}\n"
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def log_file
|
81
|
+
if @logfile
|
82
|
+
@logfile
|
83
|
+
else
|
84
|
+
begin
|
85
|
+
::FileUtils.mkdir_p ::File.dirname(log_file_path) unless ::File.directory?(::File.dirname(log_file_path))
|
86
|
+
@logfile ||= ::File.open(log_file_path, 'a+')
|
87
|
+
rescue Exception => e
|
88
|
+
puts "ERROR: #{e.inspect}"
|
89
|
+
@logfile = $stdout
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
|
31
96
|
end
|
32
97
|
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require "open-uri"
|
2
|
+
require "json"
|
3
|
+
require "#{::File.dirname(__FILE__)}/base_monitor"
|
4
|
+
|
5
|
+
module PoolParty
|
6
|
+
class MonitorDaemon < Monitors::BaseMonitor
|
7
|
+
|
8
|
+
attr_reader :should_daemonize, :pid_file, :sleep_time
|
9
|
+
|
10
|
+
def self.run(o={})
|
11
|
+
new(o).run
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(o={})
|
15
|
+
@should_daemonize = o.delete(:daemonize)
|
16
|
+
@pid_file = o.delete(:daemonize) || "/tmp/poolparty_monitor.pid"
|
17
|
+
@sleep_time = o.delete(:sleep_time) || 20
|
18
|
+
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def pass_the_baton
|
23
|
+
# Handle stats
|
24
|
+
my_nominations = JSON.parse(open("http://localhost:8642/stats/get_nominations").read)
|
25
|
+
unless my_nominations.empty?
|
26
|
+
running_nodes = my_cloud.nodes(:status => "running")
|
27
|
+
nominations = []
|
28
|
+
running_nodes.each do |node|
|
29
|
+
timeout(10) do
|
30
|
+
log "Checking with #{node.internal_ip} for nominations: #{open("http://#{node.internal_ip}:8642/stats/get_nominations").read}"
|
31
|
+
nominations << begin
|
32
|
+
JSON.parse(open("http://#{node.internal_ip}:8642/stats/nominations").read) || "none"
|
33
|
+
rescue
|
34
|
+
log "Error when connecting to #{node.internal_ip}: #{e.inspect}"
|
35
|
+
"none"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
log "Sending #{nominations.flatten.to_json} to #{server["/elections"].inspect}"
|
40
|
+
# put to "http://localhost:8642/elections/handle_election", data => nominations.to_json
|
41
|
+
server["/elections"].put(nominations.flatten.to_json)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def run
|
46
|
+
if should_daemonize
|
47
|
+
@should_daemonize = false
|
48
|
+
daemonize
|
49
|
+
else
|
50
|
+
log "Starting MonitorDaemon"
|
51
|
+
loop {
|
52
|
+
begin
|
53
|
+
pass_the_baton
|
54
|
+
rescue Exception => e
|
55
|
+
log "There was an error with pass_the_baton: #{e}"
|
56
|
+
end
|
57
|
+
sleep sleep_time
|
58
|
+
}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def daemonize(o={})
|
63
|
+
raise unless pid_file
|
64
|
+
|
65
|
+
pwd = Dir.pwd # Current directory is changed during daemonization, so store it
|
66
|
+
|
67
|
+
remove_stale_pid_file
|
68
|
+
pid = fork do
|
69
|
+
Signal.trap('HUP') do
|
70
|
+
restart
|
71
|
+
end
|
72
|
+
Signal.trap('INT') do
|
73
|
+
stop!
|
74
|
+
end
|
75
|
+
Signal.trap("CHLD") do
|
76
|
+
Process.waitpid(pid, Process::WNOHANG)
|
77
|
+
end
|
78
|
+
File.open("/dev/null", "r+") do |devnull|
|
79
|
+
$stdout.reopen(devnull)
|
80
|
+
$stderr.reopen(devnull)
|
81
|
+
$stdin.reopen(devnull) unless @use_stdin
|
82
|
+
end
|
83
|
+
run
|
84
|
+
end
|
85
|
+
|
86
|
+
Dir.chdir(pwd)
|
87
|
+
|
88
|
+
write_pid_file(pid)
|
89
|
+
|
90
|
+
Process.detach(pid)
|
91
|
+
end
|
92
|
+
|
93
|
+
def pid
|
94
|
+
@pid ||= File.file?(pid_file) ? open(pid_file).read.to_i : nil
|
95
|
+
end
|
96
|
+
|
97
|
+
def stop!
|
98
|
+
log "Stopping daemon"
|
99
|
+
log_file.close
|
100
|
+
send_signal("INT")
|
101
|
+
remove_stale_pid_file
|
102
|
+
exit 0
|
103
|
+
end
|
104
|
+
|
105
|
+
def restart
|
106
|
+
log "TODO: implement restart for HUP signal on #{__FILE__}"
|
107
|
+
end
|
108
|
+
|
109
|
+
def running?
|
110
|
+
return false unless pid
|
111
|
+
Process.getpgid(pid) != -1
|
112
|
+
rescue Errno::ESRCH
|
113
|
+
false
|
114
|
+
end
|
115
|
+
|
116
|
+
def send_signal(signal)
|
117
|
+
if File.exist?(pid_file) && pid = open(pid_file).read
|
118
|
+
pid = pid.to_i
|
119
|
+
print "Sending #{signal} signal to process #{pid} ... "
|
120
|
+
Process.kill(signal, pid)
|
121
|
+
puts
|
122
|
+
pid
|
123
|
+
else
|
124
|
+
puts "Can't stop process, no PID found in #{pid_file}"
|
125
|
+
nil
|
126
|
+
end
|
127
|
+
rescue Errno::ESRCH # No such process
|
128
|
+
puts "process not found!"
|
129
|
+
nil
|
130
|
+
end
|
131
|
+
|
132
|
+
protected
|
133
|
+
def remove_pid_file
|
134
|
+
File.delete(pid_file) if pid_file && File.exists?(pid_file)
|
135
|
+
end
|
136
|
+
|
137
|
+
def write_pid_file(pid)
|
138
|
+
FileUtils.mkdir_p File.dirname(pid_file)
|
139
|
+
open(pid_file,"w") { |f| f.write(pid) }
|
140
|
+
File.chmod(0644, pid_file)
|
141
|
+
end
|
142
|
+
|
143
|
+
def remove_stale_pid_file
|
144
|
+
if File.exist?(@pid_file)
|
145
|
+
if pid && running?
|
146
|
+
puts "Pid file exists" and raise
|
147
|
+
else
|
148
|
+
remove_pid_file
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def server
|
154
|
+
if @server
|
155
|
+
@server
|
156
|
+
else
|
157
|
+
opts = { :content_type =>'application/json',
|
158
|
+
:accept => 'application/json',
|
159
|
+
:host => 'http://localhost',
|
160
|
+
:port => '8642'
|
161
|
+
}
|
162
|
+
@uri = "#{opts.delete(:host)}:#{opts.delete(:port)}"
|
163
|
+
@server = RestClient::Resource.new( @uri, opts)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
end
|
@@ -2,9 +2,10 @@
|
|
2
2
|
MonitorRack is a rack application that maps url requests to method calls on Monitor classes.
|
3
3
|
=end
|
4
4
|
|
5
|
-
require ::File.dirname(__FILE__)+"/../aska
|
5
|
+
require ::File.dirname(__FILE__)+"/../aska"
|
6
6
|
require ::File.dirname(__FILE__)+"/../lite"
|
7
7
|
require ::File.dirname(__FILE__)+"/base_monitor"
|
8
|
+
require ::File.dirname(__FILE__)+"/monitor_daemon"
|
8
9
|
|
9
10
|
require 'rubygems'
|
10
11
|
require 'rack'
|
@@ -44,14 +45,13 @@ module Monitors
|
|
44
45
|
begin
|
45
46
|
path_array= path_map(env['REQUEST_PATH']) || []
|
46
47
|
verb = env['REQUEST_METHOD'].downcase
|
47
|
-
@response.write map_to_method(path_array, verb).to_json
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
new_body = map_to_method(path_array, verb)
|
50
|
+
new_body = new_body.to_json unless (!path_array || path_array.empty? || path_array[0].nil?)
|
51
|
+
|
52
|
+
@response.write new_body
|
53
|
+
setup_callbacks
|
54
|
+
|
55
55
|
# rescue Exception=>e
|
56
56
|
# @response.write e
|
57
57
|
# @response.status = 500
|
@@ -60,7 +60,16 @@ module Monitors
|
|
60
60
|
end
|
61
61
|
|
62
62
|
private
|
63
|
+
def setup_callbacks
|
64
|
+
if instance.respond_to? :before_close_callbacks
|
65
|
+
@response.before_close_callbacks << instance.before_close_callbacks
|
66
|
+
end
|
67
|
+
if instance.respond_to?(:after_close_callbacks)
|
68
|
+
@response.after_close_callbacks << instance.after_close_callbacks
|
69
|
+
end
|
70
|
+
end
|
63
71
|
def instance
|
72
|
+
return nil if path_map.nil?
|
64
73
|
@instance ||= constantize( path_map.first ).new(env)
|
65
74
|
end
|
66
75
|
|
@@ -78,24 +87,30 @@ module Monitors
|
|
78
87
|
def path_map(requested_path=env['REQUEST_PATH'])
|
79
88
|
requested_path.split('.')[0].split('/')[1..-1]
|
80
89
|
end
|
81
|
-
|
90
|
+
|
91
|
+
def html_list
|
92
|
+
str = "<h1>Available Monitors</h1><br /><ul>"
|
93
|
+
::Monitors.available.each do |monitor|
|
94
|
+
str<< "<li><a href=/#{monitor.to_s.split('::').pop}>#{monitor}</a></li>"
|
95
|
+
end
|
96
|
+
str << "</ul>"
|
97
|
+
str
|
98
|
+
end
|
99
|
+
|
82
100
|
# Find class and call method from the pattern /class_name/method/args
|
83
101
|
# GET /neighborhood => ::Monitors::Neighboorhood.get
|
84
102
|
# POST /neighborhood => ::Monitors::Neighboorhood.post(params)
|
85
103
|
# GET /neighborhood/size => ::Monitors::Neighboorhood.get_size
|
86
104
|
def map_to_method(path, verb='get')
|
87
105
|
if !path or path.empty? or path[0].nil?
|
88
|
-
|
89
|
-
response.status='404'
|
106
|
+
html_list
|
90
107
|
else
|
91
108
|
raise "#{path[0]} did not map to a Constant" if !instance
|
92
109
|
case path.size
|
93
|
-
when 0 # usefull if you want to subclass from MonitorRack
|
94
|
-
self.respond_to?(verb.to_sym) ? self.send(verb.to_sym) : response.status='404'
|
95
110
|
when 1 # example: /stats
|
96
111
|
instance.send(verb.to_sym, @data)
|
97
112
|
when 2 # example: /stats/load
|
98
|
-
instance.send("#{verb}_#{path[1]}".to_sym, @data)
|
113
|
+
instance.send("#{verb}_#{path[1]}".to_sym, @data) rescue instance.send("#{path[1]}".to_sym, @data)
|
99
114
|
else # example: /stats/load/average/5/minutes
|
100
115
|
instance.send("#{verb}_#{path[1]}".to_sym, env['rack.input'].read, *path[2..-1])
|
101
116
|
end
|
@@ -119,5 +134,4 @@ module Monitors
|
|
119
134
|
|
120
135
|
end
|
121
136
|
|
122
|
-
|
123
137
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# An example monitor
|
2
|
-
# access it at /
|
2
|
+
# access it at /monitor_clock/ or /monitor_clock/now
|
3
3
|
module Monitors
|
4
4
|
|
5
|
-
class
|
5
|
+
class Clock < BaseMonitor
|
6
6
|
def get(data=nil)
|
7
7
|
Time.now
|
8
8
|
end
|
@@ -10,6 +10,11 @@ module Monitors
|
|
10
10
|
def get_now
|
11
11
|
Time.now
|
12
12
|
end
|
13
|
+
|
14
|
+
def put(data=nil)
|
15
|
+
get(data)
|
16
|
+
end
|
17
|
+
|
13
18
|
end
|
14
19
|
|
15
20
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
=begin rdoc
|
2
|
+
Cloud monitor just is a test monitor to hold cloud info
|
3
|
+
=end
|
4
|
+
|
5
|
+
module Monitors
|
6
|
+
|
7
|
+
class Cloud < BaseMonitor
|
8
|
+
|
9
|
+
def get(_unused=nil)
|
10
|
+
{ :name => my_cloud.name,
|
11
|
+
:minimum_instances => my_cloud.minimum_instances,
|
12
|
+
:maximum_instances => my_cloud.maximum_instances,
|
13
|
+
:remoter_base => my_cloud.remoter_base,
|
14
|
+
:keypair => my_cloud.keypair
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def nominations(_unused=nil)
|
19
|
+
running_nodes = my_cloud.nodes(:status => "running")
|
20
|
+
nominations = []
|
21
|
+
running_nodes.each do |node|
|
22
|
+
timeout(10) do
|
23
|
+
log "Checking with #{node.internal_ip} for nominations: #{open("http://#{node.internal_ip}:8642/stats/get_nominations").read}"
|
24
|
+
nominations << begin
|
25
|
+
JSON.parse(open("http://#{node.internal_ip}:8642/stats/nominations").read) || "none"
|
26
|
+
rescue
|
27
|
+
log "Error when connecting to #{node.internal_ip}: #{e.inspect}"
|
28
|
+
"none"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end.histogram
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Monitors
|
2
|
+
class Elections < BaseMonitor
|
3
|
+
|
4
|
+
# these are the rules that define the
|
5
|
+
# elected actions
|
6
|
+
def self.candidates
|
7
|
+
{
|
8
|
+
:expand => :contract,
|
9
|
+
:contract => :expand,
|
10
|
+
:configure => nil,
|
11
|
+
:none => nil
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def get(data=nil)
|
16
|
+
'hello'
|
17
|
+
end
|
18
|
+
|
19
|
+
def put(data=nil)
|
20
|
+
elections = JSON.parse(data)
|
21
|
+
log "Received #{elections.histogram.inspect} in Elections Monitor"
|
22
|
+
handle_election(elections.histogram)
|
23
|
+
end
|
24
|
+
|
25
|
+
def count_ballots(ballots={}, candidates={:expand => 0, :contract => 0})
|
26
|
+
# Ballots look like:
|
27
|
+
# {host => ["contract"]}
|
28
|
+
# Count the number of nominations for each candidate action
|
29
|
+
candidates.each do |action, ballots|
|
30
|
+
stats.each do |ip, node_hsh|
|
31
|
+
if node_hsh["nominations"] && node_hsh["nominations"].include?(action.to_s)
|
32
|
+
candidates[action]+=1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
candidates
|
37
|
+
end
|
38
|
+
|
39
|
+
# Handle the elections
|
40
|
+
# ballots: {"contract" => 1, "expand" => 4}
|
41
|
+
def handle_election(ballots={})
|
42
|
+
# Expand the cloud if 50+% of the votes are for expansion
|
43
|
+
# Contract the cloud if 51+% of the votes are for contraction
|
44
|
+
# Check to make sure an elected action is not already in progress
|
45
|
+
log "handle_election: #{ballots.inspect}"
|
46
|
+
ballots.symbolize_keys!
|
47
|
+
total_votes = ballots.inject(0) {|total, arr| total += arr[1] }
|
48
|
+
|
49
|
+
ballots.each do |ballot, pro_votes|
|
50
|
+
contra = self.class.candidates[ballot]
|
51
|
+
con_votes = ballots[contra] || 0
|
52
|
+
|
53
|
+
if (pro_votes - con_votes)/total_votes > 0.5
|
54
|
+
return run_elected_action(ballot)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def run_elected_action(ballot)
|
60
|
+
log "Electing #{ballot}"
|
61
|
+
case ballot
|
62
|
+
when :expand
|
63
|
+
my_cloud.running_action = :expanding
|
64
|
+
my_cloud.launch_instance!(:cloud_name => my_cloud.name)
|
65
|
+
my_cloud.running_action = nil
|
66
|
+
when :contract
|
67
|
+
my_cloud.running_action = :contracting
|
68
|
+
my_cloud.terminate_youngest_instance!
|
69
|
+
my_cloud.running_action = nil
|
70
|
+
else
|
71
|
+
"none"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -8,19 +8,20 @@ module Monitors
|
|
8
8
|
class Neighborhood < BaseMonitor
|
9
9
|
|
10
10
|
def get(data=nil)
|
11
|
-
|
11
|
+
reset!
|
12
|
+
neighborhood
|
12
13
|
end
|
13
14
|
|
14
15
|
def put(data, from=nil)
|
15
16
|
@neighborhood_instances = merge_array_of_hashes_with_key(neighborhood.instances, JSON.parse(data), 'ip')
|
16
17
|
@neighborhood = {@neighborhood[:instances] => @neighborhood_instances}
|
17
|
-
after_close do
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
18
|
+
# after_close do
|
19
|
+
# if @neighborhood.instances.size>1
|
20
|
+
# # TODO: Add logger here
|
21
|
+
# puts "Pinging #{"#{@neighborhood.instances.rand.ip}/neighborhood"}"
|
22
|
+
# RestClient.put "#{@neighborhood.instances.rand.ip}/neighborhood", @neighborhood, :content_type => 'text/x-json'
|
23
|
+
# end
|
24
|
+
# end
|
24
25
|
save
|
25
26
|
end
|
26
27
|
|
@@ -66,12 +67,14 @@ module Monitors
|
|
66
67
|
end
|
67
68
|
|
68
69
|
# HELPERS
|
69
|
-
def instances
|
70
|
-
@instances ||= ::PoolParty::Neighborhoods.load_default.instances
|
70
|
+
def instances(_n=nil)
|
71
|
+
@instances ||= ::PoolParty::Neighborhoods.load_default.instances #.to_hash #[:instances]
|
71
72
|
end
|
72
|
-
def stats
|
73
|
+
def stats(_n=nil)
|
73
74
|
@stats ||= ::PoolParty::Neighborhoods.load_default.stats rescue Stats.new(@env).get
|
74
75
|
end
|
75
|
-
|
76
|
+
def reset!
|
77
|
+
@neighborhood = @stats = nil
|
78
|
+
end
|
76
79
|
end
|
77
80
|
end
|