auser-poolparty 0.2.44 → 0.2.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Manifest.txt +3 -1
- data/bin/cloud +11 -21
- data/bin/cloud-add-keypair +18 -13
- data/bin/cloud-configure +3 -11
- data/bin/cloud-contract +7 -12
- data/bin/cloud-ensure-provisioning +2 -11
- data/bin/cloud-expand +3 -10
- data/bin/cloud-handle-load +3 -9
- data/bin/cloud-list +3 -9
- data/bin/cloud-maintain +2 -9
- data/bin/cloud-osxcopy +3 -9
- data/bin/cloud-provision +4 -9
- data/bin/cloud-refresh +2 -9
- data/bin/cloud-run +3 -4
- data/bin/cloud-ssh +3 -2
- data/bin/cloud-start +7 -13
- data/bin/cloud-terminate +4 -7
- data/bin/pool +11 -12
- data/bin/pool-describe +0 -1
- data/bin/pool-list +3 -9
- data/bin/pool-start +3 -10
- data/generators/poolspec/USAGE +2 -2
- data/generators/poolspec/poolspec_generator.rb +2 -1
- data/generators/poolspec/templates/pool_spec_template.erb +3 -2
- data/lib/erlang/messenger/useful_snippets +2 -2
- data/lib/poolparty/aska/aska.rb +5 -6
- data/lib/poolparty/base_packages/haproxy.rb +2 -2
- data/lib/poolparty/core/string.rb +1 -1
- data/lib/poolparty/exceptions/CloudNotFoundException.rb +7 -0
- data/lib/poolparty/helpers/binary.rb +1 -1
- data/lib/poolparty/helpers/optioner.rb +34 -12
- data/lib/poolparty/modules/cloud_dsl.rb +13 -0
- data/lib/poolparty/net/messenger.rb +1 -1
- data/lib/poolparty/net/remote_bases/ec2.rb +162 -145
- data/lib/poolparty/net/remoter.rb +8 -4
- data/lib/poolparty/plugins/git.rb +5 -1
- data/lib/poolparty/pool/base.rb +1 -1
- data/lib/poolparty/pool/cloud.rb +7 -2
- data/lib/poolparty/pool/resource.rb +1 -1
- data/lib/poolparty/pool/resources/mount.rb +22 -0
- data/lib/poolparty/version.rb +1 -1
- data/poolparty.gemspec +5 -4
- data/spec/poolparty/modules/configurable_spec.rb +4 -1
- data/spec/poolparty/pool/base_spec.rb +2 -2
- data/spec/poolparty/pool/plugin_model_spec.rb +2 -3
- data/website/index.html +1 -1
- metadata +5 -4
- data/bin/pool-provision +0 -34
data/bin/pool
CHANGED
@@ -3,19 +3,18 @@ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
|
3
3
|
require "poolparty"
|
4
4
|
require "poolpartycl"
|
5
5
|
|
6
|
-
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
name = ARGV.select {|arg| arg if Binary.available_binaries_for("pool").include?(arg) }.first
|
7
|
+
# If the options include -h and they don't include a valid command, then we can just pass the
|
8
|
+
# original options back, but if they do contain a binary, we don't want -h getting through to
|
9
|
+
# these options, so we'll strip it if it's included
|
10
|
+
DUP_ARG = ARGV.dup
|
11
|
+
new_args = DUP_ARG.reject {|arg| Binary.available_binaries_for("pool").include?(arg) }.empty? ? ARGV : (name ? (DUP_ARG.delete("-h"); DUP_ARG) : DUP_ARG)
|
10
12
|
|
11
|
-
|
13
|
+
# Let's make sure if no command is passed in that we show the help message
|
14
|
+
new_args.push("-h") unless name
|
12
15
|
|
13
|
-
#
|
14
|
-
|
15
|
-
puts "Usage: pool <specfile> <action> <options>"
|
16
|
-
puts "Pool actions:"
|
17
|
-
puts Binary.list_binaries_for("pool")
|
18
|
-
exit
|
16
|
+
o = PoolParty::Optioner.new(new_args, {:extra_help => "\nPool actions\n#{Binary.list_binaries_for("pool")}\n\n", :abstract => true}) do |opts, optioner|
|
17
|
+
opts.on('-n poolname', '--name name', 'Address this pool') { |c| optioner.poolname c }
|
19
18
|
end
|
20
19
|
|
21
20
|
program_name = "#{File.basename($0)}-#{name}"
|
@@ -27,5 +26,5 @@ command_line = "#{program_location}"
|
|
27
26
|
if Binary.available_binaries_for("pool").include?(name)
|
28
27
|
system command_line, *ARGV
|
29
28
|
else
|
30
|
-
puts "Unknown poolparty binary: #{
|
29
|
+
puts "Unknown poolparty binary: #{name}"
|
31
30
|
end
|
data/bin/pool-describe
CHANGED
data/bin/pool-list
CHANGED
@@ -2,22 +2,16 @@
|
|
2
2
|
$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
3
|
require "poolparty"
|
4
4
|
require "poolpartycl"
|
5
|
+
|
5
6
|
o = PoolParty::Optioner.new(ARGV) do |opts, optioner|
|
6
7
|
opts.on('-f [remote|local]', '--from [remote|local]', 'Remote or local (default: local)') { |o| optioner.location o }
|
7
8
|
opts.on('-r', '--remote', 'Remote listing') { optioner.location "remote" }
|
8
9
|
opts.on('-l', '--local', 'Local listing') { optioner.location "local" }
|
9
10
|
opts.on('-n name', '--name name', 'Listing for pool name') { |p| optioner.poolname p }
|
10
11
|
end
|
11
|
-
load_pool(o.spec || Binary.get_existing_spec_location)
|
12
|
-
|
13
|
-
@location = o.location ? o.location : "remote"
|
14
|
-
|
15
|
-
include Remote
|
16
|
-
|
17
|
-
@pools = o.poolname ? [pool(o.poolname.downcase.to_sym)] : pools
|
18
12
|
|
19
|
-
|
20
|
-
with_pool(pool
|
13
|
+
o.loaded_pools.each do |pool|
|
14
|
+
with_pool(pool) do
|
21
15
|
puts header("Listing pool #{name}")
|
22
16
|
clouds.each do |name, cloud|
|
23
17
|
puts subheader("Cloud: #{name}")
|
data/bin/pool-start
CHANGED
@@ -2,21 +2,14 @@
|
|
2
2
|
$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
3
|
require "poolparty"
|
4
4
|
require "poolpartycl"
|
5
|
+
|
5
6
|
o = PoolParty::Optioner.new(ARGV) do |opts, optioner|
|
6
7
|
opts.on('-p poolname', '--pool name', 'Start pool by this name') { |p| optioner.poolname p }
|
7
8
|
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
@testing = o.testing
|
12
|
-
|
13
|
-
include Remote
|
14
|
-
|
15
|
-
@pools = o.poolname ? [pool(o.poolname.downcase.to_sym)] : pools
|
16
|
-
|
17
|
-
@pools.each do |name, pl|
|
10
|
+
o.loaded_pools.each do |pl|
|
18
11
|
|
19
|
-
with_pool(pl
|
12
|
+
with_pool(pl) do
|
20
13
|
|
21
14
|
puts header("Starting pool")
|
22
15
|
clouds.each do |name, cloud|
|
data/generators/poolspec/USAGE
CHANGED
@@ -21,7 +21,7 @@ class PoolspecGenerator < RubiGen::Base
|
|
21
21
|
m.directory ''
|
22
22
|
BASEDIRS.each { |path| m.directory path }
|
23
23
|
|
24
|
-
m.template "pool_spec_template.erb", "
|
24
|
+
m.template "pool_spec_template.erb", "pool.spec"
|
25
25
|
# Create stubs
|
26
26
|
# m.template "template.rb", "some_file_after_erb.rb"
|
27
27
|
# m.template_copy_each ["template.rb", "template2.rb"]
|
@@ -61,5 +61,6 @@ EOS
|
|
61
61
|
# Installation skeleton. Intermediate directories are automatically
|
62
62
|
# created so don't sweat their absence here.
|
63
63
|
BASEDIRS = %w(
|
64
|
+
plugins
|
64
65
|
)
|
65
66
|
end
|
@@ -6,10 +6,10 @@
|
|
6
6
|
% erl -pa ./ebin -kernel inet_dist_listen_min 7000 inet_dist_listen_max 7050 -setcookie poolparty -boot pm_node_rel-0.1 -sname node1
|
7
7
|
|
8
8
|
% Starting the client on the master
|
9
|
-
% erl -pa /var/lib/gems/1.8/gems/poolparty-0.2.
|
9
|
+
% erl -pa /var/lib/gems/1.8/gems/poolparty-0.2.44/lib/erlang/messenger/ebin -kernel inet_dist_listen_min 7000 inet_dist_listen_max 7050 -sname client -setcookie poolparty -run pm_client start
|
10
10
|
|
11
11
|
% Get the load
|
12
|
-
% erl -pa /var/lib/gems/1.8/gems/poolparty-0.2.
|
12
|
+
% erl -pa /var/lib/gems/1.8/gems/poolparty-0.2.44/lib/erlang/messenger/ebin -kernel inet_dist_listen_min 7000 inet_dist_listen_max 7050 -sname client -setcookie poolparty -run pm_client start -run pm_client get_load cpu -run erlang init stop
|
13
13
|
|
14
14
|
% cd /var/poolparty && gem uninstall poolparty && wget http://github.com/auser/poolparty/tree/master%2Fpkg%2Fpoolparty-latest.gem?raw=true -O poolparty-latest.gem 2>&1 && gem install --no-ri --no-rdoc poolparty-latest.gem
|
15
15
|
|
data/lib/poolparty/aska/aska.rb
CHANGED
@@ -54,7 +54,7 @@ module Aska
|
|
54
54
|
def valid_rules?(name=:rules)
|
55
55
|
self.class.look_up_rules(name).reject {|rule| valid_rule?(rule) }.empty?
|
56
56
|
end
|
57
|
-
def
|
57
|
+
def __aska_send_value(m)
|
58
58
|
if respond_to?(m.to_sym)
|
59
59
|
self.send(m.to_sym)
|
60
60
|
else
|
@@ -63,9 +63,8 @@ module Aska
|
|
63
63
|
end
|
64
64
|
def valid_rule?(rule)
|
65
65
|
rule.each do |key,value|
|
66
|
-
begin
|
67
|
-
|
68
|
-
return __aska_aska_stuff(key).send(value[0].to_sym, __aska_get_var(value[1]))
|
66
|
+
begin
|
67
|
+
return __aska_send_value(key).send(value[0].to_sym, __aska_get_var(value[1]))
|
69
68
|
rescue Exception => e
|
70
69
|
return false
|
71
70
|
end
|
@@ -74,10 +73,10 @@ module Aska
|
|
74
73
|
def rules_values
|
75
74
|
returning Array.new do |arr|
|
76
75
|
self.class.defined_rules.each do |name,rule_array|
|
77
|
-
arr << "#{name} : #{
|
76
|
+
arr << "#{name} : #{valid_rules?(name.to_sym)}"
|
78
77
|
rule_array.each do |rule|
|
79
78
|
rule.map do |k,v|
|
80
|
-
arr << " #{k} -> #{
|
79
|
+
arr << " #{k} -> #{__aska_send_value(k)} (#{v[0]} #{v[1]})"
|
81
80
|
end
|
82
81
|
end
|
83
82
|
end
|
@@ -12,7 +12,7 @@ module PoolParty
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# Template variables
|
15
|
-
has_variable(:name => "name_haproxy", :value => "#{cloud.name}")
|
15
|
+
has_variable(:name => "name_haproxy", :value => "#{cloud.name}")
|
16
16
|
has_variable(:name => "nodenames_haproxy", :value => "generate('/usr/bin/env', '/var/lib/gems/1.8/bin/server-list-active', '-c', 'name')")
|
17
17
|
has_variable(:name => "node_ips_haproxy", :value => "generate('/usr/bin/env', '/var/lib/gems/1.8/bin/server-list-active', '-c', 'ip')")
|
18
18
|
|
@@ -34,7 +34,7 @@ module PoolParty
|
|
34
34
|
has_remotefile(:name => "/etc/haproxy.cfg") do
|
35
35
|
mode 644
|
36
36
|
requires get_package("haproxy")
|
37
|
-
notify
|
37
|
+
notify get_service("haproxy")
|
38
38
|
template File.join(File.dirname(__FILE__), "..", "templates/haproxy.conf")
|
39
39
|
end
|
40
40
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'optparse'
|
2
|
+
require "poolparty"
|
3
|
+
require "poolpartycl"
|
2
4
|
require 'rdoc/usage'
|
3
5
|
require 'ostruct'
|
4
6
|
require 'date'
|
@@ -11,9 +13,12 @@ module PoolParty
|
|
11
13
|
def initialize(args=[], opts={}, &block)
|
12
14
|
@arguments = parse_args(args)
|
13
15
|
@parse_options = opts[:parse_options] ? opts[:parse_options] : true
|
16
|
+
@extra_help = opts.has_key?(:extra_help) ? opts[:extra_help] : ""
|
17
|
+
@abstract = opts[:abstract] ? opts[:abstract] : false
|
18
|
+
@command = opts[:command] ? opts[:command] : false
|
14
19
|
|
15
|
-
set_default_options
|
16
20
|
parse_options(&block) if @parse_options
|
21
|
+
set_default_options
|
17
22
|
self
|
18
23
|
end
|
19
24
|
|
@@ -26,38 +31,55 @@ module PoolParty
|
|
26
31
|
end
|
27
32
|
|
28
33
|
def set_default_options
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
@options[:version] = PoolParty::VERSION::STRING
|
34
|
+
self.verbose false
|
35
|
+
self.quiet false
|
36
|
+
self.version PoolParty::VERSION::STRING
|
33
37
|
end
|
34
38
|
|
35
39
|
def parse_options(&blk)
|
40
|
+
progname = $0.include?("-") ? "#{::File.basename($0[/(\w+)-/, 1])} #{::File.basename($0[/-(.*)/, 1])}" : ::File.basename($0)
|
36
41
|
opts = OptionParser.new
|
37
|
-
opts.banner = "Usage:
|
42
|
+
opts.banner = "Usage: #{progname} #{@abstract ? "[command] " : ""}[options]"
|
38
43
|
|
39
44
|
opts.separator ""
|
40
45
|
opts.separator "Options:"
|
41
46
|
|
42
47
|
opts.on('-V', '--version', 'Display the version') { output_version ; exit 0 }
|
43
|
-
opts.on('-v', '--verbose', 'Be verbose') {
|
48
|
+
opts.on('-v', '--verbose', 'Be verbose') { self.verbose true }
|
44
49
|
opts.on('-s [file]', '--spec-file [file]', 'Set the spec file') { |file| self.spec file }
|
45
50
|
opts.on('-t', '--test', 'Testing mode') { self.testing true }
|
46
51
|
|
47
52
|
blk.call(opts, self) if blk
|
48
53
|
|
49
|
-
|
50
|
-
|
51
|
-
|
54
|
+
unless @abstract
|
55
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
56
|
+
puts opts
|
57
|
+
puts @extra_help
|
58
|
+
exit
|
59
|
+
end
|
52
60
|
end
|
53
61
|
|
54
62
|
opts.parse(@arguments.dup)
|
55
63
|
|
56
|
-
process_options
|
64
|
+
process_options
|
57
65
|
output_options if verbose
|
66
|
+
self.loaded_pool load_pool(self.spec || Binary.get_existing_spec_location)
|
67
|
+
|
68
|
+
self.loaded_clouds extract_cloud_from_options(self)
|
69
|
+
self.loaded_pools extract_pool_from_options(self)
|
70
|
+
|
71
|
+
reject_junk_options!
|
72
|
+
raise CloudNotFoundException.new("Please specify your cloud with -s, move it to ./pool.spec or in your POOL_SPEC environment variable") unless loaded_clouds && !loaded_clouds.empty?
|
73
|
+
loaded_clouds.each do |cl|
|
74
|
+
cl.configure(self.options)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
def reject_junk_options!
|
78
|
+
%w(loaded_pool cloudname).each do |opt|
|
79
|
+
@options.delete(opt.to_sym)
|
80
|
+
end
|
58
81
|
end
|
59
82
|
def process_options
|
60
|
-
@options[:verbose] = false if @options[:quiet]
|
61
83
|
end
|
62
84
|
|
63
85
|
def output_version
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module PoolParty
|
2
|
+
module CloudDsl
|
3
|
+
|
4
|
+
def mount_ebs_volume_at(id="", loc="/data")
|
5
|
+
ebs_volume_id id
|
6
|
+
ebs_volume_mount_point loc
|
7
|
+
ebs_volume_device "/dev/#{id.sanitize}"
|
8
|
+
has_directory(:name => loc)
|
9
|
+
has_mount(:name => loc, :device => ebs_volume_device)
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -16,7 +16,7 @@ module PoolParty
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.messenger_send!(cmd="", testing=false)
|
19
|
-
command = Messenger.erl_command("client#{Time.now.to_i}", "-s pm_client -run pm_client #{cmd} -s erlang halt -noshell")
|
19
|
+
command = Messenger.erl_command("client#{Time.now.to_i}", "-hidden -s pm_client -run pm_client #{cmd} -s erlang halt -noshell")
|
20
20
|
testing ? command : %x[#{command}]
|
21
21
|
end
|
22
22
|
|
@@ -1,160 +1,177 @@
|
|
1
|
-
|
2
|
-
require 'EC2'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
begin
|
2
|
+
require 'EC2'
|
3
|
+
class String
|
4
|
+
def convert_from_ec2_to_ip
|
5
|
+
self.gsub(/.compute-1.amazonaws.com*/, '').gsub(/ec2-/, '').gsub(/-/, '.')
|
6
|
+
end
|
7
7
|
end
|
8
|
-
|
9
|
-
module
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
8
|
+
module PoolParty
|
9
|
+
module Ec2
|
10
|
+
def launch_new_instance!(num=1)
|
11
|
+
instance = ec2.run_instances(
|
12
|
+
:image_id => (ami || Base.ami),
|
13
|
+
:user_data => "",
|
14
|
+
:minCount => 1,
|
15
|
+
:maxCount => num,
|
16
|
+
:key_name => (keypair || Base.keypair),
|
17
|
+
:availability_zone => nil,
|
18
|
+
:size => "#{size || Base.size}")
|
19
|
+
begin
|
20
|
+
h = EC2ResponseObject.get_hash_from_response(instance)
|
21
|
+
h = instance.instancesSet.item.first
|
22
|
+
rescue Exception => e
|
23
|
+
h = instance
|
24
|
+
end
|
25
|
+
h
|
25
26
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
describe_instances
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
27
|
+
# Terminate an instance by id
|
28
|
+
def terminate_instance!(instance_id=nil)
|
29
|
+
ec2.terminate_instances(:instance_id => instance_id)
|
30
|
+
end
|
31
|
+
# Describe an instance's status
|
32
|
+
def describe_instance(id=nil)
|
33
|
+
describe_instances.select {|a| a[:name] == id}[0] rescue nil
|
34
|
+
end
|
35
|
+
def describe_instances
|
36
|
+
@id = 0
|
37
|
+
get_instances_description.each_with_index do |h,i|
|
38
|
+
if h[:status] == "running"
|
39
|
+
@name = @id == 0 ? "master" : "node#{@id}"
|
40
|
+
@id += 1
|
41
|
+
else
|
42
|
+
@name = "#{h[:status]}_node#{i}"
|
43
|
+
end
|
44
|
+
h.merge!({
|
45
|
+
:name => @name,
|
46
|
+
:hostname => h[:ip],
|
47
|
+
:ip => h[:ip].convert_from_ec2_to_ip
|
48
|
+
})
|
44
49
|
end
|
45
|
-
h.merge!({
|
46
|
-
:name => @name,
|
47
|
-
:hostname => h[:ip],
|
48
|
-
:ip => h[:ip].convert_from_ec2_to_ip
|
49
|
-
})
|
50
50
|
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
51
|
+
# Get the s3 description for the response in a hash format
|
52
|
+
def get_instances_description
|
53
|
+
EC2ResponseObject.get_descriptions(ec2.describe_instances).sort_by {|a| a[:launching_time]}
|
54
|
+
end
|
55
|
+
|
56
|
+
def after_launch_master(instance=nil)
|
57
|
+
begin
|
58
|
+
when_no_pending_instances do
|
59
|
+
if instance
|
60
|
+
ec2.associate_address(:instance_id => instance.instanceId, :public_ip => set_master_ip_to) if set_master_ip_to
|
61
|
+
ec2.attach_volume(:volume_id => ebs_volume_id, :instance_id => instance.instanceId, :device => ebs_volume_device) if ebs_volume_id && ebs_volume_mount_point
|
62
|
+
end
|
63
|
+
end
|
64
|
+
rescue Exception => e
|
61
65
|
end
|
62
|
-
|
66
|
+
reset_remoter_base!
|
67
|
+
when_all_assigned_ips {wait "2.seconds"}
|
63
68
|
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
69
|
+
|
70
|
+
# Help create a keypair for the cloud
|
71
|
+
# This is a helper to create the keypair and add them to the cloud for you
|
72
|
+
def create_keypair
|
73
|
+
return false unless keypair
|
74
|
+
unless ::File.exists?( new_keypair_path )
|
75
|
+
FileUtils.mkdir_p ::File.dirname( new_keypair_path )
|
76
|
+
vputs "Creating keypair: #{keypair} in #{new_keypair_path}"
|
77
|
+
Kernel.system "ec2-add-keypair #{keypair} > #{new_keypair_path} && chmod 600 #{new_keypair_path}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
# EC2 connections
|
81
|
+
def ec2
|
82
|
+
@ec2 ||= EC2::Base.new( :access_key_id => (access_key || Base.access_key),
|
83
|
+
:secret_access_key => (secret_access_key || Base.secret_access_key)
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Callback
|
88
|
+
def custom_install_tasks_for(o)
|
89
|
+
[
|
90
|
+
"# ec2 installation tasks",
|
91
|
+
"# Set hostname",
|
92
|
+
# "if [ -z $(grep -v '#' /etc/hosts | grep '#{o.name}') ]; then echo \"$(curl http://169.254.169.254/latest/meta-data/public-ipv4) #{o.name}\" >> /etc/hosts; fi",
|
93
|
+
"if [ -z \"$(grep -v '#' /etc/hosts | grep '#{o.name}')\" ]; then echo '127.0.0.1 #{o.name}' >> /etc/hosts; fi",
|
94
|
+
"hostname #{o.name}",
|
95
|
+
"echo #{o.name} > /etc/hostname",
|
96
|
+
"cd /var/poolparty && wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-ec2.gem 2>&1 && gem install -y --no-ri --no-rdoc amazon-ec2.gem 2>&1"
|
97
|
+
]
|
98
|
+
end
|
99
|
+
|
100
|
+
def custom_configure_tasks_for(o)
|
101
|
+
[
|
102
|
+
"# ec2 configuration"
|
103
|
+
]
|
104
|
+
end
|
105
|
+
|
106
|
+
def reset_base!
|
107
|
+
@describe_instances = @cached_descriptions = nil
|
75
108
|
end
|
76
109
|
end
|
77
|
-
|
78
|
-
def ec2
|
79
|
-
@ec2 ||= EC2::Base.new( :access_key_id => (access_key || Base.access_key),
|
80
|
-
:secret_access_key => (secret_access_key || Base.secret_access_key)
|
81
|
-
)
|
82
|
-
end
|
83
|
-
|
84
|
-
# Callback
|
85
|
-
def custom_install_tasks_for(o)
|
86
|
-
[
|
87
|
-
"# ec2 installation tasks",
|
88
|
-
"# Set hostname",
|
89
|
-
# "if [ -z $(grep -v '#' /etc/hosts | grep '#{o.name}') ]; then echo \"$(curl http://169.254.169.254/latest/meta-data/public-ipv4) #{o.name}\" >> /etc/hosts; fi",
|
90
|
-
"if [ -z \"$(grep -v '#' /etc/hosts | grep '#{o.name}')\" ]; then echo '127.0.0.1 #{o.name}' >> /etc/hosts; fi",
|
91
|
-
"hostname #{o.name}",
|
92
|
-
"echo #{o.name} > /etc/hostname",
|
93
|
-
"cd /var/poolparty && wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-ec2.gem 2>&1 && gem install -y --no-ri --no-rdoc amazon-ec2.gem 2>&1"
|
94
|
-
]
|
95
|
-
end
|
96
|
-
|
97
|
-
def custom_configure_tasks_for(o)
|
98
|
-
[
|
99
|
-
"# ec2 configuration"
|
100
|
-
]
|
101
|
-
end
|
102
|
-
|
103
|
-
def reset_base!
|
104
|
-
@describe_instances = @cached_descriptions = nil
|
105
|
-
end
|
110
|
+
register_remote_base :Ec2
|
106
111
|
end
|
107
|
-
register_remote_base :Ec2
|
108
|
-
end
|
109
112
|
|
110
|
-
# Provides a simple class to wrap around the amazon responses
|
111
|
-
class EC2ResponseObject
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
113
|
+
# Provides a simple class to wrap around the amazon responses
|
114
|
+
class EC2ResponseObject
|
115
|
+
def self.get_descriptions(resp)
|
116
|
+
rs = get_response_from(resp)
|
117
|
+
|
118
|
+
# puts rs.methods.sort - rs.ancestors.methods
|
119
|
+
out = begin
|
120
|
+
if rs.respond_to?(:instancesSet)
|
121
|
+
[EC2ResponseObject.get_hash_from_response(rs.instancesSet.item)]
|
122
|
+
else
|
123
|
+
rs.collect {|r|
|
124
|
+
if r.instancesSet.item.class == Array
|
125
|
+
r.instancesSet.item.map {|t| EC2ResponseObject.get_hash_from_response(t)}
|
126
|
+
else
|
127
|
+
[EC2ResponseObject.get_hash_from_response(r.instancesSet.item)]
|
128
|
+
end
|
129
|
+
}.flatten.reject {|a| a.nil? }
|
130
|
+
end
|
131
|
+
rescue Exception => e
|
132
|
+
# Really weird bug with amazon's ec2 gem
|
133
|
+
rs.collect {|r| EC2ResponseObject.get_hash_from_response(r)}.reject {|a| a.nil? } rescue []
|
134
|
+
end
|
135
|
+
|
136
|
+
out
|
137
|
+
end
|
138
|
+
def self.get_response_from(resp)
|
139
|
+
begin
|
140
|
+
rs = resp.reservationSet.item unless resp.reservationSet.nil?
|
141
|
+
rs ||= resp.DescribeInstancesResponse.reservationSet.item
|
142
|
+
rs ||= rs.respond_to?(:instancesSet) ? rs.instancesSet : rs
|
143
|
+
rs.reject! {|a| a.nil? || a.empty? }
|
144
|
+
rescue Exception => e
|
145
|
+
resp
|
127
146
|
end
|
128
|
-
|
129
|
-
# Really weird bug with amazon's ec2 gem
|
130
|
-
rs.collect {|r| EC2ResponseObject.get_hash_from_response(r)}.reject {|a| a.nil? } rescue []
|
147
|
+
rs
|
131
148
|
end
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
149
|
+
def self.get_hash_from_response(resp)
|
150
|
+
begin
|
151
|
+
{
|
152
|
+
:instance_id => resp.instanceId,
|
153
|
+
:name => resp.instanceId,
|
154
|
+
:ip => resp.dnsName || "not-assigned",
|
155
|
+
:status => resp.instanceState.name,
|
156
|
+
:launching_time => resp.launchTime,
|
157
|
+
:keypair => resp.keyName
|
158
|
+
}
|
159
|
+
rescue Exception => e
|
160
|
+
nil
|
161
|
+
end
|
143
162
|
end
|
144
|
-
rs
|
145
|
-
end
|
146
|
-
def self.get_hash_from_response(resp)
|
147
|
-
begin
|
148
|
-
{
|
149
|
-
:instance_id => resp.instanceId,
|
150
|
-
:name => resp.instanceId,
|
151
|
-
:ip => resp.dnsName || "not-assigned",
|
152
|
-
:status => resp.instanceState.name,
|
153
|
-
:launching_time => resp.launchTime,
|
154
|
-
:keypair => resp.keyName
|
155
|
-
}
|
156
|
-
rescue Exception => e
|
157
|
-
nil
|
158
|
-
end
|
159
163
|
end
|
164
|
+
rescue LoadError
|
165
|
+
puts <<-EOM
|
166
|
+
Error: In order to use ec2, you need to install the amazon-ec2 gem
|
167
|
+
|
168
|
+
Ec2 is the default remoter base for PoolParty. If you intend on using
|
169
|
+
a different remoter base, specify it with:
|
170
|
+
|
171
|
+
using :remoter_name
|
172
|
+
|
173
|
+
in your config file, otherwise, to continue install amazon-ec2 with
|
174
|
+
|
175
|
+
gem install amazon-ec2
|
176
|
+
EOM
|
160
177
|
end
|