auser-poolparty 0.2.90 → 0.2.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Manifest.txt +1 -1
- data/PostInstall.txt +1 -1
- data/README.txt +3 -4
- data/bin/cloud-handle-load +3 -3
- data/bin/server-build-messenger +1 -1
- data/lib/poolparty/base_packages/haproxy.rb +3 -1
- data/lib/poolparty/core/object.rb +5 -5
- data/lib/poolparty/dependency_resolutions/puppet.rb +6 -2
- data/lib/poolparty/helpers/binary.rb +2 -1
- data/lib/poolparty/helpers/optioner.rb +1 -1
- data/lib/poolparty/modules/cloud_resourcer.rb +29 -2
- data/lib/poolparty/modules/resourcing_dsl.rb +6 -0
- data/lib/poolparty/net/remote_bases/ec2.rb +9 -8
- data/lib/poolparty/net/remoter.rb +7 -7
- data/lib/poolparty/plugins/git.rb +10 -4
- data/lib/poolparty/plugins/rsyncmirror.rb +5 -2
- data/lib/poolparty/poolparty/cloud.rb +0 -11
- data/lib/poolparty/poolparty/resource.rb +33 -25
- data/lib/poolparty/poolparty/resources/class_package.rb +13 -6
- data/lib/poolparty/poolparty/resources/symlink.rb +3 -1
- data/lib/{poolpartyspec.rb → poolparty/spec.rb} +1 -1
- data/lib/poolparty/version.rb +1 -1
- data/poolparty.gemspec +4 -4
- data/spec/poolparty/bin/console_spec.rb +2 -1
- data/spec/poolparty/helpers/binary_spec.rb +1 -1
- data/spec/poolparty/net/remote_spec.rb +7 -7
- data/spec/poolparty/plugins/git_spec.rb +5 -5
- data/spec/poolparty/poolparty/resources/user_spec.rb +3 -2
- data/spec/poolparty/poolparty_spec.rb +3 -0
- data/spec/poolparty/spec_helper.rb +5 -0
- data/website/index.html +1 -1
- metadata +4 -4
data/Manifest.txt
CHANGED
@@ -276,6 +276,7 @@ lib/poolparty/provisioners/capistrano/recipies/base.rb
|
|
276
276
|
lib/poolparty/provisioners/capistrano/recipies/master.rb
|
277
277
|
lib/poolparty/provisioners/capistrano/recipies/slave.rb
|
278
278
|
lib/poolparty/provisioners/provisioner_base.rb
|
279
|
+
lib/poolparty/spec.rb
|
279
280
|
lib/poolparty/spec/core/string.rb
|
280
281
|
lib/poolparty/spec/matchers/a_spec_extensions_base.rb
|
281
282
|
lib/poolparty/spec/matchers/have_cron.rb
|
@@ -319,7 +320,6 @@ lib/poolparty/templates/puppetrunner
|
|
319
320
|
lib/poolparty/templates/yaws.conf
|
320
321
|
lib/poolparty/version.rb
|
321
322
|
lib/poolpartycl.rb
|
322
|
-
lib/poolpartyspec.rb
|
323
323
|
log/pool.log
|
324
324
|
poolparty.gemspec
|
325
325
|
script/destroy
|
data/PostInstall.txt
CHANGED
data/README.txt
CHANGED
@@ -39,15 +39,14 @@ COMING SOON
|
|
39
39
|
sudo gem install auser-poolparty
|
40
40
|
|
41
41
|
== TODO:
|
42
|
-
*
|
42
|
+
* Update hot reloading of puppet (force-reload?)
|
43
43
|
* Add pingback for nodes to master when failure occurs
|
44
44
|
* Add become master for the nodes
|
45
|
-
* Add
|
45
|
+
* Add hot reload to haproxy while reconfiguring
|
46
46
|
* Replace services with Runit
|
47
|
-
* Add more granular spec helpers
|
48
47
|
* Refactor provisioning to use erlang
|
49
48
|
* Add queuing of tasks on the messenger
|
50
|
-
* Add
|
49
|
+
* Add syntax checker on the manifests
|
51
50
|
|
52
51
|
== LICENSE:
|
53
52
|
|
data/bin/cloud-handle-load
CHANGED
@@ -11,13 +11,13 @@ o.loaded_clouds.each do |cloud|
|
|
11
11
|
|
12
12
|
with_cloud(cloud) do
|
13
13
|
vputs header("Load handling cloud #{name}")
|
14
|
-
vputs "
|
15
|
-
if
|
14
|
+
vputs "can_expand_cloud: #{can_contract_cloud?}"
|
15
|
+
if can_expand_cloud?
|
16
16
|
vputs "Expanding cloud based on load"
|
17
17
|
log.debug "Expanding cloud based on load"
|
18
18
|
log.debug rules_values
|
19
19
|
expand_cloud_if_necessary
|
20
|
-
elsif
|
20
|
+
elsif can_contract_cloud?
|
21
21
|
vputs "Contracting cloud based on load"
|
22
22
|
log.debug rules_values
|
23
23
|
contract_cloud_if_necessary
|
data/bin/server-build-messenger
CHANGED
@@ -24,5 +24,5 @@ EOE
|
|
24
24
|
vputs "** Building messenger **", o
|
25
25
|
vputs "Running command #{cmd.runnable}", o
|
26
26
|
|
27
|
-
beams_not_running = %x[ps aux | grep beam | grep master].
|
27
|
+
beams_not_running = %x[ps aux | grep beam | grep master | grep -v grep].empty?
|
28
28
|
out = %x[#{cmd.runnable}] if beams_not_running
|
@@ -23,7 +23,9 @@ module PoolParty
|
|
23
23
|
has_line_in_file("SYSLOGD=\"-r\"", "/etc/default/syslogd")
|
24
24
|
has_line_in_file("local0.* /var/log/haproxy.log", "/etc/syslog.conf", {:notify => get_service("sysklogd")})
|
25
25
|
|
26
|
-
has_exec(:name => "reloadhaproxy",
|
26
|
+
has_exec(:name => "reloadhaproxy",
|
27
|
+
:command => "/etc/init.d/haproxy reload",
|
28
|
+
:requires => get_package("haproxy"))
|
27
29
|
# Service is required
|
28
30
|
has_service(:name => "haproxy", :ensures => "running", :hasrestart => true, :notify => get_exec("reloadhaproxy"))
|
29
31
|
|
@@ -80,13 +80,13 @@ class Object
|
|
80
80
|
meta_undef name rescue ""
|
81
81
|
end
|
82
82
|
def vputs(m="", o=self)
|
83
|
-
puts m if o.verbose
|
84
|
-
end
|
85
|
-
def dputs(m="", o=self)
|
86
|
-
vputs(">#{::File.basename(__FILE__)} (#{__LINE__}) #{m}", o)
|
83
|
+
puts m if o.verbose rescue ""
|
87
84
|
end
|
88
85
|
def vprint(m="", o=self)
|
89
|
-
print m if o.verbose
|
86
|
+
print m if o.verbose rescue ""
|
87
|
+
end
|
88
|
+
def dputs(m="", o=self)
|
89
|
+
puts m if o.debugging rescue ""
|
90
90
|
end
|
91
91
|
def unix_hide_string
|
92
92
|
"2>&1 > /dev/null"
|
@@ -25,12 +25,14 @@ module PoolParty
|
|
25
25
|
# Generic to_s
|
26
26
|
# Most Resources won't need to extend this
|
27
27
|
def to_string(pre="")
|
28
|
+
return "" if printed?
|
28
29
|
opts = get_modified_options
|
30
|
+
|
29
31
|
returning Array.new do |output|
|
30
32
|
unless cancelled?
|
31
33
|
output << @prestring || ""
|
32
34
|
|
33
|
-
if resources && !resources.empty?
|
35
|
+
if resources && !resources.empty?
|
34
36
|
output << resources_string_from_resources(resources, pre)
|
35
37
|
end
|
36
38
|
|
@@ -39,13 +41,15 @@ module PoolParty
|
|
39
41
|
output << opts.flush_out("#{pre*2}").join(",\n")
|
40
42
|
output << "#{pre}}"
|
41
43
|
end
|
42
|
-
|
44
|
+
|
45
|
+
printed
|
43
46
|
output << @poststring || ""
|
44
47
|
end
|
45
48
|
end.join("\n")
|
46
49
|
end
|
47
50
|
|
48
51
|
def resources_string_from_resources(res, pre="\t")
|
52
|
+
return nil if res.keys == [:classpackage] && res.size == 1
|
49
53
|
@variables = res.extract! {|name,resource| name == :variable}
|
50
54
|
|
51
55
|
returning Array.new do |str|
|
@@ -3,7 +3,8 @@ module PoolParty
|
|
3
3
|
|
4
4
|
# Load a file that contains a pool into memory
|
5
5
|
def load_pool(filename=nil)
|
6
|
-
filename = Dir["#{Dir.pwd}/**/*.rb"].select {|f| ::File.basename(f) == "clouds.rb" }.first unless filename
|
6
|
+
filename = Binary.get_existing_spec_location#Dir["#{Dir.pwd}/**/*.rb"].select {|f| ::File.basename(f) == "clouds.rb" }.first unless filename
|
7
|
+
dputs "Using spec at #{filename}"
|
7
8
|
|
8
9
|
unless filename && ::File.readable?(filename)
|
9
10
|
puts "Please specify your cloud with -s, move it to ./clouds.rb or in your POOL_SPEC environment variable"
|
@@ -83,7 +83,7 @@ module PoolParty
|
|
83
83
|
@opts.separator "Options:"
|
84
84
|
|
85
85
|
@opts.on('-v', '--verbose', 'Be verbose') { self.verbose true }
|
86
|
-
@opts.on('', "--debug", "Debug setting") {self.
|
86
|
+
@opts.on('', "--debug", "Debug setting") {self.debugging true}
|
87
87
|
@opts.on('-s [file]', '--spec-file [file]', 'Set the spec file') { |file| self.spec file.chomp }
|
88
88
|
@opts.on('-t', '--test', 'Testing mode') { self.testing true }
|
89
89
|
|
@@ -1,3 +1,11 @@
|
|
1
|
+
=begin rdoc
|
2
|
+
CloudResourcer provides the cloud with convenience methods
|
3
|
+
that you can call on your cloud. This is where the
|
4
|
+
|
5
|
+
instances 2..10
|
6
|
+
|
7
|
+
method is stored, for instance. It's also where the key convenience methods are written
|
8
|
+
=end
|
1
9
|
require "ftools"
|
2
10
|
|
3
11
|
module PoolParty
|
@@ -50,6 +58,25 @@ module PoolParty
|
|
50
58
|
# end
|
51
59
|
end
|
52
60
|
|
61
|
+
# Keypairs
|
62
|
+
def keypair(*args)
|
63
|
+
if args && !args.empty? && !has_keypair?
|
64
|
+
options[:keypair] = args.first
|
65
|
+
else
|
66
|
+
options[:keypair] ||= generate_keypair
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Let's just make sure that the keypair exists on the options
|
71
|
+
def has_keypair?
|
72
|
+
options.has_key?(:keypair) && options[:keypair] && !options[:keypair].empty?
|
73
|
+
end
|
74
|
+
# Generate a keypair based on the parent's name (if there is a parent)
|
75
|
+
# and the cloud's name
|
76
|
+
def generate_keypair(*args)
|
77
|
+
options[:keypair] = "#{parent && parent.is_a?(PoolParty::Pool::Pool) ? parent.name : "poolparty"}_#{name}" unless has_keypair?
|
78
|
+
end
|
79
|
+
|
53
80
|
def full_keypair_path
|
54
81
|
unless keypair_path
|
55
82
|
raise RuntimeException.new("Keypair cannot be found")
|
@@ -102,8 +129,8 @@ module PoolParty
|
|
102
129
|
def keypair_paths
|
103
130
|
[
|
104
131
|
Base.base_keypair_path,
|
105
|
-
Base.
|
106
|
-
Base.
|
132
|
+
Base.base_config_directory,
|
133
|
+
Base.remote_storage_path
|
107
134
|
]
|
108
135
|
end
|
109
136
|
|
@@ -41,6 +41,12 @@ module PoolParty
|
|
41
41
|
def cancelled?
|
42
42
|
options[:cancelled] || false
|
43
43
|
end
|
44
|
+
def printed(*args)
|
45
|
+
options[:printed] = true
|
46
|
+
end
|
47
|
+
def printed?
|
48
|
+
options[:printed] || false
|
49
|
+
end
|
44
50
|
# Give us a template to work with on the resource
|
45
51
|
# Make sure this template is moved to the tmp directory as well
|
46
52
|
#
|
@@ -105,15 +105,19 @@ end
|
|
105
105
|
when_all_assigned_ips {wait "5.seconds"}
|
106
106
|
end
|
107
107
|
|
108
|
+
# Attach a volume to the instance
|
108
109
|
def attach_volume(instance=nil)
|
109
110
|
vputs "Attaching volume #{ebs_volume_id} to the master at #{ebs_volume_device}"
|
110
111
|
instance = master
|
111
112
|
ec2.attach_volume(:volume_id => ebs_volume_id, :instance_id => instance.instance_id, :device => ebs_volume_device) if ebs_volume_id && ebs_volume_mount_point
|
112
113
|
end
|
114
|
+
# Associate an address with the instance using ec2
|
113
115
|
def associate_address(instance=nil)
|
114
|
-
|
115
|
-
|
116
|
-
|
116
|
+
if set_master_ip_to
|
117
|
+
dputs "Associating master with #{set_master_ip_to}"
|
118
|
+
instance = master
|
119
|
+
ec2.associate_address(:instance_id => instance.instance_id, :public_ip => set_master_ip_to) if set_master_ip_to
|
120
|
+
end
|
117
121
|
end
|
118
122
|
|
119
123
|
# Help create a keypair for the cloud
|
@@ -140,12 +144,9 @@ end
|
|
140
144
|
)
|
141
145
|
end
|
142
146
|
|
147
|
+
# These are tasks that run before the configuration runs
|
143
148
|
def before_configuration_tasks
|
144
|
-
if
|
145
|
-
# copy_file_to_storage_directory(pub_key)
|
146
|
-
# copy_file_to_storage_directory(private_key)
|
147
|
-
end
|
148
|
-
if set_master_ip_to && master.ip.to_s != set_master_ip_to.to_s
|
149
|
+
if set_master_ip_to && master.ip && master.ip.to_s != set_master_ip_to.to_s
|
149
150
|
associate_address(master)
|
150
151
|
reset_remoter_base!
|
151
152
|
|
@@ -144,9 +144,9 @@ module PoolParty
|
|
144
144
|
# A convenience method for waiting until there are no more
|
145
145
|
# pending instances and then running the block
|
146
146
|
def when_no_pending_instances(&block)
|
147
|
-
reset!
|
148
|
-
if list_of_pending_instances.size == 0
|
149
|
-
vputs ""
|
147
|
+
reset!
|
148
|
+
if list_of_pending_instances && list_of_pending_instances.size == 0
|
149
|
+
vputs "" # Clear the terminal with a newline
|
150
150
|
block.call if block
|
151
151
|
else
|
152
152
|
vprint "."
|
@@ -236,14 +236,14 @@ module PoolParty
|
|
236
236
|
!list_of_running_instances.select {|a| a.name == "master"}.first.nil?
|
237
237
|
end
|
238
238
|
# Stub method for the time being to handle expansion of the cloud
|
239
|
-
def
|
239
|
+
def can_expand_cloud?(force=false)
|
240
240
|
(are_too_few_instances_running? || are_expansion_rules_valid? ) || force || false
|
241
241
|
end
|
242
242
|
def are_expansion_rules_valid?
|
243
243
|
valid_rules?(:expand_when)
|
244
244
|
end
|
245
245
|
# Stub method for the time being to handle the contraction of the cloud
|
246
|
-
def
|
246
|
+
def can_contract_cloud?(force=false)
|
247
247
|
return true if force
|
248
248
|
((are_any_nodes_exceeding_minimum_runtime? and are_too_many_instances_running?) || are_contraction_rules_valid?) || false
|
249
249
|
end
|
@@ -257,7 +257,7 @@ module PoolParty
|
|
257
257
|
# online, then provision it as a slave, this way, it is ready for action from the
|
258
258
|
# get go
|
259
259
|
def expand_cloud_if_necessary(force=false)
|
260
|
-
if can_start_a_new_instance? &&
|
260
|
+
if can_start_a_new_instance? && can_expand_cloud?(force)
|
261
261
|
vputs "Expanding the cloud based on load"
|
262
262
|
@num = 1
|
263
263
|
@num.times do |i|
|
@@ -273,7 +273,7 @@ module PoolParty
|
|
273
273
|
# If we can shutdown an instnace and the load allows us to contract
|
274
274
|
# the cloud, then we should request_termination_of_non_master_instance
|
275
275
|
def contract_cloud_if_necessary(force=false)
|
276
|
-
if can_shutdown_an_instance? &&
|
276
|
+
if can_shutdown_an_instance? && can_contract_cloud?(force)
|
277
277
|
vputs "Shrinking the cloud by 1"
|
278
278
|
before_shutdown
|
279
279
|
request_termination_of_non_master_instance
|
@@ -1,14 +1,20 @@
|
|
1
1
|
module PoolParty
|
2
2
|
class GitResource
|
3
|
-
|
3
|
+
|
4
4
|
virtual_resource(:git) do
|
5
|
+
def loaded(*args)
|
6
|
+
has_package(:name => "git-core")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
virtual_resource(:git_repos) do
|
5
11
|
|
6
|
-
def loaded(opts={}, parent=self)
|
12
|
+
def loaded(opts={}, parent=self, &block)
|
13
|
+
has_git
|
7
14
|
has_git_repos
|
8
15
|
end
|
9
16
|
|
10
|
-
def has_git_repos
|
11
|
-
has_package(:name => "git-core")
|
17
|
+
def has_git_repos
|
12
18
|
has_exec({:name => key, :requires => [get_directory("#{working_dir}"), get_package("git-core")] }) do
|
13
19
|
command requires_user ? "git clone #{requires_user}@#{source} #{working_dir}" : "cd #{working_dir} && git clone #{source}"
|
14
20
|
cwd "#{working_dir if working_dir}"
|
@@ -4,8 +4,11 @@ module PoolParty
|
|
4
4
|
virtual_resource(:rsyncmirror) do
|
5
5
|
|
6
6
|
def loaded(opts={}, parent=self)
|
7
|
-
@parent = parent
|
8
|
-
|
7
|
+
@parent = parent
|
8
|
+
execute_on_node do
|
9
|
+
@dir = dir || name
|
10
|
+
has_exec(opts.merge({:command => "#{cloud.remote_rsync_command} --no-implied-dirs --delete-excluded #{Base.user}@master:#{@dir}/ #{@dir}/".safe_quote, :name => "rsync-#{name}"}))
|
11
|
+
end
|
9
12
|
end
|
10
13
|
|
11
14
|
# Since git is not a native type, we have to say which core resource
|
@@ -71,17 +71,6 @@ module PoolParty
|
|
71
71
|
def name
|
72
72
|
@cloud_name
|
73
73
|
end
|
74
|
-
|
75
|
-
# Keypairs
|
76
|
-
# Let's just make sure that the keypair exists on the options
|
77
|
-
def has_keypair?
|
78
|
-
options.has_key?(:keypair) && options[:keypair] && !options[:keypair].empty?
|
79
|
-
end
|
80
|
-
# Generate a keypair based on the parent's name (if there is a parent)
|
81
|
-
# and the cloud's name
|
82
|
-
def generate_keypair(*args)
|
83
|
-
options[:keypair] = "#{parent && parent.is_a?(PoolParty::Pool::Pool) ? parent.name : "poolparty"}_#{name}" unless has_keypair?
|
84
|
-
end
|
85
74
|
|
86
75
|
# Prepare to send the new configuration to the instances
|
87
76
|
# First, let's make sure that our base directory is made
|
@@ -17,17 +17,23 @@ module PoolParty
|
|
17
17
|
resources[type] ||= []
|
18
18
|
end
|
19
19
|
|
20
|
+
# Add resource
|
21
|
+
# When we are looking to add a resource, we want to make sure the
|
22
|
+
# resources isn't already added. This way we prevent duplicates
|
23
|
+
# as puppet can be finicky about duplicate resource definitions.
|
24
|
+
# We'll look for the resource in either a local or global store
|
25
|
+
# If the resource appears in either, return that resource, we'll just append
|
26
|
+
# to the resource config, otherwise instantiate a new resource of the type
|
27
|
+
# and store it into the global and local resource stores
|
28
|
+
#
|
29
|
+
# A word about stores, the global store stores the entire list of stored
|
30
|
+
# resources. The local resource store is available on all clouds and plugins
|
31
|
+
# which stores the instance variable's local resources.
|
20
32
|
def add_resource(type, opts={}, parent=self, &block)
|
21
|
-
|
22
|
-
|
23
|
-
@res
|
24
|
-
|
25
|
-
# unless @res.parent == parent
|
26
|
-
# @pa = parent
|
27
|
-
# @res.instance_eval {@parent = @pa}
|
28
|
-
# end
|
29
|
-
# parent.resource(type) << @res
|
30
|
-
# end
|
33
|
+
temp_name = (opts[:name] || "#{type}_#{type.to_s.keyerize}")
|
34
|
+
if in_a_resource_store?(type, temp_name)
|
35
|
+
@res = get_from_local_resource_store(type, temp_name, parent)
|
36
|
+
@res ||= get_from_global_resource_store(type, temp_name)
|
31
37
|
else
|
32
38
|
@res = returning "PoolParty::Resources::#{type.to_s.camelize}".camelize.constantize.new(opts, parent, &block) do |o|
|
33
39
|
store_into_global_resource_store(o)
|
@@ -89,10 +95,22 @@ module PoolParty
|
|
89
95
|
# For the time being, we'll make puppet the only available dependency resolution
|
90
96
|
# base, but in the future, we can rip this out and make it an option
|
91
97
|
include PoolParty::DependencyResolutions::Puppet
|
98
|
+
# DSL Overriders
|
99
|
+
include PoolParty::ResourcingDsl
|
92
100
|
|
93
101
|
extend PoolParty::Resources
|
94
102
|
include PoolParty::Resources
|
95
103
|
|
104
|
+
# When we subclass Resource, we want to add a few methods to the Resources class
|
105
|
+
# This will anable us to call out to these resources in our DSLified manner
|
106
|
+
# When we call a method from the subclass, say it's the File class
|
107
|
+
# then we want to be able to have the method file() available.
|
108
|
+
# We also want to be able to fetch the resource with a get_file method.
|
109
|
+
# This will just call out to get the resource. If the resource isn't available
|
110
|
+
# in a resource store, we expect to return a nil result.
|
111
|
+
# Finally, the has_ and does_not_have_ methods are appended. See below for
|
112
|
+
# those methods. Then we make sure we add these resources as available_resources
|
113
|
+
# onto the class so we know it's available as a resource
|
96
114
|
def self.inherited(subclass)
|
97
115
|
subclass = subclass.to_s.split("::")[-1] if subclass.to_s.index("::")
|
98
116
|
lowercase_class_name = subclass.to_s.underscore.downcase || subclass.downcase
|
@@ -104,13 +122,8 @@ module PoolParty
|
|
104
122
|
add_resource(:#{lowercase_class_name}, opts, parent, &blk)
|
105
123
|
end
|
106
124
|
def get_#{lowercase_class_name}(n, opts={}, parent=self, &block)
|
107
|
-
|
108
|
-
get_resource(:#{lowercase_class_name}, n) :
|
109
|
-
nil
|
110
|
-
# PoolParty::Resources::Resource.resource_string_name(#{lowercase_class_name}, n)
|
111
|
-
# add_resource(:#{lowercase_class_name}, opts, parent, &blk)
|
112
|
-
# res ||= PoolParty::Resources::Resource.resource_string_name(#{lowercase_class_name}, n)
|
113
|
-
res
|
125
|
+
in_a_resource_store?(:#{lowercase_class_name}, n) ?
|
126
|
+
get_resource(:#{lowercase_class_name}, n) : nil
|
114
127
|
end
|
115
128
|
EOE
|
116
129
|
PoolParty::Resources.module_eval method
|
@@ -120,14 +133,12 @@ module PoolParty
|
|
120
133
|
end
|
121
134
|
end
|
122
135
|
|
136
|
+
# Keep track of the resources that are available. This way we can show some pretty output
|
137
|
+
# later and ensure that we are only calling available resources
|
123
138
|
def self.available_resources
|
124
139
|
@available_resources ||= []
|
125
140
|
end
|
126
141
|
|
127
|
-
def self.available_resource_methods
|
128
|
-
available_resources.map {|a| a.my_methods }
|
129
|
-
end
|
130
|
-
|
131
142
|
# This is set in order of descending precedence
|
132
143
|
# The options are overwritten from the bottom up
|
133
144
|
# and the resource will use those as the values
|
@@ -141,7 +152,7 @@ module PoolParty
|
|
141
152
|
|
142
153
|
set_resource_parent
|
143
154
|
|
144
|
-
loaded(opts, @parent)
|
155
|
+
loaded(opts, @parent, &block)
|
145
156
|
end
|
146
157
|
|
147
158
|
# Helper to set the containing parent on the resource
|
@@ -184,9 +195,6 @@ module PoolParty
|
|
184
195
|
end
|
185
196
|
end
|
186
197
|
|
187
|
-
# DSL Overriders
|
188
|
-
include PoolParty::ResourcingDsl
|
189
|
-
|
190
198
|
def same_resources_of(t, k)
|
191
199
|
key == k && class_name_sym == t
|
192
200
|
end
|
@@ -20,9 +20,21 @@ module PoolParty
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
# Wrap all the resources into a class package
|
23
|
+
# Wrap all the resources into a class package.
|
24
|
+
# This method will first check to see if a class has already been declared
|
25
|
+
# and run the containing block on it to attach the new resources on to the new block
|
26
|
+
# If the class does not exist, then it is the responsibility of this method to pull
|
27
|
+
# the resources from the parent into the new class package resource and remove them
|
28
|
+
# from the parent. This way we can conveniently write classes into the manifest,
|
29
|
+
# giving us separation for variables and the like.
|
30
|
+
# Finally, the method will remove the all resources from the contianing parent and add
|
31
|
+
# the class package as the resource.
|
32
|
+
# Note that it only removes resources that are not class packages, so this method will
|
33
|
+
# not remove other classes that have been attached to the same resource.
|
34
|
+
# TODO CLEAN THIS UP
|
24
35
|
def classpackage_with_self(parent=self, &block)
|
25
36
|
name = (parent && parent.options.name || Classpackage.name(parent).to_s).sanitize
|
37
|
+
|
26
38
|
if in_global_classpackages?(name)
|
27
39
|
returning get_from_global_classpackage_store(name) do |cls|
|
28
40
|
cls.run_in_context(parent, &block) if block
|
@@ -55,13 +67,8 @@ module PoolParty
|
|
55
67
|
})
|
56
68
|
|
57
69
|
def initialize(opts={}, parent=self, &block)
|
58
|
-
# Take the options of the parents
|
59
|
-
# set_parent(parent, false) if parent
|
60
70
|
set_vars_from_options(opts) unless opts.empty?
|
61
|
-
# self.instance_eval &block if block
|
62
71
|
run_setup(parent, &block) if block
|
63
|
-
# self.run_in_context &block if block
|
64
|
-
# store_block(&block)
|
65
72
|
loaded
|
66
73
|
end
|
67
74
|
|
data/lib/poolparty/version.rb
CHANGED
data/poolparty.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poolparty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.91
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Lerner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-12-
|
12
|
+
date: 2008-12-21 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -392,6 +392,7 @@ files:
|
|
392
392
|
- lib/poolparty/provisioners/capistrano/recipies/master.rb
|
393
393
|
- lib/poolparty/provisioners/capistrano/recipies/slave.rb
|
394
394
|
- lib/poolparty/provisioners/provisioner_base.rb
|
395
|
+
- lib/poolparty/spec.rb
|
395
396
|
- lib/poolparty/spec/core/string.rb
|
396
397
|
- lib/poolparty/spec/matchers/a_spec_extensions_base.rb
|
397
398
|
- lib/poolparty/spec/matchers/have_cron.rb
|
@@ -435,7 +436,6 @@ files:
|
|
435
436
|
- lib/poolparty/templates/yaws.conf
|
436
437
|
- lib/poolparty/version.rb
|
437
438
|
- lib/poolpartycl.rb
|
438
|
-
- lib/poolpartyspec.rb
|
439
439
|
- log/pool.log
|
440
440
|
- poolparty.gemspec
|
441
441
|
- script/destroy
|
@@ -535,7 +535,7 @@ files:
|
|
535
535
|
has_rdoc: true
|
536
536
|
homepage: http://poolparty.rubyforge.org
|
537
537
|
post_install_message: |-
|
538
|
-
Get ready to jump in the pool, you just installed PoolParty! (Updated at 13
|
538
|
+
Get ready to jump in the pool, you just installed PoolParty! (Updated at 00:13 12/21/08)
|
539
539
|
|
540
540
|
To get started, run the generator:
|
541
541
|
|
@@ -9,7 +9,7 @@ describe "Console" do
|
|
9
9
|
::File.stub!(:readable?).and_return true
|
10
10
|
Dir.stub!(:pwd).and_return "/flop"
|
11
11
|
Dir.stub!(:[]).and_return []
|
12
|
-
Dir.stub!(:[]).with("/flop
|
12
|
+
Dir.stub!(:[]).with("/flop/*/*.rb").and_return ["clouds.rb"]
|
13
13
|
end
|
14
14
|
describe "load_pool" do
|
15
15
|
before(:each) do
|
@@ -69,6 +69,7 @@ describe "Console" do
|
|
69
69
|
::File.stub!(:readable?).with(@filename).and_return true
|
70
70
|
@filename.stub!(:read).and_return "spec contents"
|
71
71
|
self.stub!(:open).with(@filename).and_return @filename
|
72
|
+
Binary.stub!(:get_existing_spec_location).and_return @filename
|
72
73
|
end
|
73
74
|
it "should call readable on the string sent in to load_pool" do
|
74
75
|
lambda {
|
@@ -32,7 +32,7 @@ describe "Binary" do
|
|
32
32
|
Dir.stub!(:pwd).and_return "/flop"
|
33
33
|
end
|
34
34
|
it "should call Dir[Dir.pwd] if there is no filename given" do
|
35
|
-
Dir.should_receive(:[]).with("#{Dir.pwd}
|
35
|
+
Dir.should_receive(:[]).with("#{Dir.pwd}/*/clouds.rb").and_return ["clouds.rb"]
|
36
36
|
Binary.load_pool
|
37
37
|
end
|
38
38
|
end
|
@@ -229,14 +229,14 @@ describe "Remote" do
|
|
229
229
|
@tc.should_receive(:can_start_a_new_instance?).once
|
230
230
|
end
|
231
231
|
it "should see if we should expand the cloud" do
|
232
|
-
@tc.should_receive(:
|
232
|
+
@tc.should_receive(:can_expand_cloud?).once.and_return false
|
233
233
|
end
|
234
|
-
it "should call request_launch_new_instances if we
|
235
|
-
@tc.should_receive(:
|
234
|
+
it "should call request_launch_new_instances if we can_expand_cloud?" do
|
235
|
+
@tc.should_receive(:can_expand_cloud?).once.and_return true
|
236
236
|
@tc.should_receive(:request_launch_one_instance_at_a_time).once.and_return [{:ip => "127.0.0.5", :name => "node2"}]
|
237
237
|
end
|
238
238
|
it "should call a new slave provisioner" do
|
239
|
-
@tc.stub!(:
|
239
|
+
@tc.stub!(:can_expand_cloud?).once.and_return true
|
240
240
|
@provisioner.should_receive(:install).at_least(1)
|
241
241
|
end
|
242
242
|
after(:each) do
|
@@ -255,10 +255,10 @@ describe "Remote" do
|
|
255
255
|
@tc.should_receive(:can_shutdown_an_instance?).once
|
256
256
|
end
|
257
257
|
it "should see if we should contract the cloud" do
|
258
|
-
@tc.should_receive(:
|
258
|
+
@tc.should_receive(:can_contract_cloud?).once.and_return false
|
259
259
|
end
|
260
|
-
it "should call request_termination_of_non_master_instance if we
|
261
|
-
@tc.stub!(:
|
260
|
+
it "should call request_termination_of_non_master_instance if we can_contract_cloud?" do
|
261
|
+
@tc.stub!(:can_contract_cloud?).and_return true
|
262
262
|
@tc.should_receive(:request_termination_of_non_master_instance).once.and_return true
|
263
263
|
end
|
264
264
|
after(:each) do
|
@@ -18,18 +18,18 @@ describe "Remote Instance" do
|
|
18
18
|
@tc = TestGitClass.new
|
19
19
|
end
|
20
20
|
it "should be a string" do
|
21
|
-
@tc.
|
21
|
+
@tc.has_git_repos(:at => "/var/www/", :name => "gitrepos.git", :source => "git://source.git").to_string.should =~ /exec/
|
22
22
|
end
|
23
23
|
it "should included the flushed out options" do
|
24
|
-
@tc.
|
24
|
+
@tc.has_git_repos({:name => "git.git", :source => "git://source.git", :requires_user => "finger", :at => "/var/www/"}).to_string.should =~ /finger@git:/
|
25
25
|
end
|
26
26
|
it "should not include the user if none is given" do
|
27
|
-
@tc.
|
27
|
+
@tc.has_git_repos({:name => "git.git", :source => "git://source.git",:at => "/var/www/"}).to_string.should =~ /git clone git:/
|
28
28
|
end
|
29
29
|
describe "in resource" do
|
30
30
|
before(:each) do
|
31
31
|
@tc.instance_eval do
|
32
|
-
|
32
|
+
has_git_repos(:name => "gittr") do
|
33
33
|
source "git://source.git"
|
34
34
|
path "/var/www/xnot.org"
|
35
35
|
symlink "/var/www/xnot.org/public"
|
@@ -38,7 +38,7 @@ describe "Remote Instance" do
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
it "should have the path set within the resource" do
|
41
|
-
@tc.resource(:
|
41
|
+
@tc.resource(:git_repos).first.to_string.should =~ /exec \{ \"git-gittr/
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -15,8 +15,9 @@ describe "User" do
|
|
15
15
|
name "bob"
|
16
16
|
home "/home/bob"
|
17
17
|
end
|
18
|
-
@user.to_string
|
19
|
-
@
|
18
|
+
@string = @user.to_string
|
19
|
+
@string.should =~ /"bob":/
|
20
|
+
@string.should =~ /home => '\/home\/bob'/
|
20
21
|
end
|
21
22
|
describe "as included" do
|
22
23
|
before(:each) do
|
@@ -26,6 +26,9 @@ describe "PoolParty" do
|
|
26
26
|
PoolParty.write_to_file_in_storage_directory("/usr/bin/happydayz", "write this text")
|
27
27
|
File.open(@path).read.should == "write this text"
|
28
28
|
end
|
29
|
+
after(:each) do
|
30
|
+
::FileUtils.rm @path rescue ""
|
31
|
+
end
|
29
32
|
end
|
30
33
|
it "should have a logger" do
|
31
34
|
PoolParty.log.should_not be_nil
|
@@ -16,6 +16,9 @@ ENV["POOL_SPEC"] = nil
|
|
16
16
|
include PoolParty
|
17
17
|
extend PoolParty
|
18
18
|
|
19
|
+
def debugging
|
20
|
+
false
|
21
|
+
end
|
19
22
|
def are_too_many_instances_running?
|
20
23
|
end
|
21
24
|
def are_any_nodes_exceeding_minimum_runtime?
|
@@ -119,6 +122,8 @@ def stub_remoting_methods_for(o)
|
|
119
122
|
o.stub!(:before_install).and_return true
|
120
123
|
o.stub!(:process_install).and_return true
|
121
124
|
o.stub!(:after_install).and_return true
|
125
|
+
o.stub!(:can_contract_cloud?).and_return false
|
126
|
+
o.stub!(:can_expand_cloud?).and_return false
|
122
127
|
end
|
123
128
|
def stub_list_of_instances_for(o)
|
124
129
|
# o.stub!(:list_of_running_instances).once.and_return running_remote_instances
|
data/website/index.html
CHANGED
@@ -34,7 +34,7 @@
|
|
34
34
|
<h1>PoolParty</h1>
|
35
35
|
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/poolparty"; return false'>
|
36
36
|
<p>Get Version</p>
|
37
|
-
<a href="http://rubyforge.org/projects/poolparty" class="numbers">0.2.
|
37
|
+
<a href="http://rubyforge.org/projects/poolparty" class="numbers">0.2.91</a>
|
38
38
|
</div>
|
39
39
|
<h1>‘Easy cloud computing’</h1>
|
40
40
|
<h2>What</h2>
|
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: 0.2.
|
4
|
+
version: 0.2.91
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Lerner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-12-
|
12
|
+
date: 2008-12-21 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -392,6 +392,7 @@ files:
|
|
392
392
|
- lib/poolparty/provisioners/capistrano/recipies/master.rb
|
393
393
|
- lib/poolparty/provisioners/capistrano/recipies/slave.rb
|
394
394
|
- lib/poolparty/provisioners/provisioner_base.rb
|
395
|
+
- lib/poolparty/spec.rb
|
395
396
|
- lib/poolparty/spec/core/string.rb
|
396
397
|
- lib/poolparty/spec/matchers/a_spec_extensions_base.rb
|
397
398
|
- lib/poolparty/spec/matchers/have_cron.rb
|
@@ -435,7 +436,6 @@ files:
|
|
435
436
|
- lib/poolparty/templates/yaws.conf
|
436
437
|
- lib/poolparty/version.rb
|
437
438
|
- lib/poolpartycl.rb
|
438
|
-
- lib/poolpartyspec.rb
|
439
439
|
- log/pool.log
|
440
440
|
- poolparty.gemspec
|
441
441
|
- script/destroy
|
@@ -535,7 +535,7 @@ files:
|
|
535
535
|
has_rdoc: true
|
536
536
|
homepage: http://poolparty.rubyforge.org
|
537
537
|
post_install_message: |-
|
538
|
-
Get ready to jump in the pool, you just installed PoolParty! (Updated at 13
|
538
|
+
Get ready to jump in the pool, you just installed PoolParty! (Updated at 00:13 12/21/08)
|
539
539
|
|
540
540
|
To get started, run the generator:
|
541
541
|
|