auser-poolparty 1.3.5 → 1.3.6
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/Rakefile +2 -2
- data/VERSION.yml +1 -1
- data/bin/cloud-misc +34 -0
- data/bin/{poolparty-setup → cloud-setup} +0 -0
- data/bin/cloud-ssh +4 -1
- data/config/jeweler.rb +4 -3
- data/examples/monitored_cloud.rb +1 -1
- data/examples/thrift/thrift_example.rb +5 -3
- data/examples/vmware.rb +10 -0
- data/lib/cloud_providers/cloud_provider_instance.rb +13 -4
- data/lib/cloud_providers/connections.rb +1 -1
- data/lib/core/file.rb +12 -0
- data/lib/dependency_resolvers/base.rb +1 -1
- data/lib/dependency_resolvers/chef.rb +7 -5
- data/lib/dependency_resolvers/proxy_object.rb +11 -3
- data/lib/poolparty.rb +3 -1
- data/lib/poolparty/base.rb +1 -2
- data/lib/poolparty/cloud.rb +20 -5
- data/lib/poolparty/default.rb +1 -0
- data/lib/poolparty/plugin.rb +1 -5
- data/lib/poolparty/plugins/apache.rb +8 -6
- data/lib/poolparty/plugins/collectd.rb +24 -0
- data/lib/poolparty/plugins/collectd/templates/collectd.conf.erb +369 -0
- data/lib/poolparty/plugins/hermes.rb +89 -0
- data/lib/poolparty/pool.rb +26 -3
- data/lib/poolparty/resource.rb +12 -11
- data/lib/poolparty/resources/line.rb +2 -2
- data/lib/poolparty/resources/variable.rb +4 -3
- data/lib/proto/command_interface_handler.rb +17 -1
- data/lib/proto/gen-py/cloudthrift/CommandInterface.pyc +0 -0
- data/lib/proto/gen-py/cloudthrift/__init__.pyc +0 -0
- data/lib/proto/gen-py/cloudthrift/constants.pyc +0 -0
- data/lib/proto/gen-py/cloudthrift/ttypes.pyc +0 -0
- data/lib/proto/gen-py/thrift/Thrift.pyc +0 -0
- data/lib/proto/gen-py/thrift/__init__.pyc +0 -0
- data/lib/proto/gen-py/thrift/protocol/TBinaryProtocol.pyc +0 -0
- data/lib/proto/gen-py/thrift/protocol/TProtocol.pyc +0 -0
- data/lib/proto/gen-py/thrift/protocol/__init__.pyc +0 -0
- data/lib/proto/gen-py/thrift/transport/TSocket.pyc +0 -0
- data/lib/proto/gen-py/thrift/transport/TTransport.pyc +0 -0
- data/lib/proto/gen-py/thrift/transport/__init__.pyc +0 -0
- data/test/lib/dependency_resolvers/chef_test.rb +92 -100
- data/test/lib/poolparty/cloud_test.rb +50 -2
- data/test/lib/poolparty/monitor_test.rb +2 -2
- data/test/lib/poolparty/resource_test.rb +5 -0
- data/test/lib/poolparty/resources/variable_test.rb +33 -10
- metadata +11 -4
data/lib/poolparty/pool.rb
CHANGED
@@ -2,6 +2,11 @@ module PoolParty
|
|
2
2
|
|
3
3
|
class Pool < DslBase
|
4
4
|
|
5
|
+
default_options(
|
6
|
+
:minimum_instances => nil, # minimum_instances default
|
7
|
+
:maximum_instances => nil # maximum_instances default
|
8
|
+
)
|
9
|
+
|
5
10
|
# Freeze the pool_name so we can't modify it at all
|
6
11
|
# call and run instance_eval on the block and then call the after_create callback
|
7
12
|
def initialize(n, &block)
|
@@ -26,12 +31,25 @@ module PoolParty
|
|
26
31
|
# Define a cloud by a name and a block
|
27
32
|
def cloud(name, o={}, &block)
|
28
33
|
if block
|
29
|
-
clouds[name.to_s] ||= PoolParty::Cloud.new(name, o, &block)
|
34
|
+
clouds[name.to_s] ||= PoolParty::Cloud.new(name, soakable_options.merge(o), &block)
|
30
35
|
else
|
31
36
|
raise PoolPartyError.new("CloudError", "You must pass a block when defining a cloud")
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
40
|
+
# Soaked options
|
41
|
+
# These are options that can be set on the pool that will be grabbed from the pool
|
42
|
+
# that can be set to the cloud.
|
43
|
+
# Soakable options:
|
44
|
+
# minimum_instances
|
45
|
+
# maximum_instances
|
46
|
+
def soakable_options
|
47
|
+
soaked_options = {}
|
48
|
+
soaked_options.merge!(:minimum_instances => minimum_instances) if minimum_instances
|
49
|
+
soaked_options.merge!(:maximum_instances => maximum_instances) if maximum_instances
|
50
|
+
soaked_options
|
51
|
+
end
|
52
|
+
|
35
53
|
# Run twice to catch the errors on the first run
|
36
54
|
# TODO: CHANGE ME!
|
37
55
|
def form_clouds
|
@@ -98,6 +116,7 @@ module PoolParty
|
|
98
116
|
else
|
99
117
|
find_default_clouds_dot_rb(filename)
|
100
118
|
end
|
119
|
+
ENV["CLOUDS_DOT_RB"] = f
|
101
120
|
load_from_file(f)
|
102
121
|
end
|
103
122
|
|
@@ -133,10 +152,14 @@ module PoolParty
|
|
133
152
|
# + sets up the log
|
134
153
|
def self.before_file_load(filepath)
|
135
154
|
$:.unshift(::File.dirname(filepath))
|
136
|
-
Dir["#{ ::File.dirname(filepath)}/plugins
|
155
|
+
Dir["#{ ::File.dirname(filepath)}/{plugins,lib}/**/*"].each do |plugin_path|
|
137
156
|
if File.directory?(plugin_path)
|
138
157
|
$:.unshift(plugin_path)
|
139
|
-
|
158
|
+
|
159
|
+
["#{plugin_path}/#{File.basename(plugin_path)}", "#{plugin_path}/lib/#{File.basename(plugin_path)}"].each do |potential|
|
160
|
+
require potential if File.exists?(potential)
|
161
|
+
end
|
162
|
+
|
140
163
|
elsif File.file?(plugin_path) && plugin_path.match(/.rb$/)
|
141
164
|
require plugin_path
|
142
165
|
end
|
data/lib/poolparty/resource.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module PoolParty
|
2
2
|
class Resource < Base
|
3
3
|
|
4
|
-
|
4
|
+
attr_accessor :exists
|
5
5
|
attr_accessor :meta_notifies, :meta_not_if, :meta_only_if, :meta_subscribes
|
6
6
|
attr_accessor :graph_index
|
7
7
|
|
@@ -12,9 +12,9 @@ module PoolParty
|
|
12
12
|
:provider => nil
|
13
13
|
)
|
14
14
|
|
15
|
-
def initialize(opts={}, extra_opts={}, &block)
|
16
|
-
@exists
|
17
|
-
super
|
15
|
+
def initialize(opts={}, extra_opts={}, exists=true, &block)
|
16
|
+
@exists ||= exists
|
17
|
+
super(opts, extra_opts, &block)
|
18
18
|
valid?
|
19
19
|
end
|
20
20
|
|
@@ -88,7 +88,10 @@ module PoolParty
|
|
88
88
|
# Should this resource exist on the remote systems
|
89
89
|
# which is a lookup of the instance variable
|
90
90
|
# on the instance of the resource
|
91
|
-
# The default is that the resource DOES exist
|
91
|
+
# The default is that the resource DOES exist
|
92
|
+
def exists(n=nil)
|
93
|
+
@exists
|
94
|
+
end
|
92
95
|
alias :exists? :exists
|
93
96
|
|
94
97
|
# The resource exists in the output and should be created
|
@@ -172,15 +175,13 @@ module PoolParty
|
|
172
175
|
# PoolParty classes that use Base
|
173
176
|
def self.define_resource(res)
|
174
177
|
Base.class_eval <<-EOE
|
175
|
-
def has_#{res.has_method_name}(a={},b={}
|
176
|
-
obj = #{res}.new(a,b,&block)
|
177
|
-
obj.exists!
|
178
|
+
def has_#{res.has_method_name}(a={},b={},e=true, &block)
|
179
|
+
obj = #{res}.new(a,b,e,&block)
|
178
180
|
resources << obj
|
179
181
|
obj
|
180
182
|
end
|
181
|
-
def does_not_have_#{res.has_method_name}(a={},b={},&block)
|
182
|
-
obj = has_#{res.has_method_name}(a,b,&block)
|
183
|
-
obj.does_not_exist!
|
183
|
+
def does_not_have_#{res.has_method_name}(a={},b={},e=false,&block)
|
184
|
+
obj = has_#{res.has_method_name}(a,b,e,&block)
|
184
185
|
obj
|
185
186
|
end
|
186
187
|
def #{res.has_method_name}s
|
@@ -36,9 +36,9 @@ module PoolParty
|
|
36
36
|
{:command => "grep -q \'#{line.safe_quote}\' #{filepath} || echo \'#{line.safe_quote}\' >> #{filepath}",
|
37
37
|
:not_if => "grep -q \'#{line.safe_quote}\' #{filepath}"}
|
38
38
|
else
|
39
|
-
{:command => "cat #{filepath} | grep -v \'#{line.safe_quote}\' >
|
39
|
+
{:command => "cat #{filepath} | grep -v \'#{line.safe_quote}\' > tempfile && mv tempfile #{filepath}",
|
40
40
|
:only_if => "grep -q \'#{line.safe_quote}\' #{filepath}"}
|
41
|
-
end
|
41
|
+
end
|
42
42
|
|
43
43
|
opts.merge!(:name => exists? ? "line in #{filepath}" : "no line in #{filepath}")
|
44
44
|
|
@@ -33,7 +33,7 @@ module PoolParty
|
|
33
33
|
:value => nil
|
34
34
|
)
|
35
35
|
|
36
|
-
def initialize(k, v=nil)
|
36
|
+
def initialize(k, v=nil, exists=true)
|
37
37
|
case k
|
38
38
|
when Hash
|
39
39
|
super
|
@@ -41,7 +41,7 @@ module PoolParty
|
|
41
41
|
if value.is_a?(Hash)
|
42
42
|
super(v.merge(:name => k))
|
43
43
|
else
|
44
|
-
super(:name => k, :value => v)
|
44
|
+
super({:name => k, :value => v})
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -51,7 +51,8 @@ module PoolParty
|
|
51
51
|
def print_to_chef
|
52
52
|
# Variable
|
53
53
|
# TODO: Variable => <%= name %>
|
54
|
-
"poolparty[:#{name}] = #{value}"
|
54
|
+
# "poolparty[:#{name}] = #{value}"
|
55
|
+
:no_print
|
55
56
|
end
|
56
57
|
|
57
58
|
end
|
@@ -6,7 +6,23 @@ class CommandInterfaceHandler
|
|
6
6
|
cr.command = command
|
7
7
|
resp = begin
|
8
8
|
the_cloud = clouds[cld.name]
|
9
|
-
|
9
|
+
if the_cloud
|
10
|
+
if command.include?(".")
|
11
|
+
command.split(".").inject([]) do |sum, cmd|
|
12
|
+
if cmd.match(/\((.*)\)/)
|
13
|
+
args = $1
|
14
|
+
new_cmd = cmd.gsub(args, '').gsub(/\(\)/, '')
|
15
|
+
sum = arr.send(new_cmd.to_sym, *args)
|
16
|
+
else
|
17
|
+
sum = arr.send(cmd)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
else
|
21
|
+
the_cloud.send(command.to_sym, *args)
|
22
|
+
end
|
23
|
+
else
|
24
|
+
"Cloud not found: #{cld.name}"
|
25
|
+
end
|
10
26
|
rescue Exception => e
|
11
27
|
cr.response = "Error: #{e.inspect}"
|
12
28
|
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -4,70 +4,74 @@ include_fixture_resources
|
|
4
4
|
include_chef_only_resources
|
5
5
|
|
6
6
|
class ChefTest < Test::Unit::TestCase
|
7
|
-
include PoolParty
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@cookboox_directory = test_dir/"cookbooks"/"poolparty"
|
14
|
-
|
15
|
-
@resources = {
|
16
|
-
:variables => Resources::Variable.new(:animal, "Duck"),
|
17
|
-
:files => Resources::FileResource.new(:name => "/etc/motd", :content => "Welcome to a fake file"),
|
18
|
-
:directories => Resources::Directory.new("/etc/poolparty"),
|
19
|
-
:http_request => PoolParty::Resources::HttpRequest.new("posting data", :url => "http://check.in", :message => {:some => "data"}, :action => :post),
|
20
|
-
:link => PoolParty::Resources::Link.new("/tmp/passwd", :to => "/etc/passwd"),
|
21
|
-
:chef_recipe => PoolParty::Resources::ChefRecipe.new(fixtures_dir/"chef"/"recipes"/"sudo")
|
22
|
-
}
|
23
|
-
end
|
8
|
+
def setup
|
9
|
+
@base = DependencyResolvers::Chef
|
10
|
+
@base.compile_directory = test_dir
|
11
|
+
@cookboox_directory = test_dir/"cookbooks"/"poolparty"
|
24
12
|
|
25
|
-
|
26
|
-
|
27
|
-
|
13
|
+
@resources = {
|
14
|
+
:variables => PoolParty::Resources::Variable.new(:bird, "Fowl"),
|
15
|
+
:files => PoolParty::Resources::FileResource.new(:name => "/etc/motd", :content => "Welcome to a fake file"),
|
16
|
+
:directories => PoolParty::Resources::Directory.new("/etc/poolparty"),
|
17
|
+
:http_request => PoolParty::Resources::HttpRequest.new("posting data", :url => "http://check.in", :message => {:some => "data"}, :action => :post),
|
18
|
+
:link => PoolParty::Resources::Link.new("/tmp/passwd", :to => "/etc/passwd"),
|
19
|
+
:chef_recipe => PoolParty::Resources::ChefRecipe.new(fixtures_dir/"chef"/"recipes"/"sudo")
|
20
|
+
}
|
28
21
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
22
|
+
PoolParty::Resource.define_resource_methods
|
23
|
+
@inst = FakeResource.new
|
24
|
+
@res = @resources[:link]
|
25
|
+
@inst.has_service("apache")
|
26
|
+
end
|
27
|
+
|
28
|
+
def teardown
|
29
|
+
FileUtils.rm_rf test_dir
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_have_compile_to_chef
|
33
|
+
assert @base.respond_to?(:compile_method_name)
|
34
|
+
assert_equal :print_to_chef, @base.compile_method_name
|
35
|
+
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
def test_be_able_to_compile_a_variable
|
38
|
+
@base.compile_to(@resources[:variables], test_dir)
|
39
|
+
cont = open(@cookboox_directory/"attributes"/"poolparty.rb").read
|
40
|
+
assert_match /poolparty Mash\.new unless attribute\?\("poolparty"\)/, cont
|
41
|
+
assert_match /poolparty\[:bird\] = \"Fowl\"\n/, cont
|
42
|
+
FileUtils.rm_rf test_dir
|
43
|
+
end
|
40
44
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
+
def test_be_able_to_compile_a_file
|
46
|
+
@base.compile_to(@resources[:files], test_dir)
|
47
|
+
assert_equal "Welcome to a fake file", open(@cookboox_directory/"templates"/"default"/"etc"/"motd.erb").read
|
48
|
+
end
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
+
def test_be_able_to_compile_an_http_request
|
51
|
+
@base.compile_to(@resources[:http_request], test_dir)
|
52
|
+
assert_equal "http_request \"posting data\" do\n action :post\n url \"http://check.in\"\n message :some => \"data\"\nend\n", open(@cookboox_directory/"recipes"/"default.rb").read
|
53
|
+
end
|
50
54
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
def test_compile_to_the_recipes
|
56
|
+
@base.compile_to(@resources[:files], test_dir)
|
57
|
+
assert_equal "template \"/etc/motd\" do\n source \"/etc/motd.erb\"\n action :create\n backup 5\n mode 0644\n owner \"root\"\nend\n", open(@cookboox_directory/"recipes"/"default.rb").read
|
58
|
+
end
|
55
59
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
60
|
+
def test_compile_the_recipes
|
61
|
+
@base.compile_to(@resources[:chef_recipe], test_dir)
|
62
|
+
assert_equal open(fixtures_dir/"chef"/"recipes"/"sudo"/"recipes"/"default.rb").read, open(@cookboox_directory/".."/"sudo"/"recipes"/"default.rb").read
|
63
|
+
assert_equal "recipe \"sudo\"", open(@cookboox_directory/"recipes"/"default.rb").read
|
64
|
+
end
|
61
65
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
66
|
+
def test_compile_all_the_resources_when_passed_the_entire_array
|
67
|
+
resources = []
|
68
|
+
resources << @resources[:files]
|
69
|
+
resources << @resources[:directories]
|
70
|
+
resources << @resources[:variables]
|
71
|
+
@base.compile(resources)
|
72
|
+
["recipes"/"default.rb", "templates"/"default"/"etc"/"motd.erb"].each do |fi|
|
73
|
+
assert File.file?(@cookboox_directory/fi)
|
74
|
+
end
|
71
75
|
|
72
76
|
output =<<-EOE
|
73
77
|
template "/etc/motd" do
|
@@ -91,54 +95,42 @@ EOE
|
|
91
95
|
assert_equal output, open(@cookboox_directory/"recipes"/"default.rb").read
|
92
96
|
end
|
93
97
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
@res.provider "http://google.com"
|
119
|
-
assert_match /provider "http:\/\/google\.com"/, @base.compile(@res)
|
120
|
-
end
|
121
|
-
|
122
|
-
should "Add meta not_if on the resource output" do
|
123
|
-
@res.not_if "test -f /etc/passwd"
|
124
|
-
assert_match /not_if "test -f \/etc\/passwd"/, @base.compile(@res)
|
125
|
-
@res.not_if do
|
126
|
-
File.file?("/etc/passwd")
|
127
|
-
end
|
128
|
-
assert_match /not_if do File.file\?\("\/etc\/passwd"\) end/, @base.compile(@res)
|
129
|
-
end
|
130
|
-
|
131
|
-
should "Add meta only_if on the resource output" do
|
132
|
-
@res.only_if "test -f /var/poolparty/tmp"
|
133
|
-
assert_match /only_if "test -f \/var\/poolparty\/tmp"/, @base.compile(@res)
|
134
|
-
@res.only_if do
|
98
|
+
def test_Add_meta_notifies_on_the_resource_output
|
99
|
+
@res.notifies @inst.get_service("apache"), :reload
|
100
|
+
assert_match /notifies :reload, resources\(:service => "apache"\)/, @base.compile(@res)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_Add_meta_subscribes_on_the_resource_output
|
104
|
+
@res.subscribes @inst.get_service("apache"), :reload
|
105
|
+
assert_match /subscribes :reload, resources\(:service => "apache"\), :delayed/, @base.compile(@res)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_Add_meta_ignore_failure_on_the_resource_output
|
109
|
+
@res.ignore_failure true
|
110
|
+
assert_match /ignore_failure true/, @base.compile(@res)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_Add_meta_provider_on_the_resource_output
|
114
|
+
@res.provider "http://google.com"
|
115
|
+
assert_match /provider "http:\/\/google\.com"/, @base.compile(@res)
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_Add_meta_not_if_on_the_resource_output
|
119
|
+
@res.not_if "test -f /etc/passwd"
|
120
|
+
assert_match /not_if "test -f \/etc\/passwd"/, @base.compile(@res)
|
121
|
+
@res.not_if do
|
135
122
|
File.file?("/etc/passwd")
|
136
|
-
end
|
137
|
-
assert_match /only_if do File.file\?\("\/etc\/passwd"\) end/, @base.compile(@res)
|
138
|
-
end
|
139
|
-
|
140
123
|
end
|
124
|
+
assert_match /not_if do File.file\?\("\/etc\/passwd"\) end/, @base.compile(@res)
|
125
|
+
end
|
141
126
|
|
127
|
+
def test_add_meta_only_if_on_the_resource_output
|
128
|
+
@res.only_if "test -f /var/poolparty/tmp"
|
129
|
+
assert_match /only_if "test -f \/var\/poolparty\/tmp"/, @base.compile(@res)
|
130
|
+
@res.only_if do
|
131
|
+
File.file?("/etc/passwd")
|
132
|
+
end
|
133
|
+
assert_match /only_if do File.file\?\("\/etc\/passwd"\) end/, @base.compile(@res)
|
142
134
|
end
|
143
135
|
|
144
136
|
end
|
@@ -97,8 +97,9 @@ class CloudTest < Test::Unit::TestCase
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def test_run
|
100
|
-
|
101
|
-
|
100
|
+
# WHAT?
|
101
|
+
# result = clouds['app'].run('uptime')
|
102
|
+
# assert_match /uptime/, result["app"]
|
102
103
|
end
|
103
104
|
|
104
105
|
def test_os
|
@@ -120,6 +121,36 @@ class CloudTest < Test::Unit::TestCase
|
|
120
121
|
# assert_equal size-1, clouds['app'].nodes.size
|
121
122
|
end
|
122
123
|
|
124
|
+
def test_change_ssh_port
|
125
|
+
clear!
|
126
|
+
pool "ssh_port" do
|
127
|
+
cloud "babity" do
|
128
|
+
ssh_port 1922
|
129
|
+
end
|
130
|
+
cloud "noneity" do
|
131
|
+
end
|
132
|
+
end
|
133
|
+
assert_equal 1922, clouds["babity"].ssh_port
|
134
|
+
assert_equal 22, clouds["noneity"].ssh_port
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
def test_children_getting_parent_options
|
139
|
+
clear!
|
140
|
+
pool "outside" do
|
141
|
+
minimum_instances 1
|
142
|
+
maximum_instances 10
|
143
|
+
cloud "inside" do
|
144
|
+
maximum_instances 100
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
assert_equal 1, pools["outside"].minimum_instances
|
149
|
+
assert_equal 10, pools["outside"].maximum_instances
|
150
|
+
assert_equal 100, clouds["inside"].maximum_instances
|
151
|
+
assert_equal 1, clouds["inside"].minimum_instances
|
152
|
+
end
|
153
|
+
|
123
154
|
def test_monitor_dsl
|
124
155
|
clear!
|
125
156
|
pool "monitoring" do
|
@@ -136,4 +167,21 @@ class CloudTest < Test::Unit::TestCase
|
|
136
167
|
assert_equal({:configure => []}, clouds["monitor_app"].run_monitor("cpu", "0.1"))
|
137
168
|
assert_equal({:vote_for => [:expand]}, clouds["monitor_app"].run_monitor("cpu", "1.4"))
|
138
169
|
end
|
170
|
+
|
171
|
+
def test_add_monitoring_stack_if_needed
|
172
|
+
clear!
|
173
|
+
pool "monitoring2" do
|
174
|
+
cloud "app_cloud" do
|
175
|
+
keypair "test_key"
|
176
|
+
platform :ubuntu
|
177
|
+
monitor "cpu-idle" do |c|
|
178
|
+
vote_for(:expand) if c > 0.8
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
assert_equal 1, clouds["app_cloud"].monitors.size
|
184
|
+
|
185
|
+
clouds["app_cloud"].compile
|
186
|
+
end
|
139
187
|
end
|