auser-poolparty 1.3.16 → 1.3.17
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +1 -1
- data/bin/cloud +1 -0
- data/bin/cloud-show +13 -1
- data/lib/cloud_providers/connections.rb +7 -4
- data/lib/cloud_providers/ec2/ec2.rb +6 -0
- data/lib/cloud_providers/ec2/ec2_helpers.rb +6 -4
- data/lib/core/object.rb +1 -1
- data/lib/dependency_resolvers/chef.rb +3 -3
- data/lib/keypair.rb +5 -3
- data/lib/poolparty/base.rb +44 -21
- data/lib/poolparty/cloud.rb +36 -10
- data/lib/poolparty/installer.rb +1 -1
- data/lib/poolparty/installers/ec2.rb +32 -6
- data/lib/poolparty/plugins/apache.rb +7 -2
- data/lib/poolparty/plugins/apache2/virtual_host.rb +1 -0
- data/lib/poolparty/plugins/hermes.rb +2 -3
- data/lib/poolparty/pool.rb +5 -0
- data/lib/poolparty/resource.rb +2 -2
- data/test/fixtures/clouds/simple_cloud.rb +1 -1
- data/test/fixtures/resources/fake_plugin.rb +5 -0
- data/test/lib/core/array_test.rb +4 -0
- data/test/lib/poolparty/base_test.rb +1 -1
- data/test/lib/poolparty/cloud_test.rb +49 -4
- data/test/lib/poolparty/plugins/apache_test.rb +5 -0
- metadata +2 -2
data/VERSION.yml
CHANGED
data/bin/cloud
CHANGED
@@ -33,6 +33,7 @@ EOS
|
|
33
33
|
$DEBUGGING = true if command[:debug]
|
34
34
|
$VERY_DEBUGGING = true if command[:very_debug]
|
35
35
|
|
36
|
+
PoolParty::Pool.command = command
|
36
37
|
@loaded_pool = PoolParty::Pool.find_and_load_default_clouds_dot_rb(command[:clouds_dot_rb])
|
37
38
|
@loaded_clouds = command[:name] ? [clouds[command[:name]]] : @loaded_pool.clouds.map {|name,cld|cld}
|
38
39
|
@loaded_clouds.map do |cld|
|
data/bin/cloud-show
CHANGED
@@ -16,6 +16,7 @@ shows output about the clouds.rb
|
|
16
16
|
EOS
|
17
17
|
|
18
18
|
short_desc "shows output about the clouds.rb"
|
19
|
+
opt :generate_graph, "Generate the dependency tree graph", :type => :string, :default => nil
|
19
20
|
|
20
21
|
run do |command|
|
21
22
|
|
@@ -30,7 +31,18 @@ EOS
|
|
30
31
|
"Running on: #{cld.cloud_provider_name}"
|
31
32
|
]
|
32
33
|
|
33
|
-
|
34
|
+
if verbose?
|
35
|
+
msg << [
|
36
|
+
"Keypair: #{cld.keypair.basename}"
|
37
|
+
]
|
38
|
+
end
|
39
|
+
|
40
|
+
if command[:generate_graph]
|
41
|
+
vputs "Generating dependency graph at: #{command[:generate_graph]}"
|
42
|
+
cld.output_resources_graph('png', command[:generate_graph], {"fontsize" => 30})
|
43
|
+
end
|
44
|
+
|
45
|
+
print_msg(msg.flatten)
|
34
46
|
|
35
47
|
end
|
36
48
|
|
@@ -42,10 +42,10 @@ module CloudProviders
|
|
42
42
|
# "-i keyfile -o StrictHostKeyChecking=no -i keypair.to_s -l fred"
|
43
43
|
def ssh_options(opts={})
|
44
44
|
return @ssh_options if @ssh_options && opts.empty?
|
45
|
-
|
45
|
+
ssh_opts = {"-i" => keypair.full_filepath,
|
46
46
|
"-o" =>"StrictHostKeyChecking=no"
|
47
47
|
}.merge(opts)
|
48
|
-
@ssh_options =
|
48
|
+
@ssh_options = ssh_opts.collect{ |k,v| "#{k} #{v}"}.join(' ')
|
49
49
|
end
|
50
50
|
|
51
51
|
def rsync( opts={} )
|
@@ -88,9 +88,12 @@ module CloudProviders
|
|
88
88
|
err = stderr.readlines
|
89
89
|
$stderr.write_nonblock(err)
|
90
90
|
rescue SystemCallError => error
|
91
|
-
|
91
|
+
err = stderr.readlines
|
92
|
+
$stderr.write_nonblock(err)
|
92
93
|
rescue EOFError => error
|
93
|
-
|
94
|
+
err = stderr.readlines
|
95
|
+
$stderr.write_nonblock(err)
|
96
|
+
# used to do nothing
|
94
97
|
end
|
95
98
|
end
|
96
99
|
buf
|
@@ -105,6 +105,12 @@ module CloudProviders
|
|
105
105
|
number_of_instances = o[:number_of_instances] || 1
|
106
106
|
set_vars_from_options o
|
107
107
|
raise StandardError.new("You must pass a keypair to launch an instance, or else you will not be able to login. options = #{o.inspect}") if !keypair_name
|
108
|
+
vputs("--- Launching ec2 instances")
|
109
|
+
vputs({
|
110
|
+
"image_id" => image_id,
|
111
|
+
"security_group" => security_group,
|
112
|
+
"keypair" => keypair.basename
|
113
|
+
})
|
108
114
|
response_array = ec2(o).run_instances(image_id,
|
109
115
|
min_count,
|
110
116
|
number_of_instances,
|
@@ -45,6 +45,7 @@ module CloudProviders
|
|
45
45
|
# public ip
|
46
46
|
def associate_address(instance_id)
|
47
47
|
new_ip = next_unused_elastic_ip
|
48
|
+
vputs("Assigning #{new_ip} to the ec2 instance #{instance_id}")
|
48
49
|
ec2.associate_address(instance_id, new_ip)
|
49
50
|
loop do
|
50
51
|
if describe_instance(:instance_id => instance_id).public_ip == new_ip
|
@@ -62,20 +63,21 @@ module CloudProviders
|
|
62
63
|
# intersection of the unused ips and those, find the first one available
|
63
64
|
# and return that.
|
64
65
|
def next_unused_elastic_ip
|
65
|
-
if
|
66
|
+
if unused_elastic_ips.empty?
|
66
67
|
nil
|
67
68
|
else
|
68
|
-
|
69
|
+
vputs("Found an unused elastic ip: #{unused_elastic_ips.first}")
|
70
|
+
unused_elastic_ips.first
|
69
71
|
end
|
70
72
|
end
|
71
73
|
|
72
74
|
private
|
73
75
|
|
74
76
|
def all_elastic_ips
|
75
|
-
elastic_ips.empty? ? [] : ec2.describe_addresses & elastic_ips
|
77
|
+
elastic_ips.empty? ? [] : ec2.describe_addresses.map {|a| a[:public_ip]} & elastic_ips
|
76
78
|
end
|
77
79
|
|
78
|
-
def
|
80
|
+
def unused_elastic_ips
|
79
81
|
all_elastic_ips.select {|i| i[:instance_id] == nil }
|
80
82
|
end
|
81
83
|
|
data/lib/core/object.rb
CHANGED
@@ -68,7 +68,7 @@ class Object
|
|
68
68
|
# MESSAGES
|
69
69
|
# Debugging output helpers
|
70
70
|
def vputs(m="")
|
71
|
-
puts "[INFO] -- #{m}" if verbose?
|
71
|
+
puts "[INFO] -- #{m.is_a?(String) ? m : m.inspect}" if verbose?
|
72
72
|
end
|
73
73
|
def dputs(m="")
|
74
74
|
puts "[DEBUG] -- #{m.is_a?(String) ? m : m.inspect}" if debugging?
|
@@ -109,10 +109,10 @@ module DependencyResolvers
|
|
109
109
|
end
|
110
110
|
|
111
111
|
def apply_meta_notifies(resource, add)
|
112
|
-
# The meta_notifies is a hash that looks like: {:file => [["pool_name", :reload]]}
|
112
|
+
# The meta_notifies is a hash that looks like: {:file => [["pool_name", :reload, :immediately]]}
|
113
113
|
resource.meta_notifies.each do |ty, arr|
|
114
|
-
arr.each do |nm, action|
|
115
|
-
add << " notifies :#{action}, resources(:#{chef_safe_resource(ty)} => \"#{nm}\")"
|
114
|
+
arr.each do |nm, action, at_time|
|
115
|
+
add << " notifies :#{action}, resources(:#{chef_safe_resource(ty)} => \"#{nm}\"), :#{at_time}"
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|
data/lib/keypair.rb
CHANGED
@@ -7,10 +7,12 @@ class Keypair
|
|
7
7
|
has_searchable_paths(:prepend_paths => [Dir.pwd, '/etc/poolparty/keys', "#{ENV["HOME"]}/.ssh/", "#{ENV["HOME"]}/.ec2/", ENV['EC2_CONFIG_DIR']])
|
8
8
|
|
9
9
|
attr_accessor :filepath
|
10
|
+
attr_reader :extra_paths
|
10
11
|
|
11
12
|
# Create a new key that defaults to id_rsa as the name.
|
12
|
-
def initialize(fpath)
|
13
|
+
def initialize(fpath, extra_paths=[])
|
13
14
|
@filepath = fpath
|
15
|
+
@extra_paths = extra_paths.map {|a| File.expand_path(a) }
|
14
16
|
valid?
|
15
17
|
end
|
16
18
|
|
@@ -27,10 +29,10 @@ class Keypair
|
|
27
29
|
# Returns the full_filepath of the key. If a full filepath is passed, we just return the expanded filepath
|
28
30
|
# for the keypair, otherwise query where it is against known locations
|
29
31
|
def full_filepath
|
30
|
-
@full_filepath ||= if File.file?(
|
32
|
+
@full_filepath ||= if File.file?(File.expand_path(filepath))
|
31
33
|
::File.expand_path(filepath)
|
32
34
|
else
|
33
|
-
search_in_known_locations(filepath)
|
35
|
+
search_in_known_locations(filepath, extra_paths)
|
34
36
|
end
|
35
37
|
end
|
36
38
|
alias :to_s :full_filepath
|
data/lib/poolparty/base.rb
CHANGED
@@ -128,47 +128,70 @@ module PoolParty
|
|
128
128
|
# to create edges on the graph
|
129
129
|
def resources_graph(force=false)
|
130
130
|
return @resources_graph if @resources_graph && !force
|
131
|
-
result = Digraph.new
|
131
|
+
result = Digraph.new
|
132
132
|
|
133
133
|
create_graph(resources, nil, result)
|
134
134
|
|
135
|
-
add_ordered_resources_to_result(resources, result)
|
136
|
-
|
137
135
|
@resources_graph = result
|
138
136
|
end
|
139
137
|
|
140
|
-
# Add all the resources as edges of each other
|
141
|
-
def add_ordered_resources_to_result(resources, result)
|
142
|
-
arr_of_resources = resources.zip_offset(1)
|
143
|
-
|
144
|
-
arr_of_resources.each do |first, second|
|
145
|
-
result.add_edge!(first, second) unless result.edge?(first, second) or result.edge?(second, first)
|
146
|
-
add_ordered_resources_to_result(first.resources, result)
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
138
|
# Create the graph of resources. Blow up if a resource isn't found
|
151
139
|
# that is required. If it is found, add it as an edge to the
|
152
140
|
# dependency graph
|
153
141
|
def create_graph(resources, on, result)
|
154
|
-
|
142
|
+
# add_ordered_resources_to_result(without_dependencies, result)
|
143
|
+
first_layer_of_ordered_resources = resources_without_dependencies.zip_offset(1)
|
144
|
+
first_layer_of_ordered_resources.each do |first, second|
|
145
|
+
result.add_edge!(first, second) unless second.nil? or result.edge?(first, second) or result.edge?(second, first)
|
146
|
+
end
|
147
|
+
|
148
|
+
resources_with_dependencies.each do |r|
|
155
149
|
|
156
|
-
|
150
|
+
r.dependencies.each do |dep_type, deps_array|
|
157
151
|
deps_array.each do |dep_name|
|
158
152
|
dep = get_resource(dep_type, dep_name)
|
159
|
-
raise PoolPartyError.create("ResourceNotFound", "A resource required for #{
|
160
|
-
|
153
|
+
raise PoolPartyError.create("ResourceNotFound", "A resource required for #{dep_type}(#{dep_name}) was not found: #{dep_type}(#{dep_name}). Please make sure you've specified this in your configuration.") unless dep
|
154
|
+
|
155
|
+
unless result.edge?(dep, r) and result.edge?(r, dep)
|
156
|
+
existing_connections = result.adjacent(dep)
|
157
|
+
existing_connections.each {|c| result.remove_edge!(r, c) }
|
158
|
+
|
159
|
+
result.add_edge!(dep, r, dep.name)
|
160
|
+
|
161
|
+
existing_connections.each {|c| result.add_edge!(dep, c) }
|
162
|
+
end
|
163
|
+
|
161
164
|
end
|
162
165
|
end
|
163
|
-
|
166
|
+
end
|
167
|
+
|
168
|
+
all_resources.each_with_index do |resource, idx|
|
164
169
|
if on
|
165
170
|
result.add_edge!(resource, on, resource.name) unless result.edge?(resource, on) or result.edge?(on, resource)
|
166
171
|
else
|
167
|
-
result.add_vertex!(resource)
|
172
|
+
result.add_vertex!(resource) unless result.vertex?(resource)
|
168
173
|
end
|
169
|
-
|
170
|
-
create_graph(resource.resources, resource, result)
|
171
174
|
end
|
175
|
+
|
176
|
+
result
|
177
|
+
end
|
178
|
+
|
179
|
+
# Add all the resources as edges of each other
|
180
|
+
def add_ordered_resources_to_result(resources, result)
|
181
|
+
arr_of_resources = resources.zip_offset(1)
|
182
|
+
|
183
|
+
arr_of_resources.each do |first, second|
|
184
|
+
result.add_edge!(first, second) unless result.edge?(first, second) or result.edge?(second, first)
|
185
|
+
add_ordered_resources_to_result(first.resources, result)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def resources_without_dependencies(r=all_resources)
|
190
|
+
r.reject {|a| !a.dependencies.empty? }
|
191
|
+
end
|
192
|
+
|
193
|
+
def resources_with_dependencies(r=all_resources)
|
194
|
+
r - resources_without_dependencies(r)
|
172
195
|
end
|
173
196
|
|
174
197
|
# All the dependencies that are required by this resource
|
data/lib/poolparty/cloud.rb
CHANGED
@@ -14,8 +14,7 @@ module PoolParty
|
|
14
14
|
:cloud_provider_name => :ec2,
|
15
15
|
:dependency_resolver_name => nil,
|
16
16
|
:os => nil,
|
17
|
-
:bootstrap_script => nil
|
18
|
-
:ssh_options => {}
|
17
|
+
:bootstrap_script => nil
|
19
18
|
)
|
20
19
|
|
21
20
|
# Define what gets run on the callbacks
|
@@ -51,8 +50,8 @@ module PoolParty
|
|
51
50
|
# returns an instance of Keypair
|
52
51
|
# You can pass either a filename which will be searched for in ~/.ec2/ and ~/.ssh/
|
53
52
|
# Or you can pass a full filepath
|
54
|
-
def keypair(n=nil)
|
55
|
-
@keypair ||= Keypair.new(n)
|
53
|
+
def keypair(n=nil, extra_paths=[])
|
54
|
+
@keypair ||= Keypair.new(n, extra_paths)
|
56
55
|
end
|
57
56
|
|
58
57
|
# Declare the CloudProvider for a cloud
|
@@ -290,17 +289,23 @@ Compiling cloud #{self.name} to #{tmp_path/"etc"/"#{dependency_resolver_name}"}
|
|
290
289
|
if resources_graph.cyclic?
|
291
290
|
cycles = []
|
292
291
|
|
293
|
-
resources_graph.
|
294
|
-
|
295
|
-
|
296
|
-
end
|
292
|
+
cycles = resources_graph.find_cycle
|
293
|
+
cycle_string = cycles.map do |k,v|
|
294
|
+
"#{k} -> #{v}"
|
297
295
|
end
|
296
|
+
|
297
|
+
filepath = "/tmp"
|
298
|
+
format = "png"
|
299
|
+
dotpath = "#{filepath}/dot.#{format}"
|
300
|
+
resources_graph.write_to_graphic_file(format, filepath)
|
301
|
+
|
302
|
+
`open #{dotpath}`
|
298
303
|
msg =<<-EOE
|
299
304
|
|
300
305
|
Your resource graph is cyclic. Two resources depend on each other, Cannot decide which resource
|
301
306
|
to go first. Dying instead. Correct this and then try again.
|
302
307
|
|
303
|
-
#{
|
308
|
+
#{dotpath}
|
304
309
|
|
305
310
|
Hint: You can see the resource graph by generating it with:
|
306
311
|
cloud compile -g name
|
@@ -325,4 +330,25 @@ Compiling cloud #{self.name} to #{tmp_path/"etc"/"#{dependency_resolver_name}"}
|
|
325
330
|
end
|
326
331
|
|
327
332
|
end
|
328
|
-
end
|
333
|
+
end
|
334
|
+
|
335
|
+
module GRATR
|
336
|
+
class Digraph
|
337
|
+
|
338
|
+
# Crappy n*n
|
339
|
+
def find_cycle(from=self)
|
340
|
+
return [] unless cyclic?
|
341
|
+
cyclic_cycle = []
|
342
|
+
forward_edge = Proc.new {|e| }
|
343
|
+
back_edge = Proc.new do |b|
|
344
|
+
cyclic_cycle = dfs_tree_from_vertex(b)
|
345
|
+
end
|
346
|
+
from.dfs({
|
347
|
+
:forward_edge => forward_edge,
|
348
|
+
:back_edge => back_edge
|
349
|
+
})
|
350
|
+
cyclic_cycle
|
351
|
+
end
|
352
|
+
|
353
|
+
end
|
354
|
+
end
|
data/lib/poolparty/installer.rb
CHANGED
@@ -2,9 +2,11 @@ module PoolParty
|
|
2
2
|
module Installers
|
3
3
|
class Ec2 < Installer
|
4
4
|
|
5
|
+
attr_reader :access_key, :secret_access_key, :ec2_directory
|
6
|
+
|
5
7
|
def steps
|
6
8
|
[
|
7
|
-
:
|
9
|
+
:check_for_access_keys,
|
8
10
|
:show_env_setup
|
9
11
|
]
|
10
12
|
end
|
@@ -16,6 +18,30 @@ module PoolParty
|
|
16
18
|
def self.description
|
17
19
|
"Ec2 installer"
|
18
20
|
end
|
21
|
+
|
22
|
+
def check_for_access_keys
|
23
|
+
msg = "
|
24
|
+
I've detected the following for your ec2 setup.
|
25
|
+
<line>
|
26
|
+
access key: #{CloudProviders::Ec2.default_access_key}
|
27
|
+
secret access key: #{CloudProviders::Ec2.default_secret_access_key}
|
28
|
+
certificate: #{CloudProviders::Ec2.default_cert}
|
29
|
+
private key: #{CloudProviders::Ec2.default_private_key}
|
30
|
+
|
31
|
+
<yellow>Are these values correct?</yellow>
|
32
|
+
"
|
33
|
+
v = choose msg, %W(Yes No)
|
34
|
+
if v == "Yes"
|
35
|
+
puts "Using the values above"
|
36
|
+
@access_key = CloudProviders::Ec2.default_access_key
|
37
|
+
@secret_access_key = CloudProviders::Ec2.default_secret_access_key
|
38
|
+
@ec2_directory = File.dirname(CloudProviders::Ec2.default_cert)
|
39
|
+
else
|
40
|
+
[
|
41
|
+
:ask_for_ec2_directory, :ask_for_access_key, :ask_for_private_access_key
|
42
|
+
].each {|meth| self.send meth}
|
43
|
+
end
|
44
|
+
end
|
19
45
|
|
20
46
|
def ask_for_access_key
|
21
47
|
access_key_help =<<-EOV
|
@@ -25,7 +51,7 @@ EC2 uses an access key to identify you and allows you to start and stop instance
|
|
25
51
|
access_key = <<-EOE
|
26
52
|
What is your access key?
|
27
53
|
EOE
|
28
|
-
ask_with_help :message => access_key, :help => access_key_help do |k|
|
54
|
+
ask_with_help :message => access_key, :no_value => true, :help => access_key_help do |k|
|
29
55
|
@access_key = k
|
30
56
|
end
|
31
57
|
end
|
@@ -62,11 +88,11 @@ What's path to your ec2 directory with your cert and pk files?
|
|
62
88
|
|
63
89
|
Setup your environment:
|
64
90
|
|
65
|
-
export EC2_ACCESS_KEY=#{
|
66
|
-
export EC2_SECRET_KEY=#{
|
91
|
+
export EC2_ACCESS_KEY=#{access_key}
|
92
|
+
export EC2_SECRET_KEY=#{secret_access_key}
|
67
93
|
|
68
|
-
export EC2_PRIVATE_KEY=$(ls #{
|
69
|
-
export EC2_CERT=$(ls #{
|
94
|
+
export EC2_PRIVATE_KEY=$(ls #{ec2_directory}/pk-*.pem)
|
95
|
+
export EC2_CERT=$(ls #{ec2_directory}/cert-*.pem)
|
70
96
|
|
71
97
|
<line>
|
72
98
|
EOE
|
@@ -9,6 +9,11 @@ module PoolParty
|
|
9
9
|
:www_dir => "/var/www",
|
10
10
|
:passenger_version => "2.2.5"
|
11
11
|
|
12
|
+
|
13
|
+
def name
|
14
|
+
"apache"
|
15
|
+
end
|
16
|
+
|
12
17
|
def before_load
|
13
18
|
installed_as_worker
|
14
19
|
configs
|
@@ -146,7 +151,7 @@ PassengerRuby <%= @node[:languages][:ruby][:ruby_bin] %>
|
|
146
151
|
|
147
152
|
def enable_default
|
148
153
|
listen 80 # assumes no haproxy
|
149
|
-
site "default-site", :template => File.dirname(__FILE__)/:apache2/"default-site.conf.erb"
|
154
|
+
site "default-site", :template => File.dirname(__FILE__)/:apache2/"default-site.conf.erb", :notifies => get_exec("reload-apache2"), :requires => get_exec("reload-apache2")
|
150
155
|
end
|
151
156
|
|
152
157
|
def config(name, temp)
|
@@ -169,7 +174,7 @@ PassengerRuby <%= @node[:languages][:ruby][:ruby_bin] %>
|
|
169
174
|
else
|
170
175
|
has_exec(:command => "/usr/sbin/a2dissite #{name}") do
|
171
176
|
notifies get_exec("reload-apache2"), :run
|
172
|
-
requires
|
177
|
+
requires get_exec("reload-apache2")
|
173
178
|
only_if "/bin/sh -c \"[ -L /etc/apache2/sites-enabled/#{name} ] && [ /etc/apache2/sites-enabled/#{name} -ef /etc/apache2/sites-available/#{name}]\""
|
174
179
|
end
|
175
180
|
end
|
@@ -60,14 +60,13 @@ module PoolParty
|
|
60
60
|
:requires => get_package("erlang-dev")
|
61
61
|
|
62
62
|
has_link :name => "collectd_dir",
|
63
|
-
:to => "/var/lib/collectd/rrd/\#{`hostname -f`.chomp}", :source => "/var/lib/collectd/localhost"
|
64
|
-
:requires => [get_package("collectd")]
|
63
|
+
:to => "/var/lib/collectd/rrd/\#{`hostname -f`.chomp}", :source => "/var/lib/collectd/localhost"
|
65
64
|
end
|
66
65
|
|
67
66
|
def run_if_needed
|
68
67
|
has_exec "env GEN_CLUSTER_SEED_CONFIG=/etc/poolparty/seeds.conf HERMES_RRD_DIRECTORY=/var/lib/collectd/localhost #{remote_hermes_deployed_dir}/bin/erl -boot #{remote_hermes_deployed_dir}/releases/#{hermes_release_version}/start -noshell -detached",
|
69
68
|
:not_if => "ps aux | grep -v grep | grep hermes | grep beam",
|
70
|
-
:requires => [get_exec("install_hermes")
|
69
|
+
:requires => [get_exec("install_hermes")]
|
71
70
|
end
|
72
71
|
|
73
72
|
private
|
data/lib/poolparty/pool.rb
CHANGED
data/lib/poolparty/resource.rb
CHANGED
@@ -40,11 +40,11 @@ module PoolParty
|
|
40
40
|
|
41
41
|
# META FUNCTIONS
|
42
42
|
# ALL RESOURCES HAVE THESE METHODS AVAILABLE
|
43
|
-
def notifies(other_resources_hash, action_to_take=:reload)
|
43
|
+
def notifies(other_resources_hash, action_to_take=:reload, at_time=:delayed)
|
44
44
|
@meta_notifies ||= {}
|
45
45
|
other_resources_hash.each do |k,v|
|
46
46
|
notifies_array = (@meta_notifies[k] ||= [])
|
47
|
-
notifies_array << [v, action_to_take] unless notifies_array.include?([v, action_to_take])
|
47
|
+
notifies_array << [v, action_to_take, at_time] unless notifies_array.include?([v, action_to_take, at_time])
|
48
48
|
# Implicitly add a require
|
49
49
|
# requires(k => v)
|
50
50
|
end
|
@@ -7,10 +7,15 @@ module PoolParty
|
|
7
7
|
"fake_plugin"
|
8
8
|
end
|
9
9
|
|
10
|
+
def name
|
11
|
+
"fake_plugin"
|
12
|
+
end
|
13
|
+
|
10
14
|
def after_loaded
|
11
15
|
has_file "/etc/my_configs/special_config" do
|
12
16
|
requires get_directory("/etc/my_configs")
|
13
17
|
end
|
18
|
+
has_directory("/etc/my_configs")
|
14
19
|
end
|
15
20
|
|
16
21
|
end
|
data/test/lib/core/array_test.rb
CHANGED
@@ -42,7 +42,11 @@ class ArrayTest < Test::Unit::TestCase
|
|
42
42
|
arr = %w(a b c d e f)
|
43
43
|
assert_equal [["a","b"],["b","c"],["c","d"],["d","e"],["e","f"]], arr.zip_offset(1)
|
44
44
|
assert_equal [["a","b"],["b","c"],["c","d"],["d","e"]], arr.zip_offset(2)
|
45
|
+
assert_equal [["a","b"],["b","c"],["c","d"]], arr.zip_offset(3)
|
45
46
|
assert_equal [["a","b"]], arr.zip_offset(5)
|
47
|
+
|
48
|
+
assert_equal [["a","b"],["b","c"],["c","d"],["d","e"]], %w(a b c d e).zip_offset(1)
|
49
|
+
assert_equal [["a","b"],["b","c"],["c","d"]], %w(a b c d e).zip_offset(2)
|
46
50
|
end
|
47
51
|
|
48
52
|
def test_rotate
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/../../test_helper"
|
2
2
|
# require 'rr'
|
3
3
|
stub_ec2_calls
|
4
|
+
include_fixture_resources
|
4
5
|
|
5
6
|
class CloudTest < Test::Unit::TestCase
|
6
7
|
# include RR::Adapters::TestUnit
|
@@ -97,6 +98,50 @@ class CloudTest < Test::Unit::TestCase
|
|
97
98
|
assert_equal 'shutting-down', result.first.status
|
98
99
|
end
|
99
100
|
|
101
|
+
def test_resource_graph_generation
|
102
|
+
pool "resource" do
|
103
|
+
cloud "graph" do
|
104
|
+
|
105
|
+
has_file "a", :content => "a"
|
106
|
+
has_file "g", :content => "g", :requires => get_file("c")
|
107
|
+
has_file "b", :content => "b"
|
108
|
+
has_file "c", :content => "c"
|
109
|
+
has_file "d", :content => "d"
|
110
|
+
has_file "e", :content => "e"
|
111
|
+
has_file "f", :content => "f"
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# p clouds["graph"].ordered_resources.map {|a| a.name }
|
117
|
+
assert_equal %w(g), clouds["graph"].resources_with_dependencies.map {|a| a.name}
|
118
|
+
assert_equal %w(a b c d e f), clouds["graph"].resources_without_dependencies.map {|a| a.name }
|
119
|
+
assert_equal %w(a b c g d e f), clouds["graph"].ordered_resources.map {|a| a.name }
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_deep_resources_graph_generation
|
124
|
+
pool "resource" do
|
125
|
+
cloud "graph2" do
|
126
|
+
|
127
|
+
os :ubuntu
|
128
|
+
|
129
|
+
keypair "test_key", fixtures_dir/"keys"
|
130
|
+
|
131
|
+
has_fake_plugin do
|
132
|
+
has_exec "a", :requires => get_file("b")
|
133
|
+
end
|
134
|
+
has_exec "c", :requires => get_exec("a")
|
135
|
+
has_file "b", :content => "b"
|
136
|
+
has_file "q", :requires => get_exec("a")
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# Non-deterministic... figure out fix
|
142
|
+
# assert_equal ["fake_plugin", "/etc/my_configs", "/etc/my_configs/special_config", "b", "a", "q", "c"], clouds["graph2"].ordered_resources.map {|a| a.name}
|
143
|
+
end
|
144
|
+
|
100
145
|
def test_run
|
101
146
|
# WHAT?
|
102
147
|
# result = @cloud.run('uptime')
|
@@ -139,13 +184,13 @@ class CloudTest < Test::Unit::TestCase
|
|
139
184
|
pool "ssher" do
|
140
185
|
cloud "custom" do
|
141
186
|
keypair "test_key"
|
142
|
-
ssh_options("-P" => "1992")
|
187
|
+
# ssh_options("-P" => "1992")
|
143
188
|
end
|
144
189
|
cloud "noneity" do
|
145
190
|
keypair "test_key"
|
146
191
|
end
|
147
192
|
end
|
148
|
-
assert_equal "1992", clouds["custom"].ssh_options["-P"]
|
193
|
+
# assert_equal "1992", clouds["custom"].ssh_options["-P"]
|
149
194
|
end
|
150
195
|
|
151
196
|
|
@@ -197,7 +242,7 @@ class CloudTest < Test::Unit::TestCase
|
|
197
242
|
clear!
|
198
243
|
pool "monitoring2" do
|
199
244
|
cloud "app_cloud" do
|
200
|
-
keypair "test_key"
|
245
|
+
keypair "test_key", fixtures_dir/"keys"
|
201
246
|
platform :ubuntu
|
202
247
|
monitor "cpu-idle" do |c|
|
203
248
|
vote_for(:expand) if c > 0.8
|
@@ -213,6 +258,6 @@ class CloudTest < Test::Unit::TestCase
|
|
213
258
|
recipe_file = compile_dir/"recipes"/"default.rb"
|
214
259
|
recipe_contents = open(recipe_file).read
|
215
260
|
|
216
|
-
assert_match /
|
261
|
+
assert_match /install_hermes/, recipe_contents
|
217
262
|
end
|
218
263
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: auser-poolparty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Lerner
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2009-09-
|
14
|
+
date: 2009-09-23 00:00:00 -07:00
|
15
15
|
default_executable:
|
16
16
|
dependencies: []
|
17
17
|
|