auser-poolparty 1.3.13 → 1.3.14
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-compile +1 -0
- data/lib/cloud_providers/cloud_provider.rb +9 -0
- data/lib/cloud_providers/connections.rb +3 -2
- data/lib/cloud_providers/ec2/ec2.rb +19 -5
- data/lib/cloud_providers/ec2/ec2_helpers.rb +60 -5
- data/lib/cloud_providers/vmware/vmware.rb +3 -0
- data/lib/dependency_resolvers/base.rb +2 -9
- data/lib/poolparty/base.rb +2 -2
- data/lib/poolparty/cloud.rb +6 -4
- data/lib/poolparty/installers/ec2.rb +2 -14
- data/lib/poolparty/plugins/apache.rb +30 -9
- data/lib/poolparty/plugins/apache2/passenger_site.rb +1 -1
- data/lib/poolparty/pool.rb +2 -2
- data/lib/poolparty/resource.rb +16 -13
- data/lib/provision/bootstrap_scripts/build_centos.sh +2 -0
- data/lib/provision/bootstrap_scripts/build_ubuntu.sh +1 -0
- data/test/fixtures/clouds/fake_clouds.rb +2 -2
- data/test/fixtures/clouds/simple_cloud.rb +1 -1
- data/test/fixtures/resources/fake_subclassed_plugin.rb +19 -0
- data/test/lib/cloud_providers/ec2/ec2_instance_test.rb +17 -8
- data/test/lib/cloud_providers/ec2/ec2_test.rb +15 -11
- data/test/lib/dependency_resolvers/base_test.rb +1 -1
- data/test/lib/dependency_resolvers/chef/resources/remote_directory_test.rb +2 -2
- data/test/lib/dependency_resolvers/chef/resources/remote_file_test.rb +1 -1
- data/test/lib/dependency_resolvers/chef_test.rb +3 -3
- data/test/lib/poolparty/cloud_test.rb +47 -32
- data/test/lib/poolparty/pool_test.rb +3 -3
- data/test/lib/poolparty/resource_test.rb +14 -2
- data/test/lib/poolparty/resources/directory_test.rb +1 -1
- data/test/lib/poolparty/resources/file_test.rb +1 -1
- data/test/lib/poolparty/resources/user_test.rb +1 -1
- data/test/lib/provision/bootstrapper_test.rb +0 -25
- data/test/test_helper.rb +0 -1
- metadata +5 -3
data/VERSION.yml
CHANGED
data/bin/cloud-compile
CHANGED
@@ -41,10 +41,11 @@ module CloudProviders
|
|
41
41
|
# {'-i'=>'keyfile, '-l' => 'fred' } would become
|
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
|
+
ssh_options = {"-i" => keypair.full_filepath,
|
45
46
|
"-o" =>"StrictHostKeyChecking=no"
|
46
47
|
}.merge(opts)
|
47
|
-
|
48
|
+
@ssh_options = ssh_options.collect{ |k,v| "#{k} #{v}"}.join(' ')
|
48
49
|
end
|
49
50
|
|
50
51
|
def rsync( opts={} )
|
@@ -19,12 +19,15 @@ using :provider_name
|
|
19
19
|
EOM
|
20
20
|
end
|
21
21
|
|
22
|
+
require "#{File.dirname(__FILE__)}/ec2_helpers"
|
22
23
|
require "#{File.dirname(__FILE__)}/ec2_response"
|
23
24
|
require "#{File.dirname(__FILE__)}/ec2_instance"
|
24
25
|
|
25
26
|
module CloudProviders
|
26
27
|
class Ec2 < CloudProvider
|
27
28
|
|
29
|
+
include CloudProviders::Ec2Helpers
|
30
|
+
|
28
31
|
# Set the aws keys from the environment, or load from /etc/poolparty/env.yml if the environment variable is not set
|
29
32
|
def self.default_access_key
|
30
33
|
ENV['EC2_ACCESS_KEY'] || load_keys_from_file[:access_key]
|
@@ -88,8 +91,8 @@ module CloudProviders
|
|
88
91
|
:ramdisk_id => nil,
|
89
92
|
:availability_zone => nil,
|
90
93
|
:block_device_mappings => nil,
|
91
|
-
:elastic_ips =>
|
92
|
-
:
|
94
|
+
:elastic_ips => [], # An array of the elastic ips
|
95
|
+
:ebs_volumes => [] # The volume id of an ebs volume # TODO: ensure this is consistent with :block_device_mappings
|
93
96
|
})
|
94
97
|
|
95
98
|
|
@@ -99,11 +102,12 @@ module CloudProviders
|
|
99
102
|
|
100
103
|
# Start a new instance with the given options
|
101
104
|
def run_instance(o={})
|
105
|
+
number_of_instances = o[:number_of_instances] || 1
|
102
106
|
set_vars_from_options o
|
103
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
|
104
108
|
response_array = ec2(o).run_instances(image_id,
|
105
109
|
min_count,
|
106
|
-
|
110
|
+
number_of_instances,
|
107
111
|
security_group,
|
108
112
|
keypair.basename,
|
109
113
|
user_data,
|
@@ -114,10 +118,12 @@ module CloudProviders
|
|
114
118
|
availability_zone,
|
115
119
|
block_device_mappings
|
116
120
|
)
|
117
|
-
instances = response_array
|
121
|
+
instances = response_array.collect do |aws_response_hash|
|
118
122
|
Ec2Instance.new( Ec2Response.pp_format(aws_response_hash).merge(o) )
|
119
123
|
end
|
120
|
-
|
124
|
+
|
125
|
+
after_run_instance(instances)
|
126
|
+
|
121
127
|
instances.first
|
122
128
|
end
|
123
129
|
|
@@ -162,6 +168,14 @@ module CloudProviders
|
|
162
168
|
save_aws_env_to_yml(cld.tmp_path/"etc"/"poolparty"/"env.yml") rescue nil
|
163
169
|
end
|
164
170
|
|
171
|
+
# Run after all the instances are run
|
172
|
+
def after_run_instance(instances_list)
|
173
|
+
instances_list.each do |inst|
|
174
|
+
associate_address(inst.instance_id) if next_unused_elastic_ip
|
175
|
+
attach_volume(inst.instance_id) if next_unused_volume
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
165
179
|
# Read yaml file and use it to set environment variables and local variables.
|
166
180
|
def set_aws_env_from_yml_file(filename='/etc/poolparty/env.yml')
|
167
181
|
aws = self.class.load_keys_from_file(filename)
|
@@ -1,12 +1,57 @@
|
|
1
1
|
module CloudProviders
|
2
2
|
module Ec2Helpers
|
3
3
|
|
4
|
+
# VOLUMES
|
5
|
+
def attach_volume(instance_id, volume_id=next_unused_volume, device="/dev/sdh")
|
6
|
+
ec2.attach_volume(volume_id, instance_id, device)
|
7
|
+
end
|
8
|
+
|
9
|
+
def next_unused_volume
|
10
|
+
if all_volumes.empty?
|
11
|
+
nil
|
12
|
+
else
|
13
|
+
available_volumes.first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def all_volumes
|
20
|
+
ebs_volumes.empty? ? [] : ec2.describe_volumes.select {|v| ebs_volumes.include?(v[:aws_id]) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def available_volumes
|
24
|
+
all_volumes.select {|v| v[:aws_status] == 'available' }
|
25
|
+
end
|
26
|
+
|
27
|
+
def unavailable_volumes
|
28
|
+
all_volumes.reject {|v| available_volumes.include?(v) }
|
29
|
+
end
|
30
|
+
|
31
|
+
public
|
32
|
+
|
33
|
+
# SECURITY GROUPS
|
34
|
+
def security_groups(list=[])
|
35
|
+
ec2.describe_security_groups(list)
|
36
|
+
end
|
37
|
+
|
38
|
+
public
|
39
|
+
|
40
|
+
# ELASTIC IPS
|
41
|
+
|
4
42
|
# Associate an address with the instance using ec2
|
5
43
|
# Get the next_unused_elastic_ip
|
6
44
|
# and if there is one, associate the instance to the
|
7
45
|
# public ip
|
8
|
-
def associate_address()
|
9
|
-
|
46
|
+
def associate_address(instance_id)
|
47
|
+
new_ip = next_unused_elastic_ip
|
48
|
+
ec2.associate_address(instance_id, new_ip)
|
49
|
+
loop do
|
50
|
+
if describe_instance(:instance_id => instance_id).public_ip == new_ip
|
51
|
+
return new_ip
|
52
|
+
end
|
53
|
+
sleep 1
|
54
|
+
end
|
10
55
|
end
|
11
56
|
|
12
57
|
# Get the next usable elastic ip
|
@@ -17,13 +62,23 @@ module CloudProviders
|
|
17
62
|
# intersection of the unused ips and those, find the first one available
|
18
63
|
# and return that.
|
19
64
|
def next_unused_elastic_ip
|
20
|
-
|
21
|
-
if elastic_ips.empty?
|
65
|
+
if unusued_elastic_ips.empty?
|
22
66
|
nil
|
23
67
|
else
|
68
|
+
unusued_elastic_ips.first
|
24
69
|
end
|
25
70
|
end
|
26
|
-
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def all_elastic_ips
|
75
|
+
elastic_ips.empty? ? [] : ec2.describe_addresses & elastic_ips
|
76
|
+
end
|
77
|
+
|
78
|
+
def unusued_elastic_ips
|
79
|
+
all_elastic_ips.select {|i| i[:instance_id] == nil }
|
80
|
+
end
|
81
|
+
|
27
82
|
# Help create a keypair for the cloud
|
28
83
|
# This is a helper to create the keypair and add them to the cloud for you
|
29
84
|
# def create_keypair
|
@@ -89,14 +89,7 @@ module DependencyResolvers
|
|
89
89
|
"#{obj.to_i}"
|
90
90
|
end
|
91
91
|
when String
|
92
|
-
|
93
|
-
when /^\d{4}$/
|
94
|
-
"#{obj}"
|
95
|
-
when /^\d{3}$/
|
96
|
-
"0#{obj}"
|
97
|
-
else
|
98
|
-
"\"#{obj}\""
|
99
|
-
end
|
92
|
+
"\"#{obj}\""
|
100
93
|
when Proc
|
101
94
|
obj.call # eh
|
102
95
|
when Array
|
@@ -119,4 +112,4 @@ module DependencyResolvers
|
|
119
112
|
|
120
113
|
end
|
121
114
|
|
122
|
-
end
|
115
|
+
end
|
data/lib/poolparty/base.rb
CHANGED
@@ -157,12 +157,12 @@ module PoolParty
|
|
157
157
|
deps_array.each do |dep_name|
|
158
158
|
dep = get_resource(dep_type, dep_name)
|
159
159
|
raise PoolPartyError.create("ResourceNotFound", "A resource required for #{resource.has_method_name}(#{resource.name}) was not found: #{dep_type}(#{dep_name}). Please make sure you've specified this in your configuration.") unless dep
|
160
|
-
result.add_edge!(dep, resource, dep.name) unless result.edge?(dep, resource)
|
160
|
+
result.add_edge!(dep, resource, dep.name) unless result.edge?(dep, resource) or result.edge?(resource, dep)
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
164
|
if on
|
165
|
-
result.add_edge!(resource, on, resource.name) unless result.edge?(resource, on)
|
165
|
+
result.add_edge!(resource, on, resource.name) unless result.edge?(resource, on) or result.edge?(on, resource)
|
166
166
|
else
|
167
167
|
result.add_vertex!(resource)
|
168
168
|
end
|
data/lib/poolparty/cloud.rb
CHANGED
@@ -14,7 +14,8 @@ module PoolParty
|
|
14
14
|
:cloud_provider_name => :ec2,
|
15
15
|
:dependency_resolver_name => nil,
|
16
16
|
:os => nil,
|
17
|
-
:bootstrap_script => nil
|
17
|
+
:bootstrap_script => nil,
|
18
|
+
:ssh_options => {}
|
18
19
|
)
|
19
20
|
|
20
21
|
# Define what gets run on the callbacks
|
@@ -29,7 +30,7 @@ module PoolParty
|
|
29
30
|
def before_compile
|
30
31
|
add_monitoring_stack_if_needed
|
31
32
|
|
32
|
-
validate_all_resources
|
33
|
+
validate_all_resources unless ENV["POOLPARTY_NO_VALIDATION"]
|
33
34
|
end
|
34
35
|
|
35
36
|
# Freeze the cloud_name so we can't modify it at all, set the plugin_directory
|
@@ -59,7 +60,8 @@ module PoolParty
|
|
59
60
|
def using(provider_symbol, o={}, &block)
|
60
61
|
return @cloud_provider if @cloud_provider
|
61
62
|
self.cloud_provider_name = provider_symbol
|
62
|
-
cloud_provider(o, &block)
|
63
|
+
cloud_provider(ssh_options.merge(o), &block)
|
64
|
+
cloud_provider.keypair(keypair)
|
63
65
|
end
|
64
66
|
|
65
67
|
# Cloud provider methods
|
@@ -79,7 +81,7 @@ module PoolParty
|
|
79
81
|
return @cloud_provider if @cloud_provider
|
80
82
|
klass_name = "CloudProviders::#{cloud_provider_name}".classify
|
81
83
|
if provider_klass = CloudProviders.all.detect {|k| k.to_s == klass_name }
|
82
|
-
opts.merge!(:cloud => self, :keypair_name => self.keypair.
|
84
|
+
opts.merge!(:cloud => self, :keypair_name => self.keypair.full_filepath)
|
83
85
|
@cloud_provider = provider_klass.new(dsl_options.merge(opts), &block)
|
84
86
|
else
|
85
87
|
raise PoolParty::PoolPartyError.create("UnknownCloudProviderError", "Unknown cloud_provider: #{cloud_provider_name}")
|
@@ -4,7 +4,7 @@ module PoolParty
|
|
4
4
|
|
5
5
|
def steps
|
6
6
|
[
|
7
|
-
:
|
7
|
+
:ask_for_ec2_directory, :ask_for_access_key, :ask_for_private_access_key,
|
8
8
|
:show_env_setup
|
9
9
|
]
|
10
10
|
end
|
@@ -16,19 +16,7 @@ module PoolParty
|
|
16
16
|
def self.description
|
17
17
|
"Ec2 installer"
|
18
18
|
end
|
19
|
-
|
20
|
-
def find_ec2_directory
|
21
|
-
msg = "We found the following vmware files in the default vmware directory.\nChoose one of these to use as your vmrun file or select other\n<line>"
|
22
|
-
|
23
|
-
directories = {}
|
24
|
-
default_ec2_directories.each_with_index do |file,idx|
|
25
|
-
directories.merge!(idx+1 => file)
|
26
|
-
end
|
27
|
-
|
28
|
-
base = choose(msg, directories)
|
29
|
-
@ec2_directory = base == :other ? ask_for_ec2_directory : base
|
30
|
-
end
|
31
|
-
|
19
|
+
|
32
20
|
def ask_for_access_key
|
33
21
|
access_key_help =<<-EOV
|
34
22
|
EC2 uses an access key to identify you and allows you to start and stop instances.
|
@@ -7,7 +7,7 @@ module PoolParty
|
|
7
7
|
default_options :port => 80,
|
8
8
|
:www_user => 'www-data',
|
9
9
|
:www_dir => "/var/www",
|
10
|
-
:passenger_version => "2.2.
|
10
|
+
:passenger_version => "2.2.5"
|
11
11
|
|
12
12
|
def before_load
|
13
13
|
installed_as_worker
|
@@ -39,6 +39,13 @@ module PoolParty
|
|
39
39
|
def install_passenger
|
40
40
|
enable_passenger
|
41
41
|
end
|
42
|
+
|
43
|
+
|
44
|
+
# LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.5/ext/apache2/mod_passenger.so
|
45
|
+
# PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.5
|
46
|
+
# PassengerRuby /usr/bin/ruby1.8
|
47
|
+
#
|
48
|
+
# creating this thing below may not be being run b/c it checks for the passenger.conf which isn't really a good test
|
42
49
|
|
43
50
|
def enable_passenger
|
44
51
|
unless @enable_passenger
|
@@ -46,7 +53,7 @@ module PoolParty
|
|
46
53
|
has_package "build-essential"
|
47
54
|
has_package "apache2-prefork-dev"
|
48
55
|
has_gem_package "fastthread"
|
49
|
-
has_gem_package "passenger"
|
56
|
+
has_gem_package "passenger", :version => passenger_version
|
50
57
|
passenger_configs
|
51
58
|
|
52
59
|
has_exec "install_passenger_script" do
|
@@ -55,8 +62,8 @@ module PoolParty
|
|
55
62
|
requires get_exec("restart-apache2")
|
56
63
|
requires get_package("apache2")
|
57
64
|
requires get_gem_package("passenger")
|
58
|
-
not_if "test -
|
59
|
-
creates lambda { "
|
65
|
+
not_if "test -e \#{node[:passenger_site][:passenger_module_path]}"
|
66
|
+
# creates lambda { "passenger_site[:passenger_module_path]" }
|
60
67
|
end
|
61
68
|
|
62
69
|
@enable_passenger = true
|
@@ -65,15 +72,26 @@ module PoolParty
|
|
65
72
|
|
66
73
|
def passenger_configs
|
67
74
|
unless @passenger_configs
|
75
|
+
|
76
|
+
# requires doesn't work for has_variable?
|
68
77
|
|
78
|
+
# has_variable("passenger_version", passenger_version)
|
79
|
+
# has_variable("passenger_root_path", "\#{languages[:ruby][:gems_dir]}/gems/passenger-#{passenger_version}",
|
80
|
+
# :requires => get_variable("passenger_version"))
|
81
|
+
# has_variable("passenger_module_path", "\#{passenger_site[:passenger_root_path]}/ext/apache2/mod_passenger.so",
|
82
|
+
# :requires => get_variable("passenger_root_path"))
|
83
|
+
|
69
84
|
has_variable("passenger_version", passenger_version)
|
70
|
-
has_variable("passenger_root_path", "\#{languages[:ruby][:gems_dir]}/gems/passenger-#{passenger_version}"
|
71
|
-
|
85
|
+
has_variable("passenger_root_path", "\#{languages[:ruby][:gems_dir]}/gems/passenger-#{passenger_version}",
|
86
|
+
:requires => get_variable("passenger_version"))
|
87
|
+
has_variable("passenger_module_path", "\#{languages[:ruby][:gems_dir]}/gems/passenger-#{passenger_version}/ext/apache2/mod_passenger.so",
|
88
|
+
:requires => get_variable("passenger_root_path"))
|
72
89
|
|
73
90
|
has_file(:name => "/etc/apache2/mods-available/passenger.load") do
|
74
91
|
content <<-eof
|
75
92
|
LoadModule passenger_module <%= @node[:passenger_site][:passenger_module_path] %>
|
76
93
|
eof
|
94
|
+
requires get_exec("install_passenger_script")
|
77
95
|
end
|
78
96
|
|
79
97
|
has_file(:name => "/etc/apache2/mods-available/passenger.conf") do
|
@@ -81,9 +99,10 @@ LoadModule passenger_module <%= @node[:passenger_site][:passenger_module_path] %
|
|
81
99
|
PassengerRoot <%= @node[:passenger_site][:passenger_root_path] %>
|
82
100
|
PassengerRuby <%= @node[:languages][:ruby][:ruby_bin] %>
|
83
101
|
eof
|
102
|
+
requires get_exec("install_passenger_script")
|
84
103
|
end
|
85
104
|
|
86
|
-
present_apache_module(:passenger)
|
105
|
+
present_apache_module(:passenger, {:requires => get_file("/etc/apache2/mods-available/passenger.load")})
|
87
106
|
@passenger_configs = true
|
88
107
|
end
|
89
108
|
end
|
@@ -159,9 +178,9 @@ PassengerRuby <%= @node[:languages][:ruby][:ruby_bin] %>
|
|
159
178
|
def install_site(name, opts={})
|
160
179
|
sitename = name
|
161
180
|
|
162
|
-
opts.merge!(:name => "/etc/apache2/sites-available/#{sitename}")
|
181
|
+
opts.merge!(:name => "/etc/apache2/sites-available/#{sitename}", :requires => get_package("apache2"))
|
163
182
|
has_directory(:name => "/etc/apache2/sites-available")
|
164
|
-
has_file(opts) unless opts[:no_file]
|
183
|
+
has_file(opts, :requires => get_package("apache2")) unless opts[:no_file]
|
165
184
|
has_exec(:name => "/usr/sbin/a2ensite #{sitename}") do
|
166
185
|
notifies get_exec("reload-apache2"), :run
|
167
186
|
requires get_exec("reload-apache2")
|
@@ -175,12 +194,14 @@ PassengerRuby <%= @node[:languages][:ruby][:ruby_bin] %>
|
|
175
194
|
end
|
176
195
|
|
177
196
|
def present_apache_module(*names)
|
197
|
+
opts = names.pop if names.last.kind_of?(::Hash)
|
178
198
|
names.each do |name|
|
179
199
|
has_exec(:name => "mod-#{name}", :command => "/usr/sbin/a2enmod #{name}") do
|
180
200
|
not_if "/bin/sh -c \'[ -L /etc/apache2/mods-enabled/#{name}.load ] && [ /etc/apache2/mods-enabled/#{name}.load -ef /etc/apache2/mods-available/#{name}.load ]\'"
|
181
201
|
requires get_package("apache2")
|
182
202
|
notifies get_exec("force-reload-apache2"), :run
|
183
203
|
requires get_exec("force-reload-apache2")
|
204
|
+
requires opts[:requires] if opts && opts[:requires]
|
184
205
|
end
|
185
206
|
end
|
186
207
|
end
|
@@ -34,7 +34,7 @@ module PoolParty
|
|
34
34
|
# setup an initial symlink so apache will start even if there have not been any deploys yet
|
35
35
|
#has_site_directory "releases/initial/public"
|
36
36
|
#FIXME the following line is chef specific. It will fail with puppet
|
37
|
-
has_link(:target_file => "#{dir}/#{name}/current", :to => "#{dir}/#{name}/releases/initial")
|
37
|
+
has_link(:target_file => "#{dir}/#{name}/current", :to => "#{dir}/#{name}/releases/initial", :requires => get_directory(site_directory))
|
38
38
|
end
|
39
39
|
log_dir = "#{site_directory}/shared/log"
|
40
40
|
appended_path "current"
|
data/lib/poolparty/pool.rb
CHANGED
@@ -97,7 +97,7 @@ module PoolParty
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def self.clouds_dot_rb_dir(n=nil)
|
100
|
-
File.dirname(self.clouds_dot_rb_file)
|
100
|
+
self.clouds_dot_rb_file ? File.dirname(self.clouds_dot_rb_file) : "./"
|
101
101
|
end
|
102
102
|
|
103
103
|
# Load the default clouds.rb file
|
@@ -155,7 +155,7 @@ module PoolParty
|
|
155
155
|
$:.unshift("#{File.dirname(filepath)}/lib")
|
156
156
|
$:.unshift("#{File.dirname(filepath)}/plugins")
|
157
157
|
|
158
|
-
Dir["#{File.dirname(filepath)}/lib
|
158
|
+
Dir["#{File.dirname(filepath)}/lib/*.rb"].each {|lib_path| require lib_path }
|
159
159
|
Dir["#{File.dirname(filepath)}/plugins/*"].each do |plugin_path|
|
160
160
|
if File.directory?(plugin_path)
|
161
161
|
$:.unshift(plugin_path)
|
data/lib/poolparty/resource.rb
CHANGED
@@ -15,6 +15,7 @@ module PoolParty
|
|
15
15
|
def initialize(opts={}, extra_opts={}, exists=true, &block)
|
16
16
|
@exists ||= exists
|
17
17
|
super(opts, extra_opts, &block)
|
18
|
+
after_loaded_requires_parent
|
18
19
|
valid?
|
19
20
|
end
|
20
21
|
|
@@ -69,6 +70,11 @@ module PoolParty
|
|
69
70
|
other_resources_obj.each do |obj|
|
70
71
|
requires(obj)
|
71
72
|
end
|
73
|
+
else
|
74
|
+
# When is an object
|
75
|
+
# k = other_resources_obj.has_method_name
|
76
|
+
# dependencies[k] ||= []
|
77
|
+
# dependencies[k] << other_resources_obj.name
|
72
78
|
end
|
73
79
|
end
|
74
80
|
|
@@ -114,7 +120,7 @@ module PoolParty
|
|
114
120
|
def after_compile
|
115
121
|
end
|
116
122
|
|
117
|
-
def
|
123
|
+
def after_loaded_requires_parent
|
118
124
|
requires parent if parent && !parent.is_a?(PoolParty::Cloud) && !parent.is_a?(PoolParty::Pool)
|
119
125
|
end
|
120
126
|
|
@@ -162,8 +168,8 @@ module PoolParty
|
|
162
168
|
def self.define_resource_methods
|
163
169
|
defined_resources.each do |res|
|
164
170
|
next if res.method_defined?
|
165
|
-
ddputs "Defining resource: #{res} as #{res.has_method_name}"
|
166
|
-
define_resource(res)
|
171
|
+
ddputs "Defining resource: #{res} as #{res.has_method_name} on #{self}"
|
172
|
+
define_resource(res, is_base_resource_class? ? Base : self)
|
167
173
|
res.method_defined!
|
168
174
|
unless res.defined_resources.empty?
|
169
175
|
res.define_resource_methods
|
@@ -171,10 +177,14 @@ module PoolParty
|
|
171
177
|
end
|
172
178
|
end
|
173
179
|
|
180
|
+
def self.is_base_resource_class?
|
181
|
+
self.to_s == PoolParty::Resource.to_s
|
182
|
+
end
|
183
|
+
|
174
184
|
# Define the resource on the base class so it's available across all
|
175
185
|
# PoolParty classes that use Base
|
176
|
-
def self.define_resource(res)
|
177
|
-
|
186
|
+
def self.define_resource(res, base_klass=Base)
|
187
|
+
base_klass.class_eval <<-EOE
|
178
188
|
def has_#{res.has_method_name}(a={},b={},e=true, &block)
|
179
189
|
obj = #{res}.new(a,b,e,&block)
|
180
190
|
resources << obj
|
@@ -252,14 +262,7 @@ module PoolParty
|
|
252
262
|
"#{obj.to_i}"
|
253
263
|
end
|
254
264
|
when String
|
255
|
-
|
256
|
-
when /^\d{4}$/
|
257
|
-
"#{obj}"
|
258
|
-
when /^\d{3}$/
|
259
|
-
"0#{obj}"
|
260
|
-
else
|
261
|
-
"\"#{obj}\""
|
262
|
-
end
|
265
|
+
"\"#{obj}\""
|
263
266
|
when Proc
|
264
267
|
obj.call # eh
|
265
268
|
when Array
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module PoolParty
|
2
|
+
module Resources
|
3
|
+
|
4
|
+
class FakeSubclassedPlugin < Resource
|
5
|
+
|
6
|
+
def self.has_method_name
|
7
|
+
"subclassed"
|
8
|
+
end
|
9
|
+
|
10
|
+
def after_loaded
|
11
|
+
has_file "/etc/my_configs/special_config" do
|
12
|
+
requires get_directory("/etc/my_configs")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -1,11 +1,20 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/../../../test_helper"
|
2
2
|
require File.dirname(__FILE__)+"/ec2_test.rb"
|
3
3
|
|
4
|
+
stub_keypair_searchable_paths
|
5
|
+
|
4
6
|
class Ec2InstanceTest < Test::Unit::TestCase
|
5
7
|
include CloudProviders
|
6
|
-
|
8
|
+
|
9
|
+
def setup
|
10
|
+
clear!
|
11
|
+
@filepath = fixtures_dir/"clouds/simple_cloud.rb"
|
12
|
+
@pool = PoolParty::Pool.load_from_file(@filepath)
|
13
|
+
@cloud = @pool.clouds[@pool.clouds.keys.first]
|
14
|
+
end
|
15
|
+
|
7
16
|
def inst
|
8
|
-
@inst ||=
|
17
|
+
@inst ||= @cloud.describe_instances.first
|
9
18
|
end
|
10
19
|
|
11
20
|
def test_has_cloud_provider
|
@@ -20,18 +29,18 @@ class Ec2InstanceTest < Test::Unit::TestCase
|
|
20
29
|
def test_to_s
|
21
30
|
vals = inst.to_s.split("\t")
|
22
31
|
assert_equal 3, vals.size
|
23
|
-
assert_equal '
|
32
|
+
assert_equal 'simple_cloud', vals.first
|
24
33
|
end
|
25
34
|
|
26
35
|
def test_has_cloud_set_when_created_from_cloud
|
27
|
-
assert_equal
|
28
|
-
assert_equal
|
29
|
-
assert_equal '
|
30
|
-
assert_equal '
|
36
|
+
assert_equal @cloud, @cloud.cloud_provider.cloud
|
37
|
+
assert_equal @cloud, inst.cloud
|
38
|
+
assert_equal 'simple_cloud', inst.dsl_options[:cloud_name]
|
39
|
+
assert_equal 'simple_cloud', inst.to_hash[:cloud_name]
|
31
40
|
end
|
32
41
|
|
33
42
|
def test_cloud_keypair
|
34
|
-
assert_equal
|
43
|
+
assert_equal @cloud.keypair.to_s, inst.keypair.to_s
|
35
44
|
end
|
36
45
|
|
37
46
|
def test_refresh!
|
@@ -5,7 +5,7 @@ stub_ec2_calls
|
|
5
5
|
class Ec2ProviderTest < Test::Unit::TestCase
|
6
6
|
|
7
7
|
def ec2
|
8
|
-
@ec2 ||=
|
8
|
+
@ec2 ||= @cloud.cloud_provider
|
9
9
|
end
|
10
10
|
|
11
11
|
def setup
|
@@ -13,11 +13,15 @@ class Ec2ProviderTest < Test::Unit::TestCase
|
|
13
13
|
:image_id => "ami-abc123",
|
14
14
|
:keypair => fixtures_dir/'keys/test_key'
|
15
15
|
)
|
16
|
+
|
17
|
+
@filepath = fixtures_dir/"clouds/simple_cloud.rb"
|
18
|
+
@pool = PoolParty::Pool.load_from_file(@filepath)
|
19
|
+
@cloud = @pool.clouds[@pool.clouds.keys.first]
|
16
20
|
end
|
17
21
|
|
18
22
|
def test_setup
|
19
|
-
assert_not_nil
|
20
|
-
assert_not_nil
|
23
|
+
assert_not_nil @cloud
|
24
|
+
assert_not_nil @cloud.keypair
|
21
25
|
end
|
22
26
|
|
23
27
|
|
@@ -67,9 +71,9 @@ class Ec2ProviderTest < Test::Unit::TestCase
|
|
67
71
|
end
|
68
72
|
|
69
73
|
def test_basic_setup
|
70
|
-
assert_equal :ec2,
|
71
|
-
assert_instance_of CloudProviders::Ec2,
|
72
|
-
assert_instance_of RightAws::Ec2,
|
74
|
+
assert_equal :ec2, @cloud.cloud_provider_name
|
75
|
+
assert_instance_of CloudProviders::Ec2, @cloud.cloud_provider
|
76
|
+
assert_instance_of RightAws::Ec2, @cloud.cloud_provider.ec2
|
73
77
|
end
|
74
78
|
|
75
79
|
def test_that_test_ec2_env_variables_are_set
|
@@ -89,7 +93,7 @@ class Ec2ProviderTest < Test::Unit::TestCase
|
|
89
93
|
end
|
90
94
|
|
91
95
|
def test_cloud_is_set_when_created_from_a_cloud
|
92
|
-
assert_equal
|
96
|
+
assert_equal @cloud, @cloud.cloud_provider.cloud
|
93
97
|
end
|
94
98
|
|
95
99
|
def test_inherited_default_options
|
@@ -98,10 +102,10 @@ class Ec2ProviderTest < Test::Unit::TestCase
|
|
98
102
|
end
|
99
103
|
|
100
104
|
def amazon?
|
101
|
-
stub(
|
102
|
-
assert
|
103
|
-
stub(
|
104
|
-
assert
|
105
|
+
stub(@cloud.cloud_provider).ec2_url {'http://example.com'}
|
106
|
+
assert @cloud.cloud_provider.eucalyptus?
|
107
|
+
stub(@cloud.cloud_provider).ec2_url {'https://ec2.amazonaws.com'}
|
108
|
+
assert !@cloud.cloud_provider.eucalyptus?
|
105
109
|
end
|
106
110
|
|
107
111
|
def test_aws_hash
|
@@ -26,10 +26,10 @@ class RemoteDirectoryResourceTest < Test::Unit::TestCase
|
|
26
26
|
remote_directory "/tmp/remote_something" do
|
27
27
|
source "something"
|
28
28
|
files_backup 10
|
29
|
-
files_mode 0644
|
29
|
+
files_mode "0644"
|
30
30
|
action :create
|
31
31
|
recursive false
|
32
|
-
mode 0755
|
32
|
+
mode "0755"
|
33
33
|
owner "nobody"
|
34
34
|
group "nobody"
|
35
35
|
files_owner "root"
|
@@ -54,7 +54,7 @@ class ChefTest < Test::Unit::TestCase
|
|
54
54
|
|
55
55
|
def test_compile_to_the_recipes
|
56
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
|
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
58
|
end
|
59
59
|
|
60
60
|
def test_compile_the_recipes
|
@@ -78,14 +78,14 @@ template "/etc/motd" do
|
|
78
78
|
source "/etc/motd.erb"
|
79
79
|
action :create
|
80
80
|
backup 5
|
81
|
-
mode 0644
|
81
|
+
mode "0644"
|
82
82
|
owner "root"
|
83
83
|
end
|
84
84
|
|
85
85
|
directory "/etc/poolparty" do
|
86
86
|
action :create
|
87
87
|
recursive true
|
88
|
-
mode 0644
|
88
|
+
mode "0644"
|
89
89
|
owner "root"
|
90
90
|
group "root"
|
91
91
|
end
|
@@ -34,106 +34,121 @@ class CloudTest < Test::Unit::TestCase
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def test_have_a_keypair
|
37
|
-
assert_not_nil
|
38
|
-
assert_equal 'test_key',
|
37
|
+
assert_not_nil @cloud.keypair
|
38
|
+
assert_equal 'test_key', @cloud.keypair.basename
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_set_the_dependency_resolver
|
42
|
-
|
43
|
-
assert_equal DependencyResolvers::Chef,
|
42
|
+
@cloud.dependency_resolver(:chef)
|
43
|
+
assert_equal DependencyResolvers::Chef, @cloud.dependency_resolver
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_can_use_basic_resources
|
47
|
-
|
47
|
+
@cloud.instance_eval do
|
48
48
|
has_file "/etc/motd"
|
49
49
|
end
|
50
|
-
assert_equal "/etc/motd",
|
50
|
+
assert_equal "/etc/motd", @cloud.files.first.name
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_have_a_temp_path_of_the_name_as_Default_tmp_path_pool_name_cloud_name
|
54
|
-
assert_equal PoolParty::Default.tmp_path/"poolparty"/"
|
54
|
+
assert_equal PoolParty::Default.tmp_path/"poolparty"/"simple_cloud", @cloud.tmp_path
|
55
55
|
end
|
56
56
|
|
57
57
|
def test_be_using_ec2_cloud_provider_by_default
|
58
|
-
assert_equal :ec2,
|
59
|
-
assert_kind_of ::CloudProviders::Ec2,
|
58
|
+
assert_equal :ec2, @cloud.cloud_provider_name
|
59
|
+
assert_kind_of ::CloudProviders::Ec2, @cloud.cloud_provider
|
60
60
|
end
|
61
61
|
|
62
62
|
def test_raise_if_the_cloud_provider_is_not_a_known_type
|
63
63
|
PoolParty::PoolPartyError.create("UnknownCloudProviderError")
|
64
64
|
assert_raises UnknownCloudProviderError do
|
65
|
-
|
66
|
-
|
65
|
+
@cloud.cloud_provider_name = :not_a_cloud_provider
|
66
|
+
@cloud.cloud_provider
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
70
|
def test_set_the_cloud_provider_cloud_and_keypair_with_cloud_provider
|
71
|
-
assert_equal
|
72
|
-
assert_equal
|
71
|
+
assert_equal @cloud, @cloud.cloud_provider.cloud
|
72
|
+
assert_equal @cloud.keypair.basename, @cloud.cloud_provider.keypair_name
|
73
73
|
end
|
74
74
|
|
75
75
|
def test_set_the_cloud_provider_with_a_using_block
|
76
|
-
|
76
|
+
@cloud.instance_eval do
|
77
|
+
keypair "test_key"
|
77
78
|
using :ec2 do
|
78
79
|
image_id 'emi-39921602'
|
79
80
|
end
|
80
81
|
end
|
81
|
-
assert_equal :ec2,
|
82
|
-
assert_equal CloudProviders::Ec2,
|
83
|
-
assert_equal "emi-39921602",
|
82
|
+
assert_equal :ec2, @cloud.cloud_provider_name
|
83
|
+
assert_equal CloudProviders::Ec2, @cloud.cloud_provider.class
|
84
|
+
assert_equal "emi-39921602", @cloud.cloud_provider.image_id
|
84
85
|
end
|
85
86
|
|
86
87
|
def test_nodes
|
87
|
-
assert_respond_to
|
88
|
-
assert_respond_to
|
89
|
-
assert
|
88
|
+
assert_respond_to @cloud, :nodes
|
89
|
+
assert_respond_to @cloud.nodes, :each
|
90
|
+
assert @cloud.nodes.size>1
|
90
91
|
end
|
91
92
|
|
92
93
|
def test_terminate!
|
93
|
-
assert
|
94
|
-
result =
|
94
|
+
assert @cloud.nodes.size > 0
|
95
|
+
result = @cloud.terminate!
|
95
96
|
assert_respond_to result, :each
|
96
97
|
assert_equal 'shutting-down', result.first.status
|
97
98
|
end
|
98
99
|
|
99
100
|
def test_run
|
100
101
|
# WHAT?
|
101
|
-
# result =
|
102
|
+
# result = @cloud.run('uptime')
|
102
103
|
# assert_match /uptime/, result["app"]
|
103
104
|
end
|
104
105
|
|
105
106
|
def test_os
|
106
|
-
assert_equal :centos,
|
107
|
+
assert_equal :centos, @cloud.os
|
107
108
|
end
|
108
109
|
|
109
110
|
def test_expansion
|
110
111
|
#TODO: improve this test
|
111
|
-
# size =
|
112
|
-
# assert_equal size+1,
|
113
|
-
# assert_nothing_raised
|
112
|
+
# size = @cloud.nodes.size
|
113
|
+
# assert_equal size+1, @cloud.expand.nodes.size
|
114
|
+
# assert_nothing_raised @cloud.expand
|
114
115
|
end
|
115
116
|
|
116
117
|
def test_contract!
|
117
118
|
#TODO: need to better mock the terminate! ec2 call
|
118
|
-
# size =
|
119
|
-
# result =
|
119
|
+
# size = @cloud.nodes.size
|
120
|
+
# result = @cloud.contract!
|
120
121
|
# assert_equal 'shuttin-down', result.status
|
121
|
-
# assert_equal size-1,
|
122
|
+
# assert_equal size-1, @cloud.nodes.size
|
122
123
|
end
|
123
124
|
|
124
125
|
def test_change_ssh_port
|
125
126
|
clear!
|
126
127
|
pool "ssh_port" do
|
127
128
|
cloud "babity" do
|
129
|
+
keypair "test_key"
|
128
130
|
ssh_port 1922
|
129
131
|
end
|
130
|
-
cloud "noneity" do
|
131
|
-
end
|
132
132
|
end
|
133
133
|
assert_equal 1922, clouds["babity"].ssh_port
|
134
134
|
assert_equal 22, clouds["noneity"].ssh_port
|
135
135
|
end
|
136
136
|
|
137
|
+
def test_change_ssh_port
|
138
|
+
clear!
|
139
|
+
pool "ssher" do
|
140
|
+
cloud "custom" do
|
141
|
+
keypair "test_key"
|
142
|
+
ssh_options("-P" => "1992")
|
143
|
+
end
|
144
|
+
cloud "noneity" do
|
145
|
+
keypair "test_key"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
assert_equal "1992", clouds["custom"].ssh_options["-P"]
|
149
|
+
end
|
150
|
+
|
151
|
+
|
137
152
|
def test_children_getting_parent_options
|
138
153
|
clear!
|
139
154
|
pool "outside" do
|
@@ -11,9 +11,9 @@ class PoolTest < Test::Unit::TestCase
|
|
11
11
|
should "load the file with load_from_file on Pool" do
|
12
12
|
PoolParty::Pool.load_from_file(@filepath)
|
13
13
|
assert_equal PoolParty::Pool, pools["poolparty"].class
|
14
|
-
assert_equal PoolParty::Cloud, pools["poolparty"].clouds["
|
15
|
-
assert_equal "test_key", pools["poolparty"].clouds["
|
16
|
-
assert_equal "/etc/motd", pools["poolparty"].clouds["
|
14
|
+
assert_equal PoolParty::Cloud, pools["poolparty"].clouds["simple_cloud"].class
|
15
|
+
assert_equal "test_key", pools["poolparty"].clouds["simple_cloud"].keypair.basename
|
16
|
+
assert_equal "/etc/motd", pools["poolparty"].clouds["simple_cloud"].files.first.name
|
17
17
|
end
|
18
18
|
|
19
19
|
should "find_and_load_default_clouds_dot_rb in Pool" do
|
@@ -73,8 +73,6 @@ class ResourceTest < Test::Unit::TestCase
|
|
73
73
|
assert_equal @inst.print_variable(:a), ":a"
|
74
74
|
assert_equal @inst.print_variable({:a => "a"}), ":a => \"a\""
|
75
75
|
assert_equal @inst.print_variable(644), "644"
|
76
|
-
assert_equal @inst.print_variable("0755"), "0755"
|
77
|
-
assert_equal @inst.print_variable("755"), "0755"
|
78
76
|
assert_equal @inst.print_variable(@inst), @inst.to_s
|
79
77
|
assert_equal @inst.print_variable(nil), nil
|
80
78
|
end
|
@@ -147,4 +145,18 @@ class ResourceTest < Test::Unit::TestCase
|
|
147
145
|
end
|
148
146
|
end
|
149
147
|
|
148
|
+
def test_a_subclassed_resource_has_the_method_of_the_subclassed_resource
|
149
|
+
pool "oblong" do
|
150
|
+
cloud "piece" do
|
151
|
+
fake_plugin do
|
152
|
+
has_subclassed "box"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
assert_equal PoolParty::Resources::FakePlugin, clouds["piece"].resources.first.class
|
158
|
+
assert_equal PoolParty::Resources::FakeSubclassedPlugin, clouds["piece"].resources.first.resources[0].class
|
159
|
+
assert_equal 1, clouds["piece"].resources.first.resources[0].resources.size
|
160
|
+
end
|
161
|
+
|
150
162
|
end
|
@@ -12,7 +12,7 @@ class DirectoryResourceTest < Test::Unit::TestCase
|
|
12
12
|
end
|
13
13
|
|
14
14
|
should "have the directory method denoted by has_method_name" do
|
15
|
-
str = "directory \"/etc/poolparty\" do\n action :create\n recursive true\n mode 0644\n owner \"root\"\n group \"root\"\nend\n"
|
15
|
+
str = "directory \"/etc/poolparty\" do\n action :create\n recursive true\n mode \"0644\"\n owner \"root\"\n group \"root\"\nend\n"
|
16
16
|
assert_equal str, @base.compile(@res)
|
17
17
|
end
|
18
18
|
|
@@ -13,7 +13,7 @@ class DirectoryResourceTest < Test::Unit::TestCase
|
|
13
13
|
end
|
14
14
|
|
15
15
|
should "have the template method denoted by has_method_name" do
|
16
|
-
str = "template \"/etc/poolparty/lyrics\" do\n source \"/etc/poolparty/lyrics.erb\"\n action :create\n backup 5\n mode 0644\n owner \"root\"\nend\n"
|
16
|
+
str = "template \"/etc/poolparty/lyrics\" do\n source \"/etc/poolparty/lyrics.erb\"\n action :create\n backup 5\n mode \"0644\"\n owner \"root\"\nend\n"
|
17
17
|
|
18
18
|
assert_equal str, @base.compile(@res)
|
19
19
|
assert_equal "I'm just a file, a lonely little file in the world", open(@cookboox_directory/"templates"/"default"/"etc"/"poolparty"/"lyrics.erb").read
|
@@ -16,29 +16,4 @@ class BootstrapperTest < Test::Unit::TestCase
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
context "configure_script" do
|
20
|
-
setup do
|
21
|
-
clear!
|
22
|
-
@filepath = fixtures_dir/"clouds/simple_cloud.rb"
|
23
|
-
@pool = PoolParty::Pool.load_from_file(@filepath)
|
24
|
-
@cloud = @pool.clouds[@pool.clouds.keys.first]
|
25
|
-
@outfile = test_dir/"configure_script.sh"
|
26
|
-
end
|
27
|
-
|
28
|
-
should "get the script for ubuntu" do
|
29
|
-
assert_equal File.expand_path(@outfile), Provision::Bootstrapper.configure_script(@cloud, :ubuntu, @outfile)
|
30
|
-
end
|
31
|
-
|
32
|
-
should "output some stuffies" do
|
33
|
-
assert_match /echo app > \/etc\/poolparty\/cloud_name/, open(@outfile).read
|
34
|
-
assert_match /echo poolparty > \/etc\/poolparty\/pool_name/, open(@outfile).read
|
35
|
-
end
|
36
|
-
|
37
|
-
should "raise an exception if the os isn't supported yet" do
|
38
|
-
assert_raises StandardError do
|
39
|
-
Provision::Bootstrapper.configure_script(@cloud, :non_existant_os)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
19
|
end
|
data/test/test_helper.rb
CHANGED
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.14
|
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-18 00:00:00 -07:00
|
15
15
|
default_executable:
|
16
16
|
dependencies: []
|
17
17
|
|
@@ -276,6 +276,7 @@ files:
|
|
276
276
|
- test/fixtures/keys/test_pub_key
|
277
277
|
- test/fixtures/resources/fake_plugin.rb
|
278
278
|
- test/fixtures/resources/fake_resource.rb
|
279
|
+
- test/fixtures/resources/fake_subclassed_plugin.rb
|
279
280
|
- test/fixtures/resources/random_proc_file.rb
|
280
281
|
- test/fixtures/templates/apache_conf.erb
|
281
282
|
- test/fixtures/test_template.erb
|
@@ -1114,6 +1115,7 @@ files:
|
|
1114
1115
|
- vendor/gems/trollop/www/index.html
|
1115
1116
|
has_rdoc: false
|
1116
1117
|
homepage: http://poolpartyrb.com
|
1118
|
+
licenses:
|
1117
1119
|
post_install_message:
|
1118
1120
|
rdoc_options:
|
1119
1121
|
- --quiet
|
@@ -1139,7 +1141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1139
1141
|
requirements: []
|
1140
1142
|
|
1141
1143
|
rubyforge_project:
|
1142
|
-
rubygems_version: 1.
|
1144
|
+
rubygems_version: 1.3.5
|
1143
1145
|
signing_key:
|
1144
1146
|
specification_version: 3
|
1145
1147
|
summary: Self-healing, auto-scaling system administration, provisioning and maintaining tool that makes cloud computing easier.
|