auser-poolparty 1.2.4 → 1.2.7
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/VERSION.yml +1 -1
- data/bin/cloud +8 -1
- data/bin/cloud-contract +1 -1
- data/bin/cloud-provision +0 -1
- data/bin/server-cloud-elections +9 -9
- data/bin/server-list-active +10 -17
- data/bin/server-manage-election +4 -5
- data/examples/basic.rb +5 -4
- data/examples/fairchild.rb +1 -1
- data/lib/poolparty.rb +1 -1
- data/lib/poolparty/core/hash.rb +10 -2
- data/lib/poolparty/helpers/optioner.rb +5 -5
- data/lib/poolparty/lite.rb +5 -2
- data/lib/poolparty/modules/cloud_resourcer.rb +12 -5
- data/lib/poolparty/modules/pretty_printer.rb +1 -1
- data/lib/poolparty/monitors/monitor_rack.rb +2 -2
- data/lib/poolparty/monitors/monitors/{time_monitor.rb → clock_monitor.rb} +2 -2
- data/lib/poolparty/monitors/monitors/neighborhood_monitor.rb +8 -5
- data/lib/poolparty/monitors/monitors/stats_monitor.rb +45 -29
- data/lib/poolparty/net/remoter/connections.rb +0 -1
- data/lib/poolparty/net/remoter/interactive.rb +6 -6
- data/lib/poolparty/net/remoter_base.rb +10 -2
- data/lib/poolparty/net/remoter_bases/ec2/ec2.rb +14 -6
- data/lib/poolparty/net/remoter_bases/metavirt/metavirt.rb +1 -1
- data/lib/poolparty/plugins/apache2/apache.rb +16 -8
- data/lib/poolparty/poolparty/cloud.rb +22 -5
- data/lib/poolparty/poolparty/default.rb +21 -15
- data/lib/poolparty/poolparty/key.rb +1 -1
- data/lib/poolparty/poolparty/neighborhoods.rb +15 -4
- data/lib/poolparty/poolparty/pool.rb +1 -1
- data/lib/poolparty/poolparty/resource.rb +1 -0
- data/lib/poolparty/provision/boot_strapper.rb +10 -4
- data/lib/poolparty/provision/dr_configure.rb +9 -9
- data/lib/poolparty/schema.rb +5 -6
- data/lib/poolparty/templates/monitor.ru +1 -0
- data/spec/poolparty/core/ordered_hash_spec.rb +7 -7
- data/spec/poolparty/net/remote_instance_spec.rb +1 -1
- data/spec/poolparty/poolparty/cloud_spec.rb +18 -0
- data/spec/poolparty/poolparty/example_spec.rb +29 -9
- data/spec/poolparty/poolparty/key_spec.rb +1 -1
- data/spec/poolparty/poolparty/neighborhoods_spec.rb +1 -1
- data/tasks/poolparty.rake +2 -0
- data/vendor/gems/dslify/VERSION.yml +4 -0
- data/vendor/gems/dslify/dslify.gemspec +29 -0
- data/vendor/gems/dslify/lib/dslify.rb +1 -1
- data/vendor/gems/dslify/test/dslify_test.rb +82 -13
- data/vendor/gems/git-style-binaries/VERSION.yml +1 -1
- data/vendor/gems/git-style-binaries/doc/poolparty-binaries.screenplay +389 -20
- data/vendor/gems/git-style-binaries/git-style-binaries.gemspec +2 -2
- data/vendor/gems/git-style-binaries/lib/git-style-binary/helpers/name_resolver.rb +2 -2
- data/vendor/gems/git-style-binaries/lib/git-style-binary/parser.rb +2 -2
- metadata +5 -3
data/VERSION.yml
CHANGED
data/bin/cloud
CHANGED
@@ -36,6 +36,13 @@ EOS
|
|
36
36
|
end
|
37
37
|
|
38
38
|
run do |command|
|
39
|
-
|
39
|
+
subcommands = GitStyleBinary.list_subcommands
|
40
|
+
|
41
|
+
puts "Usage: cloud COMMAND [ARGS]
|
42
|
+
|
43
|
+
The cloud subcommands commands are:
|
44
|
+
#{subcommands}
|
45
|
+
|
46
|
+
See 'cloud help COMMAND' for more information on a specific command."
|
40
47
|
end
|
41
48
|
end
|
data/bin/cloud-contract
CHANGED
@@ -23,7 +23,7 @@ EOS
|
|
23
23
|
|
24
24
|
if cld.minimum_instances < cld.nodes(:status => "running").size
|
25
25
|
last_instance_id = cld.nodes(:status => "running").last[:instance_id]
|
26
|
-
cld.remote_base.terminate_instance! cld.
|
26
|
+
cld.remote_base.terminate_instance! cld.dsl_options.merge(:instance_id => last_instance_id)
|
27
27
|
else
|
28
28
|
puts "The cloud #{cld.name} is running minimum instances (#{cld.nodes(:status => "running").size})"
|
29
29
|
end
|
data/bin/cloud-provision
CHANGED
data/bin/server-cloud-elections
CHANGED
@@ -11,27 +11,27 @@ end
|
|
11
11
|
vote_for = o.unflagged_args.shift || "none"
|
12
12
|
|
13
13
|
schema = ::PoolParty.load_cloud_from_json(o.unflagged_args.shift) #TODO: smarter option parser
|
14
|
-
|
15
|
-
remoter_base = PoolParty::Remote.module_eval(remote_base_name)
|
14
|
+
remote_base = PoolParty::Remote.module_eval( schema.options.remoter_base.camelcase )
|
16
15
|
|
17
16
|
o.loaded_clouds.each do |cld|
|
18
17
|
cld.update_from_schema(schema)
|
19
|
-
|
20
18
|
case vote_for
|
21
19
|
when "expand"
|
22
|
-
|
20
|
+
puts "Launching new instance"
|
21
|
+
`rm /etc/poolparty/neighborhood.json`
|
23
22
|
cld.send :launch_instance!, schema.options.merge(:cloud_name => cld.name) do |node|
|
24
23
|
dputs "Started node at #{node[:ip]}"
|
25
|
-
|
26
24
|
::PoolParty::Provision::BootStrapper.new( node[:ip], :cloud => cld )
|
27
25
|
::PoolParty::Provision::DrConfigure.new( node[:ip], :cloud => cld )
|
28
|
-
end
|
29
|
-
|
26
|
+
end
|
27
|
+
|
30
28
|
when "contract"
|
31
|
-
|
32
|
-
|
29
|
+
`rm /etc/poolparty/neighborhood.json`
|
30
|
+
last_instance_id = %x[server-list-active instance_id].split("\t").last
|
31
|
+
remote_base.terminate_instance! schema.options.merge(:instance_id => last_instance_id)
|
33
32
|
else
|
34
33
|
puts "Unknown action: #{vote_for}"
|
34
|
+
remote_base.describe_instances
|
35
35
|
end
|
36
36
|
|
37
37
|
end
|
data/bin/server-list-active
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
3
3
|
require "poolparty/lite"
|
4
|
+
require "poolparty/core/array"
|
4
5
|
|
5
6
|
list_type = ARGV.shift || "ip"
|
6
7
|
|
@@ -8,24 +9,16 @@ json_file = ARGV[0] || PoolParty::Default.properties_hash_file
|
|
8
9
|
raise "ERROR: no json_file given" if !json_file
|
9
10
|
schema = PoolParty::Schema.new( ::File.read(json_file) )
|
10
11
|
|
11
|
-
inst_array = PoolParty::Neighborhoods.load_default.instances
|
12
|
+
inst_array = PoolParty::Neighborhoods.load_default.instances
|
12
13
|
|
13
14
|
if !inst_array || inst_array.empty?
|
14
|
-
|
15
|
-
remote_base = remoter_base.top_level_class.constantize(PoolParty::Remote)
|
16
|
-
|
15
|
+
remote_base = PoolParty::Remote.module_eval( schema.options.remoter_base.camelcase )
|
17
16
|
instances = remote_base.send :describe_instances, schema.options
|
18
|
-
inst_array = instances.map {|inst| inst.send list_type.to_sym }
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
when "ip"
|
24
|
-
inst_array.compact.map {|i| i.ip }
|
25
|
-
when "internal_ip"
|
26
|
-
inst_array.compact.map {|i| i.internal_ip || i.ip }
|
17
|
+
inst_array = instances.map {|inst| inst.send list_type.to_sym }.compact
|
18
|
+
if ['ip', 'public_id', 'internal_ip'].include? list_type
|
19
|
+
inst_array.delete_if{|n| !n.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) }
|
20
|
+
end
|
21
|
+
print inst_array.compact.join("\t")
|
27
22
|
else
|
28
|
-
inst_array
|
29
|
-
end
|
30
|
-
|
31
|
-
print print_array.compact.join("\t")
|
23
|
+
print inst_array.map {|inst| inst.send list_type.to_sym }.compact.join("\t")
|
24
|
+
end
|
data/bin/server-manage-election
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
# Error codes
|
8
8
|
# 1 -> clouds.json was not loaded
|
9
9
|
# 2 -> server-list-active didn't run
|
10
|
+
$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
|
10
11
|
require "rubygems"
|
11
12
|
require 'net/http'
|
12
13
|
require 'json'
|
@@ -19,20 +20,18 @@ def get_json_stats_from(ip, port)
|
|
19
20
|
Net::HTTP.start(ip, port) {|http| http.get('/stats.json') }.body rescue "{}"
|
20
21
|
end
|
21
22
|
|
22
|
-
ips = %x[
|
23
|
-
|
24
|
-
exit(2) unless ips
|
23
|
+
ips = %x[server-list-active internal_ip].split("\t")
|
25
24
|
|
26
25
|
minimum_instances = schema.options.minimum_instances
|
27
26
|
maximum_instances = schema.options.maximum_instances
|
28
27
|
|
29
28
|
if ips.size < minimum_instances
|
30
|
-
%x[/usr/bin/server-cloud-elections expand]
|
31
29
|
puts "Cloud is too small, need to expand"
|
30
|
+
%x[server-cloud-elections expand]
|
32
31
|
exit(0)
|
33
32
|
elsif ips.size > maximum_instances
|
34
|
-
%x[/usr/bin/server-cloud-elections contract]
|
35
33
|
puts "Cloud is too big, need to contract"
|
34
|
+
%x[n/server-cloud-elections contract]
|
36
35
|
exit(0)
|
37
36
|
end
|
38
37
|
|
data/examples/basic.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
# Basic pool spec
|
2
2
|
# Shows global settings for the clouds
|
3
3
|
pool :application do
|
4
|
-
instances
|
4
|
+
instances 1..5
|
5
5
|
|
6
6
|
cloud :basic_app do
|
7
|
-
minimum_instances
|
7
|
+
minimum_instances 3
|
8
|
+
keypair 'front'
|
8
9
|
image_id "ami-abc123"
|
9
10
|
has_file :name => "/etc/motd", :content => "Welcome to your PoolParty instance"
|
10
11
|
end
|
11
12
|
|
12
13
|
cloud :basic_db do
|
13
14
|
using :vmrun do
|
14
|
-
vmx_hash "
|
15
|
+
vmx_hash "/path/to/vmx_file" => "192.168.248.122"
|
15
16
|
end
|
16
|
-
minimum_instances
|
17
|
+
minimum_instances 1
|
17
18
|
image_id "ami-1234bc"
|
18
19
|
end
|
19
20
|
|
data/examples/fairchild.rb
CHANGED
data/lib/poolparty.rb
CHANGED
@@ -64,12 +64,12 @@ $_poolparty_load_directories = [
|
|
64
64
|
"dependencies.rb",
|
65
65
|
"modules/searchable_paths.rb",
|
66
66
|
"modules/pinger.rb",
|
67
|
+
"modules",
|
67
68
|
"poolparty/key.rb",
|
68
69
|
"dependency_resolver/dependency_resolver_cloud_extensions.rb",
|
69
70
|
"dependency_resolver/dependency_resolver.rb",
|
70
71
|
"poolparty/poolparty_base_class.rb",
|
71
72
|
"poolparty/default.rb",
|
72
|
-
"modules",
|
73
73
|
"exceptions",
|
74
74
|
'poolparty/key.rb',
|
75
75
|
"dependency_resolver",
|
data/lib/poolparty/core/hash.rb
CHANGED
@@ -112,13 +112,21 @@ class Hash
|
|
112
112
|
self
|
113
113
|
end
|
114
114
|
|
115
|
+
def to_cloud
|
116
|
+
$:.unshift("#{::File.dirname(__FILE__)}/../../poolparty")
|
117
|
+
require "poolparty"
|
118
|
+
cld = Cloud.new((fetch(:name) rescue "hashed_cloud"))
|
119
|
+
cld.set_vars_from_options(self)
|
120
|
+
cld
|
121
|
+
end
|
122
|
+
|
115
123
|
def method_missing(sym, *args, &block)
|
116
|
-
if has_key?(sym)
|
124
|
+
if has_key?(sym.to_sym)
|
117
125
|
fetch(sym)
|
118
126
|
elsif has_key?(sym.to_s)
|
119
127
|
fetch(sym.to_s)
|
120
128
|
else
|
121
129
|
super
|
122
130
|
end
|
123
|
-
end
|
131
|
+
end
|
124
132
|
end
|
@@ -114,17 +114,17 @@ module PoolParty
|
|
114
114
|
output_options if verbose? && verbose
|
115
115
|
|
116
116
|
if @load_pools
|
117
|
-
@loaded_pool = load_pool( spec
|
117
|
+
@loaded_pool = load_pool( spec ? spec : Binary.get_existing_spec_location)
|
118
118
|
@loaded_clouds = extract_cloud_from_options(self)
|
119
119
|
@loaded_pools = extract_pool_from_options(self)
|
120
120
|
|
121
121
|
reject_junk_options!
|
122
122
|
raise CloudNotFoundException.new("Please specify your cloud with -s, move it to ./clouds.rb or in your POOL_SPEC environment variable") unless loaded_clouds && !loaded_clouds.empty?
|
123
123
|
loaded_pools.each do |pl|
|
124
|
-
pl.dsl_options.merge!(self.
|
124
|
+
pl.dsl_options.merge!(self.dsl_options)
|
125
125
|
end
|
126
126
|
loaded_clouds.each do |cl|
|
127
|
-
cl.dsl_options.merge!(self.
|
127
|
+
cl.dsl_options.merge!(self.dsl_options)
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
@@ -152,10 +152,10 @@ module PoolParty
|
|
152
152
|
end
|
153
153
|
|
154
154
|
def extract_cloud_from_options(o)
|
155
|
-
o.cloudname
|
155
|
+
o.cloudname ? [cloud(o.cloudname.downcase.to_sym)] : clouds.collect {|n,cl| cl}
|
156
156
|
end
|
157
157
|
|
158
158
|
def extract_pool_from_options(o)
|
159
|
-
o.poolname
|
159
|
+
o.poolname ? [pool(o.poolname.downcase.to_sym)] : pools.collect {|n,pl| pl}
|
160
160
|
end
|
161
161
|
end
|
data/lib/poolparty/lite.rb
CHANGED
@@ -5,12 +5,15 @@ begin
|
|
5
5
|
rescue Exception => e
|
6
6
|
require "dslify"
|
7
7
|
end
|
8
|
+
require "#{::File.dirname(__FILE__)}/core/string"
|
9
|
+
require "#{::File.dirname(__FILE__)}/core/hash"
|
10
|
+
require "#{::File.dirname(__FILE__)}/core/object"
|
8
11
|
require "#{::File.dirname(__FILE__)}/poolparty/default"
|
9
12
|
require "#{::File.dirname(__FILE__)}/modules/user_helpers"
|
13
|
+
require "#{::File.dirname(__FILE__)}/modules/cloud_resourcer"
|
14
|
+
require "#{::File.dirname(__FILE__)}/modules/pinger"
|
10
15
|
require "#{::File.dirname(__FILE__)}/schema"
|
11
|
-
require "#{::File.dirname(__FILE__)}/core/string"
|
12
16
|
require "#{::File.dirname(__FILE__)}/net/init"
|
13
|
-
require "#{::File.dirname(__FILE__)}/core/hash"
|
14
17
|
require "#{::File.dirname(__FILE__)}/poolparty/neighborhoods"
|
15
18
|
require "#{::File.dirname(__FILE__)}/exceptions/RemoteException.rb"
|
16
19
|
|
@@ -74,11 +74,18 @@ module PoolParty
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def update_from_schema(schema)
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
77
|
+
self.dsl_options.merge! schema.options.to_hash
|
78
|
+
self.dependency_resolver = schema.options.dependency_resolver.split("::")[-1].gsub(/Resolver/, '').preserved_class_constant("Resolver") rescue PoolParty::Chef
|
79
|
+
keypair schema.options.keypair_name
|
80
|
+
remote_base_class = PoolParty::Remote.module_eval( schema.options.remoter_base.camelcase )
|
81
|
+
self.remote_base = remote_base_class.new schema.options.remote_base.to_hash
|
82
|
+
|
83
|
+
# self.keypair = PoolParty::Key.new schema.options.keypair.basename
|
84
|
+
# keypair = schema.options.delete(:keypairs).map {|a| PoolParty::Key.new(a.basename) }
|
85
|
+
# options.merge! schema.options.to_hash
|
86
|
+
# dsl_options[:keypairs] = keypairs
|
87
|
+
#
|
88
|
+
# dsl_options[:dependency_resolver] = schema.options.dependency_resolver.split("::")[-1].gsub(/Resolver/, '').preserved_class_constant("Resolver") rescue PoolParty::Chef
|
82
89
|
|
83
90
|
end
|
84
91
|
|
@@ -26,7 +26,7 @@ module PoolParty
|
|
26
26
|
def pretty_options(pre, o)
|
27
27
|
return "" unless o.respond_to?(:options)
|
28
28
|
print_options = (o.respond_to?(:parent) && o.parent && o.parent.respond_to?(:options)) ?
|
29
|
-
(o.dsl_options.delete_if {|k,v| o.parent.dsl_options.has_key?(k) && o.parent.
|
29
|
+
(o.dsl_options.delete_if {|k,v| o.parent.dsl_options.has_key?(k) && o.parent.dsl_options[k] == o.dsl_options[k] && !o.dsl_options[k].nil? } ) :
|
30
30
|
o.options
|
31
31
|
print_options = print_options.map {|k,v| [k, o.send(k.to_sym).to_s] }.inject({}) { |r,e| r[e[0]] = e[1] unless o.class.default_options[e[0]] == e[1] || e[1].nil? || e[1].empty?; r }
|
32
32
|
print_options.flush_out("#{pre}\t")
|
@@ -61,6 +61,7 @@ module Monitors
|
|
61
61
|
|
62
62
|
private
|
63
63
|
def instance
|
64
|
+
return nil if path_map.nil?
|
64
65
|
@instance ||= constantize( path_map.first ).new(env)
|
65
66
|
end
|
66
67
|
|
@@ -95,7 +96,7 @@ module Monitors
|
|
95
96
|
when 1 # example: /stats
|
96
97
|
instance.send(verb.to_sym, @data)
|
97
98
|
when 2 # example: /stats/load
|
98
|
-
instance.send("#{verb}_#{path[1]}".to_sym, @data)
|
99
|
+
instance.send("#{verb}_#{path[1]}".to_sym, @data) rescue instance.send("#{path[1]}".to_sym, @data)
|
99
100
|
else # example: /stats/load/average/5/minutes
|
100
101
|
instance.send("#{verb}_#{path[1]}".to_sym, env['rack.input'].read, *path[2..-1])
|
101
102
|
end
|
@@ -119,5 +120,4 @@ module Monitors
|
|
119
120
|
|
120
121
|
end
|
121
122
|
|
122
|
-
|
123
123
|
end
|
@@ -8,7 +8,8 @@ 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)
|
@@ -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
|
@@ -16,26 +16,19 @@ module Monitors
|
|
16
16
|
|
17
17
|
begin
|
18
18
|
@cloud = JSON.parse( open('/etc/poolparty/clouds.json' ).read )
|
19
|
+
# @cloud = ::PoolParty::Cloud::Cloud.load_from_json(open('/etc/poolparty/clouds.json' ).read)
|
19
20
|
rescue
|
20
|
-
@cloud = ::PoolParty::Default.
|
21
|
+
@cloud = ::PoolParty::Default.dsl_options.merge({"options" =>
|
21
22
|
{"rules" => {"expand" => PoolParty::Default.expand_when,
|
22
23
|
"contract" => PoolParty::Default.contract_when
|
23
24
|
}
|
24
25
|
}
|
25
|
-
})
|
26
|
+
})
|
26
27
|
end
|
27
|
-
|
28
|
-
|
29
|
-
# We set these as rules on ourselves so we can use aska to parse the rules.
|
30
|
-
# Later, we can call vote_rules on ourself and we'll get back Aska::Rule(s)
|
31
|
-
# which we'll call valid_rule? for each Rule and return the result
|
32
|
-
@cloud["options"]["rules"].each do |name, rul|
|
33
|
-
r = Aska::Rule.new(rul)
|
34
|
-
rule(name) << r
|
35
|
-
end
|
36
|
-
# log << "#{::Time.now.strftime("%Y-%m-%d-%H-%M")}, #{stats.to_json}\n"
|
28
|
+
make_aska_rules(@cloud["options"]["rules"])
|
29
|
+
log << "#{::Time.now.strftime("%Y-%m-%d-%H-%M")}, #{stats.to_json}\n"
|
37
30
|
end
|
38
|
-
|
31
|
+
|
39
32
|
def get(data=nil)
|
40
33
|
begin
|
41
34
|
if !request.params || request.params.empty?
|
@@ -43,10 +36,11 @@ module Monitors
|
|
43
36
|
else
|
44
37
|
stats[request.params[0].to_sym] ||= self.send(request.params[0])
|
45
38
|
stats[request.params[0].to_sym]
|
39
|
+
log << "#{::Time.now.strftime("%Y-%m-%d-%H-%M")}, #{stats.to_json}\n"
|
46
40
|
stats.to_json
|
47
41
|
end
|
48
42
|
rescue Exception => e
|
49
|
-
"Error: #{e}"
|
43
|
+
"Error: #{e}".to_json
|
50
44
|
end
|
51
45
|
end
|
52
46
|
|
@@ -86,11 +80,12 @@ module Monitors
|
|
86
80
|
# TODO: Move?
|
87
81
|
# Expand the cloud if 50+% of the votes are for expansion
|
88
82
|
# Contract the cloud if 51+% of the votes are for contraction
|
83
|
+
# Check to make sure an elected action is not already in progress
|
89
84
|
if (candidates[:expand] - candidates[:contract])/stats.keys.size > 0.5
|
90
|
-
%x[
|
85
|
+
%x[server-cloud-elections expand] unless elected_action == "expand"
|
91
86
|
@elected_action = "expand"
|
92
87
|
elsif (candidates[:contract] - candidates[:expand])/stats.keys.size > 0.5
|
93
|
-
%x[
|
88
|
+
%x[server-cloud-elections contract] unless elected_action == "contract"
|
94
89
|
@elected_action = "contract"
|
95
90
|
end
|
96
91
|
|
@@ -100,12 +95,11 @@ module Monitors
|
|
100
95
|
stats.to_json
|
101
96
|
end
|
102
97
|
|
103
|
-
|
104
|
-
def elected_action
|
98
|
+
def elected_action(_n=nil)
|
105
99
|
@elected_action ||= nil
|
106
100
|
end
|
107
101
|
|
108
|
-
def rules
|
102
|
+
def rules(_n=nil)
|
109
103
|
@rules ||= {}
|
110
104
|
end
|
111
105
|
|
@@ -120,37 +114,38 @@ module Monitors
|
|
120
114
|
stats
|
121
115
|
end
|
122
116
|
|
123
|
-
def stats
|
117
|
+
def stats(_n=nil)
|
124
118
|
@stats ||= {my_ip => {}}
|
125
119
|
end
|
126
120
|
|
127
|
-
def load
|
121
|
+
def load(_n=nil)
|
128
122
|
%x{"uptime"}.split[-3].to_f
|
129
123
|
end
|
130
124
|
|
131
|
-
def instances
|
125
|
+
def instances(_n=nil)
|
132
126
|
# res = PoolParty::Neighborhoods.load_default.instances
|
133
|
-
res ||= %x[
|
127
|
+
res ||= %x[server-list-active internal_ip].split("\t")
|
134
128
|
res
|
135
129
|
end
|
136
130
|
|
137
|
-
def can_expand?
|
131
|
+
def can_expand?(_n=nil)
|
138
132
|
instances.size < max_instances
|
139
133
|
end
|
140
134
|
|
141
|
-
def can_contract?
|
135
|
+
def can_contract?(_n=nil)
|
142
136
|
instances.size > min_instances
|
143
137
|
end
|
144
138
|
|
145
|
-
def min_instances
|
139
|
+
def min_instances(_n=nil)
|
146
140
|
(@cloud["options"]["minimum_instances"] || PoolParty::Default.minimum_instances).to_i
|
147
141
|
end
|
148
142
|
|
149
|
-
def max_instances
|
143
|
+
def max_instances(_n=nil)
|
150
144
|
(@cloud["options"]["maximum_instances"] || PoolParty::Default.maximum_instances).to_i
|
151
145
|
end
|
152
146
|
|
153
|
-
def nominations
|
147
|
+
def nominations(_n=nil)
|
148
|
+
# return ['expand'] if instances.size<min_instances
|
154
149
|
load = stats[my_ip]["load"] ||= self.send(:load)
|
155
150
|
stats[my_ip]["nominations"] ||= rules.collect do |k,cld_rules|
|
156
151
|
t = cld_rules.collect do |r|
|
@@ -170,17 +165,38 @@ module Monitors
|
|
170
165
|
end.flatten.compact
|
171
166
|
end
|
172
167
|
|
168
|
+
#alias to allow access thru http route GET /stats/nominations
|
169
|
+
def get_nominations(_nodes=[])
|
170
|
+
nominations.to_json
|
171
|
+
end
|
172
|
+
|
173
|
+
def get_hello(_n=nil)
|
174
|
+
'hi there'
|
175
|
+
end
|
176
|
+
|
173
177
|
def my_ip
|
174
178
|
@my_ip ||= ohai["ipaddress"]
|
175
179
|
end
|
176
180
|
|
177
|
-
def ohai
|
181
|
+
def ohai(_n=nil)
|
178
182
|
@ohai ||= JSON.parse(%x[ohai])
|
179
183
|
end
|
180
184
|
|
181
185
|
def reload_data!
|
182
186
|
@stats[my_ip] = {}
|
183
187
|
instances.each {|inst| @stats[inst] = {} }
|
188
|
+
end
|
189
|
+
|
190
|
+
# Our cloud.dsl_options.rules looks like
|
191
|
+
# {"expand_when" => "load > 0.9", "contract_when" => "load < 0.4"}
|
192
|
+
# We set these as rules on ourselves so we can use aska to parse the rules.
|
193
|
+
# Later, we can call vote_rules on ourself and we'll get back Aska::Rule(s)
|
194
|
+
# which we'll call valid_rule? for each Rule and return the result
|
195
|
+
def make_aska_rules(rules)
|
196
|
+
rules.each do |name, rul|
|
197
|
+
r = Aska::Rule.new(rul)
|
198
|
+
rule(name) << r
|
199
|
+
end
|
184
200
|
end
|
185
201
|
|
186
202
|
end
|