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
@@ -1,43 +1,49 @@
|
|
1
1
|
module PoolParty
|
2
2
|
module Remote
|
3
3
|
|
4
|
-
# #DEPRECATE We'll stub the ip to be the master ip for ease and accessibility
|
5
|
-
# def ip(i=nil)
|
6
|
-
# puts "DEPRECATED: ip will only be callable against a RemoteInstance in the next release."
|
7
|
-
# i ? options[:ip] = i : (master ? master.ip : options[:ip])
|
8
|
-
# end
|
9
|
-
# #DEPRECATE: get the master instance
|
10
|
-
def master
|
11
|
-
puts "DEPRECATED: 'master' is deprecated and will be removed in the next major release."
|
12
|
-
get_instance_by_number(0)
|
13
|
-
end
|
14
|
-
|
15
4
|
# Select a list of instances based on their status
|
16
|
-
def nodes(hsh={})
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
5
|
+
def nodes(hsh={}, with_neighborhood_default=false)
|
6
|
+
unordered = begin
|
7
|
+
if with_neighborhood_default
|
8
|
+
list_of_instances(with_neighborhood_default).select_with_hash(hsh)
|
9
|
+
else
|
10
|
+
kname = (hsh[:keypair_name] ||self.keypair_name || self.keypair_name || keypair.basename)
|
11
|
+
# Added keypair to filter on either keypair_name or keypair response
|
12
|
+
key_condition = {:keypair_name => kname, :keypair => kname, :key_name => kname}
|
13
|
+
# if hsh.delete(:uncached)
|
14
|
+
# @nodes = describe_instances.select_with_hash(conditions)
|
15
|
+
# else
|
16
|
+
# @nodes ||= describe_instances.select_with_hash(conditions)
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
results = describe_instances.select_with_hash(key_condition)
|
20
|
+
results.select_with_hash(hsh)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
unordered.sort_by(&:launch_time) # provide consistent sorting for nodes
|
24
25
|
end
|
25
26
|
|
26
27
|
# Select the list of instances, either based on the neighborhoods
|
27
28
|
# loaded from /etc/poolparty/neighborhood.json
|
28
29
|
# or by the remote_base on keypair
|
29
|
-
def list_of_instances
|
30
|
+
def list_of_instances(with_neighborhood_default=true)
|
30
31
|
return @list_of_instances if @list_of_instances
|
31
32
|
@containing_cloud = self
|
32
|
-
n = Neighborhoods.load_default
|
33
|
-
@list_of_instances = (n.empty? ? _list_of_instances : n.instances)
|
33
|
+
n = false ? Neighborhoods.load_default : nil
|
34
|
+
@list_of_instances = ((n.nil? || n.instances.empty?) ? _list_of_instances : n.instances)
|
34
35
|
end
|
35
36
|
|
36
37
|
private
|
38
|
+
# Cache the instances_by_status here
|
39
|
+
def _nodes
|
40
|
+
@_nodes ||= {}
|
41
|
+
end
|
42
|
+
|
37
43
|
# List the instances for the current key pair, regardless of their states
|
38
44
|
# If no keypair is passed, select them all
|
39
|
-
def _list_of_instances(select={})
|
40
|
-
@describe_instances ||= remote_base.describe_instances(
|
45
|
+
def _list_of_instances(select={})
|
46
|
+
@describe_instances ||= remote_base.describe_instances(dsl_options).select_with_hash(select)
|
41
47
|
end
|
42
48
|
|
43
49
|
# If the cloud is starting an instance, it will not be listed in
|
@@ -16,24 +16,76 @@
|
|
16
16
|
register_remote_base :remote_base_name
|
17
17
|
|
18
18
|
=end
|
19
|
-
|
20
19
|
module PoolParty
|
21
20
|
|
22
|
-
module Remote
|
21
|
+
module Remote
|
22
|
+
|
23
|
+
def self.available
|
24
|
+
@available ||= []
|
25
|
+
end
|
26
|
+
|
23
27
|
# This class is the base class for all remote types, such as ec2
|
24
28
|
# Everything remoting-wise is derived from this class
|
25
29
|
class RemoterBase
|
26
|
-
include
|
27
|
-
include
|
30
|
+
include Dslify
|
31
|
+
include ::PoolParty::Remote
|
32
|
+
include ::PoolParty::Pinger
|
28
33
|
|
29
|
-
|
34
|
+
# All inheriting remoter bases should override these default_options
|
35
|
+
dsl_methods :keypair,
|
36
|
+
:image_id,
|
37
|
+
:keypair_name
|
38
|
+
|
39
|
+
def initialize(opts={}, &block)
|
40
|
+
opts.each {|k,v| opts[k] = v.call if v.respond_to?(:call) }
|
41
|
+
set_vars_from_options opts
|
42
|
+
instance_eval(&block) if block
|
43
|
+
end
|
30
44
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
45
|
+
def self.inherited(subclass)
|
46
|
+
unless Remote.available.include?(subclass)
|
47
|
+
Remote.available << subclass
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def cloud(n=nil)
|
52
|
+
if n.nil?
|
53
|
+
@cloud
|
54
|
+
else
|
55
|
+
@cloud = n
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def keypair
|
60
|
+
cloud.keypair
|
61
|
+
end
|
62
|
+
|
63
|
+
def key_name
|
64
|
+
keypair.basename
|
65
|
+
end
|
66
|
+
|
67
|
+
# def evaluate_proc_options(opts)
|
68
|
+
# if opts.respond_to?(:call)
|
69
|
+
# opts.call
|
70
|
+
# elsif opts.respond_to? :each
|
71
|
+
# if opts.respond_to?(:values) && opts.respond_to?(:keys)
|
72
|
+
# opts.each {|k,v| opts[k] = evaluate_proc_options v }
|
73
|
+
# elsif opts.respond_to?(:each_with_index)
|
74
|
+
# opts.each_with_index{|o,i| opts[i] = evaluate_proc_options o}
|
75
|
+
# end
|
76
|
+
# end
|
77
|
+
# opts
|
78
|
+
# end
|
79
|
+
|
80
|
+
#TODO: deprecate these two methods, use Remote.available
|
81
|
+
def self.available_bases
|
82
|
+
Remote.available.collect{|b| b.name.split('::').pop.snake_case.to_sym}
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns a :remote_base_name symbol for the remoter base name
|
86
|
+
def self.symbol
|
87
|
+
name.top_level_class.to_sym
|
35
88
|
end
|
36
|
-
|
37
89
|
|
38
90
|
# def method_missing(meth, *args, &block)
|
39
91
|
# if @cloud
|
@@ -49,33 +101,39 @@ module PoolParty
|
|
49
101
|
# An exception will be raised and poolparty will explode into tiny little
|
50
102
|
# pieces. Don't forget to overwrite these methods
|
51
103
|
# Launch a new instance
|
52
|
-
def self.launch_new_instance!(
|
53
|
-
new(
|
104
|
+
def self.launch_new_instance!(o={})
|
105
|
+
new(o).launch_new_instance!(o)
|
54
106
|
end
|
55
107
|
def launch_new_instance!(o={})
|
56
108
|
raise RemoteException.new(:method_not_defined, "launch_new_instance!")
|
57
109
|
end
|
58
110
|
|
59
111
|
# Terminate an instance by id
|
60
|
-
def self.terminate_instance!(
|
61
|
-
new(
|
112
|
+
def self.terminate_instance!(o={})
|
113
|
+
new(o).terminate_instance!(o)
|
62
114
|
end
|
63
115
|
def terminate_instance!(o={})
|
64
116
|
raise RemoteException.new(:method_not_defined, "terminate_instance!")
|
65
117
|
end
|
66
118
|
|
67
|
-
# Describe an instance's status
|
68
|
-
|
69
|
-
|
119
|
+
# Describe an instance's status. Should return a hash like object
|
120
|
+
#Required keys are:
|
121
|
+
# :image_id
|
122
|
+
# :keypair_name
|
123
|
+
# :instance_id
|
124
|
+
# :status
|
125
|
+
def self.describe_instance(o={})
|
126
|
+
new(o).describe_instance(o)
|
70
127
|
end
|
71
128
|
def describe_instance(o={})
|
72
129
|
raise RemoteException.new(:method_not_defined, "describe_instance")
|
73
130
|
end
|
74
131
|
|
75
132
|
# Get instances
|
76
|
-
# The instances must
|
77
|
-
|
78
|
-
|
133
|
+
# The instances must return an object responding to each
|
134
|
+
# Each yielded object must respond to [:status]
|
135
|
+
def self.describe_instances(o={})
|
136
|
+
new(o).describe_instances(o)
|
79
137
|
end
|
80
138
|
def describe_instances(o={})
|
81
139
|
raise RemoteException.new(:method_not_defined, "describe_instances")
|
@@ -83,34 +141,46 @@ module PoolParty
|
|
83
141
|
|
84
142
|
# TODO: Rename and modularize the @inst.status =~ /pending/ so that it works on all
|
85
143
|
# remoter_bases
|
144
|
+
# 1.) Launches a new instance,
|
145
|
+
# 2.) Waits for the instance to get an ip address
|
146
|
+
# 3.) Waits for port 22 to be open
|
147
|
+
# 4.) Calls call_after_launch_instance callbacks
|
148
|
+
# 5.) Executes passed &block, if any
|
86
149
|
def launch_instance!(o={}, &block)
|
87
|
-
@
|
150
|
+
@cloud = clouds[o[:cloud_name] || o[:name]]
|
151
|
+
o[:keypair_name] = @cloud.keypair.basename
|
152
|
+
@inst = launch_new_instance!( dsl_options.merge(o) )
|
88
153
|
sleep(2)
|
89
154
|
|
90
|
-
|
155
|
+
dputs "#{@cloud.name} launched instance checking for ip..."
|
91
156
|
|
92
157
|
# Wait for 10 minutes for the instance to gain an ip if it doesn't already have one
|
93
158
|
500.times do |i|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
159
|
+
if @inst
|
160
|
+
break if @inst[:ip] && @inst[:ip] =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
|
161
|
+
break if @inst[:public_ip] && @inst[:public_ip] =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
|
162
|
+
sleep(2)
|
163
|
+
@inst = describe_instance(@inst)
|
164
|
+
dprint "."
|
165
|
+
else
|
166
|
+
@inst = describe_instances.last
|
167
|
+
dprint "."
|
168
|
+
end
|
98
169
|
end
|
99
|
-
|
100
|
-
|
101
|
-
|
170
|
+
dputs "Found an ip"
|
171
|
+
dputs "#{@cloud.name} Launched instance #{@inst[:ip]}"
|
172
|
+
dputs " waiting for it to respond"
|
102
173
|
|
103
174
|
# Try for 10 minutes to pint port 22
|
104
175
|
500.times do |i|
|
105
|
-
|
176
|
+
dprint "."
|
106
177
|
if ping_port(@inst[:ip], 22)
|
107
|
-
|
108
|
-
cloud.started_instance = @inst
|
178
|
+
dputs ""
|
179
|
+
@cloud.started_instance = @inst
|
109
180
|
|
110
|
-
cloud.call_after_launch_instance_callbacks(@inst)
|
181
|
+
@cloud.call_after_launch_instance_callbacks(@inst)
|
111
182
|
block.call(@inst) if block
|
112
|
-
|
113
|
-
cloud.call_after_launch_instance_callbacks(@inst)
|
183
|
+
|
114
184
|
return @inst
|
115
185
|
end
|
116
186
|
sleep(2)
|
@@ -118,14 +188,28 @@ module PoolParty
|
|
118
188
|
raise "Instance not responding at #{inst.ip}"
|
119
189
|
end
|
120
190
|
|
121
|
-
def self.launch_instance!(
|
122
|
-
new(
|
191
|
+
def self.launch_instance!(o={}, &block)
|
192
|
+
new(o, &block).launch_instance!
|
193
|
+
end
|
194
|
+
|
195
|
+
def terminate_youngest_instance!(o={})
|
196
|
+
terminate_instance!(:instance_id => nodes(:status => "running").last.instance_id)
|
123
197
|
end
|
124
198
|
|
125
199
|
# Called after an instance is launched
|
126
200
|
def after_launch_instance(instance=nil)
|
127
201
|
puts "after_launch_instance in remoter_base"
|
128
202
|
end
|
203
|
+
|
204
|
+
def remoter_base_options(n=nil)
|
205
|
+
if n.nil?
|
206
|
+
dsl_options[:remoter_base_options]
|
207
|
+
else
|
208
|
+
dsl_options[:remoter_base_options] = remote_base.dsl_options.choose do |k,v|
|
209
|
+
v && (v.respond_to?(:empty) ? !v.empty?: true)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
129
213
|
|
130
214
|
#TODO: Remove
|
131
215
|
# def self.when_instance_is_responding(inst, &block)
|
@@ -138,17 +222,17 @@ module PoolParty
|
|
138
222
|
# def when_instance_is_responding(inst, &block);self.class.when_instance_is_responding;end
|
139
223
|
|
140
224
|
# TODO: BAD FORM, already defined in connections.rb. Fix this, ASAP
|
141
|
-
def self.ping_port(host, port=22, retry_times=400)
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
end
|
225
|
+
# def self.ping_port(host, port=22, retry_times=400)
|
226
|
+
# connected = false
|
227
|
+
# retry_times.times do |i|
|
228
|
+
# begin
|
229
|
+
# break if connected = TCPSocket.new(host, port).is_a?(TCPSocket)
|
230
|
+
# rescue Exception => e
|
231
|
+
# sleep(2)
|
232
|
+
# end
|
233
|
+
# end
|
234
|
+
# connected
|
235
|
+
# end
|
152
236
|
|
153
237
|
# After launch callback
|
154
238
|
# This is called after a new instance is launched
|
@@ -160,6 +244,14 @@ module PoolParty
|
|
160
244
|
def before_shutdown
|
161
245
|
end
|
162
246
|
|
247
|
+
def to_s
|
248
|
+
self.class.name
|
249
|
+
end
|
250
|
+
|
251
|
+
def to_hash
|
252
|
+
dsl_options
|
253
|
+
end
|
254
|
+
|
163
255
|
end
|
164
256
|
|
165
257
|
end
|
@@ -25,7 +25,7 @@ end
|
|
25
25
|
|
26
26
|
class String
|
27
27
|
def convert_from_ec2_to_ip
|
28
|
-
self.
|
28
|
+
self.match(/-(\d+-\d+-\d+-\d+)\./) ? $1.gsub(/-/, '.') : self
|
29
29
|
end
|
30
30
|
def parse_datetime
|
31
31
|
DateTime.parse( self.chomp ) rescue self
|
@@ -35,95 +35,130 @@ end
|
|
35
35
|
module PoolParty
|
36
36
|
module Remote
|
37
37
|
class Ec2 < Remote::RemoterBase
|
38
|
+
require "#{::File.dirname(__FILE__)}/ec2_remote_instance"
|
39
|
+
|
40
|
+
dsl_methods :elastic_ips, # An array of the elastic ips
|
41
|
+
:ebs_volume_id # The volume id of an ebs volume
|
38
42
|
|
39
43
|
default_options({
|
40
|
-
:image_id
|
44
|
+
:image_id => 'ami-bf5eb9d6',
|
45
|
+
:ami => 'ami-bf5eb9d6', #Deprecated, but here for backwards compatability
|
41
46
|
# :key_name => ::File.basename(keypair.is_a?(String) ? keypair : keypair.full_filepath),
|
42
|
-
:instance_type
|
43
|
-
:addressing_type
|
44
|
-
:
|
45
|
-
:
|
47
|
+
:instance_type => 'm1.small', # or 'm1.large', 'm1.xlarge', 'c1.medium', or 'c1.xlarge'
|
48
|
+
:addressing_type => "public",
|
49
|
+
:availability_zone => "us-east-1a",
|
50
|
+
:access_key => ENV['AWS_ACCESS_KEY'],
|
51
|
+
:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'],
|
52
|
+
:security_group => ["default"],
|
53
|
+
:keypair_name => nil,
|
54
|
+
:key_name => nil
|
46
55
|
})
|
56
|
+
|
57
|
+
# alias to image_id
|
58
|
+
# def ami(n=nil)
|
59
|
+
# if n.nil?
|
60
|
+
# image_id
|
61
|
+
# else
|
62
|
+
# image_id n
|
63
|
+
# end
|
64
|
+
# end
|
47
65
|
|
48
66
|
# Requires a hash of options
|
49
|
-
def self.launch_new_instance!(
|
50
|
-
new(
|
67
|
+
def self.launch_new_instance!(o)
|
68
|
+
new(o).launch_new_instance!
|
51
69
|
end
|
52
70
|
|
53
71
|
# TODO: Fix the key_name issue
|
54
72
|
# Start a new instance with the given options
|
55
73
|
def launch_new_instance!(o={})
|
56
|
-
|
57
|
-
o
|
74
|
+
set_vars_from_options o
|
75
|
+
keypair_name ||= o[:keypair_name] || keypair || (clouds[o[:cloud_name]].keypair.basename if o[:cloud_name])
|
76
|
+
raise "You must pass a keypair to launch an instance, or else you will not be able to login. options = #{o.inspect}" if !keypair_name
|
77
|
+
o.merge!( dsl_options.merge(:key_name=>keypair_name, :group_id => security_group) )
|
58
78
|
instance = ec2(o).run_instances(o)
|
79
|
+
|
59
80
|
begin
|
60
|
-
h = EC2ResponseObject.
|
81
|
+
h = EC2ResponseObject.describe_instance(instance)
|
61
82
|
#h = instance.instancesSet.item.first
|
62
83
|
rescue Exception => e
|
63
|
-
|
84
|
+
vputs "There was an error:\n\t#{e.inspect}"
|
85
|
+
h = EC2ResponseObject.describe_instance(instance) rescue instance
|
64
86
|
# h = instance
|
65
87
|
end
|
66
|
-
h
|
88
|
+
Ec2RemoteInstance.new(h)
|
67
89
|
end
|
90
|
+
|
68
91
|
# Terminate an instance by id
|
69
92
|
def terminate_instance!(o={})
|
70
93
|
ec2(o).terminate_instances(:instance_id => o[:instance_id])
|
71
94
|
end
|
95
|
+
|
72
96
|
# Describe an instance's status
|
73
97
|
def describe_instance(o={})
|
74
|
-
return describe_instances.first if o[:instance_id].nil?
|
98
|
+
return describe_instances.first if o.empty? || o[:instance_id].nil?
|
75
99
|
describe_instances.detect {|a| a[:name] == o[:instance_id] || a[:ip] == o[:instance_id] || a[:instance_id] == o[:instance_id] }
|
76
100
|
end
|
101
|
+
|
77
102
|
def describe_instances(o={})
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
id += 1
|
83
|
-
else
|
84
|
-
inst_name = "#{h[:status]}_node#{i}"
|
85
|
-
end
|
86
|
-
h.merge!({
|
87
|
-
:name => inst_name,
|
88
|
-
:hostname => h[:ip],
|
89
|
-
:ip => h[:ip].convert_from_ec2_to_ip,
|
90
|
-
:index => i, #TODO MF get the instance id from the aws result instead
|
91
|
-
:launching_time => (h[:launching_time])
|
92
|
-
})
|
93
|
-
end.compact.sort {|a,b| a[:index] <=> b[:index] }
|
103
|
+
ec2_instants = EC2ResponseObject.describe_instances(ec2.describe_instances)
|
104
|
+
insts = ec2_instants.select_with_hash(o) if !o.empty?
|
105
|
+
ec2_remote_instances = ec2_instants.collect{|i| Ec2RemoteInstance.new(i)}
|
106
|
+
ec2_remote_instances.sort {|a,b| a[:ami_launch_index] <=> b[:ami_launch_index] }
|
94
107
|
end
|
95
108
|
|
109
|
+
# TODO: Clean up this method and remove hostnames
|
110
|
+
# def describe_instances(o={})
|
111
|
+
# id = 0
|
112
|
+
# set_vars_from_options(dsl_options.merge(o))
|
113
|
+
# get_instances_description(dsl_options).each_with_index do |h,i|
|
114
|
+
# if h[:status] == "running"
|
115
|
+
# inst_name = id == 0 ? "master" : "node#{id}"
|
116
|
+
# id += 1
|
117
|
+
# else
|
118
|
+
# inst_name = "#{h[:status]}_node#{i}"
|
119
|
+
# end
|
120
|
+
# h.merge!({
|
121
|
+
# :name => inst_name,
|
122
|
+
# :hostname => h[:ip],
|
123
|
+
# :ip => h[:ip].convert_from_ec2_to_ip,
|
124
|
+
# # :internal_ip => h.ip
|
125
|
+
# :index => i, #TODO get the instance id from the aws result instead
|
126
|
+
# :launching_time => (h[:launching_time])
|
127
|
+
# })
|
128
|
+
# end.compact.sort {|a,b| a[:index] <=> b[:index] }
|
129
|
+
# end
|
130
|
+
|
96
131
|
# ===================================
|
97
132
|
# = Ec2 Specific methods below here =
|
98
133
|
# ===================================
|
99
134
|
|
100
135
|
# return or create a new base EC2 connection object that will actually connect to ec2
|
101
136
|
def ec2(o={})
|
102
|
-
@ec2 ||= EC2::Base.new( :access_key_id => o[:access_key],
|
103
|
-
:secret_access_key => o[:secret_access_key]
|
137
|
+
@ec2 ||= EC2::Base.new( :access_key_id => o[:access_key] || get_access_key,
|
138
|
+
:secret_access_key => o[:secret_access_key] || get_secret_access_key
|
104
139
|
)
|
105
140
|
end
|
106
141
|
def self.ec2(o)
|
107
|
-
@ec2 ||=
|
142
|
+
@ec2 ||= EC2::Base.new( :access_key_id => o[:access_key],
|
143
|
+
:secret_access_key => o[:secret_access_key]
|
144
|
+
)
|
108
145
|
end
|
109
146
|
|
110
147
|
# Get the ec2 description for the response in a hash format
|
111
148
|
def get_instances_description(o={})
|
112
149
|
#TODO: only use keypair.full_filepath
|
113
|
-
|
114
|
-
|
150
|
+
set_vars_from_options dsl_options.merge(o)
|
151
|
+
key_hash = {:keypair => self.keypair_name}
|
152
|
+
out = EC2ResponseObject.get_descriptions(ec2(dsl_options).describe_instances)
|
153
|
+
out = keypair_name ? out.select_with_hash(key_hash) : out
|
115
154
|
end
|
116
155
|
def get_descriptions(o={})
|
117
156
|
self.class.get_descriptions(o)
|
118
157
|
end
|
119
|
-
|
120
|
-
def keypair
|
121
|
-
cloud.keypair
|
122
|
-
end
|
123
|
-
|
158
|
+
|
124
159
|
# Class method helpers
|
125
160
|
def aws_keys
|
126
|
-
unless @access_key && @secret_access_key
|
161
|
+
unless @access_key && @secret_access_key
|
127
162
|
aws_keys = {}
|
128
163
|
aws_keys = YAML::load( File.open('/etc/poolparty/aws_keys.yml') ) rescue 'No aws_keys.yml file. Will try to use enviornment variables'
|
129
164
|
@access_key ||= aws_keys[:access_key] || ENV['AMAZON_ACCESS_KEY_ID'] || ENV['AWS_ACCESS_KEY']
|
@@ -137,16 +172,6 @@ module PoolParty
|
|
137
172
|
associate_address(inst)
|
138
173
|
end
|
139
174
|
end
|
140
|
-
|
141
|
-
# Attach a volume to the instance
|
142
|
-
# DEPRECATE this relies on master. master will be removed in next major release. This method will be in ec2_remote_instance instead, or require an instance id
|
143
|
-
def attach_volume(instance=nil)
|
144
|
-
if ebs_volume_id
|
145
|
-
vputs "Attaching volume #{ebs_volume_id} to the master at #{ebs_volume_device}"
|
146
|
-
instance = master
|
147
|
-
ec2.attach_volume(:volume_id => ebs_volume_id, :instance_id => instance.instance_id, :device => ebs_volume_device) if ebs_volume_id && ebs_volume_mount_point
|
148
|
-
end
|
149
|
-
end
|
150
175
|
|
151
176
|
# Associate an address with the instance using ec2
|
152
177
|
# Get the next_unused_elastic_ip
|
@@ -156,6 +181,16 @@ module PoolParty
|
|
156
181
|
if ip = next_unused_elastic_ip
|
157
182
|
vputs "Associating #{instance.instance_id} with #{ip}"
|
158
183
|
ec2.associate_address(:instance_id => instance.instance_id, :public_ip => ip)
|
184
|
+
|
185
|
+
# Try for 10 minutes to pint port 22
|
186
|
+
500.times do |i|
|
187
|
+
dprint "."
|
188
|
+
if ping_port(ip, 22)
|
189
|
+
instance[:ip] = ip
|
190
|
+
return true
|
191
|
+
end
|
192
|
+
sleep(2)
|
193
|
+
end
|
159
194
|
end
|
160
195
|
end
|
161
196
|
|
@@ -167,21 +202,23 @@ module PoolParty
|
|
167
202
|
# intersection of the unused ips and those, find the first one available
|
168
203
|
# and return that, otherwise, return the first elastic ip available
|
169
204
|
def next_unused_elastic_ip
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
205
|
+
if elastic_ips.empty?
|
206
|
+
nil
|
207
|
+
else
|
208
|
+
# [{"instanceId"=>nil, "publicIp"=>"174.129.212.93"}, {"instanceId"=>nil, "publicIp"=>"174.129.212.94"}]
|
209
|
+
if addressesSet = ec2(dsl_options).describe_addresses(:public_ip => elastic_ips)["addressesSet"]
|
210
|
+
begin
|
211
|
+
empty_addresses = addressesSet["item"].select {|i| i["instanceId"].nil? }
|
212
|
+
ips = empty_addresses.map {|addr| addr["publicIp"]}
|
213
|
+
if elastic_ips
|
214
|
+
ips_to_use = elastic_ips & ips
|
215
|
+
ips_to_use.first
|
216
|
+
end
|
217
|
+
rescue Exception => e
|
218
|
+
puts "Error: #{e}"
|
219
|
+
nil
|
180
220
|
end
|
181
|
-
|
182
|
-
puts "Error: #{e}"
|
183
|
-
nil
|
184
|
-
end
|
221
|
+
end
|
185
222
|
end
|
186
223
|
end
|
187
224
|
|
@@ -217,7 +254,7 @@ module PoolParty
|
|
217
254
|
end
|
218
255
|
|
219
256
|
def custom_minimum_runnable_options
|
220
|
-
[:ami, :
|
257
|
+
[:ami, :availability_zone, :security_group]
|
221
258
|
end
|
222
259
|
|
223
260
|
# Hook
|
@@ -237,10 +274,21 @@ module PoolParty
|
|
237
274
|
# "/usr/bin/gem install --no-ri --no-rdoc amazon-ec2.gem 2>&1"
|
238
275
|
]
|
239
276
|
end
|
240
|
-
|
241
|
-
def
|
242
|
-
|
243
|
-
|
277
|
+
|
278
|
+
def get_access_key(n=nil)
|
279
|
+
if n.nil?
|
280
|
+
dsl_options[:access_key] ||= Default.access_key
|
281
|
+
else
|
282
|
+
self.access_key = n
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
def get_secret_access_key(n=nil)
|
287
|
+
if n.nil?
|
288
|
+
dsl_options[:secret_access_key] ||= Default.secret_access_key
|
289
|
+
else
|
290
|
+
self.secret_access_key = n
|
291
|
+
end
|
244
292
|
end
|
245
293
|
|
246
294
|
def reset_base!
|
@@ -249,4 +297,4 @@ module PoolParty
|
|
249
297
|
end
|
250
298
|
|
251
299
|
end
|
252
|
-
end
|
300
|
+
end
|