auser-poolparty 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +201 -0
- data/PostInstall.txt +17 -0
- data/Rakefile +22 -1
- data/bin/cloud-add-keypair +0 -0
- data/bin/cloud-osxcopy +22 -0
- data/bin/cloud-provision +1 -0
- data/bin/cloud-start +17 -15
- data/bin/cloud-terminate +23 -0
- data/bin/pool-start +14 -14
- data/bin/pool-start-monitor +1 -0
- data/config/hoe.rb +114 -0
- data/config/requirements.rb +15 -0
- data/lib/poolparty.rb +1 -0
- data/lib/poolparty/base_packages/haproxy.rb +32 -31
- data/lib/poolparty/base_packages/heartbeat.rb +2 -2
- data/lib/poolparty/base_packages/poolparty.rb +9 -3
- data/lib/poolparty/base_packages/ruby.rb +10 -0
- data/lib/poolparty/core/proc.rb +5 -0
- data/lib/poolparty/core/string.rb +1 -1
- data/lib/poolparty/helpers/binary.rb +6 -5
- data/lib/poolparty/helpers/display.rb +11 -2
- data/lib/poolparty/helpers/optioner.rb +6 -3
- data/lib/poolparty/helpers/provisioner_base.rb +9 -7
- data/lib/poolparty/helpers/provisioners/master.rb +38 -4
- data/lib/poolparty/helpers/provisioners/slave.rb +2 -2
- data/lib/poolparty/modules/cloud_resourcer.rb +20 -3
- data/lib/poolparty/modules/definable_resource.rb +1 -1
- data/lib/poolparty/modules/method_missing_sugar.rb +12 -4
- data/lib/poolparty/modules/pretty_printer.rb +2 -1
- data/lib/poolparty/net/remote.rb +1 -1
- data/lib/poolparty/net/remote_bases/ec2.rb +13 -10
- data/lib/poolparty/net/remote_instance.rb +3 -2
- data/lib/poolparty/net/remoter.rb +33 -18
- data/lib/poolparty/net/remoter_base.rb +3 -3
- data/lib/poolparty/plugins/gem_package.rb +6 -29
- data/lib/poolparty/plugins/git.rb +22 -0
- data/lib/poolparty/pool/base.rb +7 -6
- data/lib/poolparty/pool/cloud.rb +34 -5
- data/lib/poolparty/pool/custom_resource.rb +4 -4
- data/lib/poolparty/pool/plugin.rb +13 -14
- data/lib/poolparty/pool/resource.rb +19 -10
- data/lib/poolparty/pool/resources/class_package.rb +10 -6
- data/lib/poolparty/pool/resources/conditional.rb +41 -0
- data/lib/poolparty/pool/resources/gem.rb +2 -2
- data/lib/poolparty/pool/script.rb +25 -2
- data/lib/poolparty/templates/haproxy.conf +1 -1
- data/lib/poolparty/templates/puppet.conf +4 -2
- data/lib/poolparty/version.rb +1 -1
- data/poolparty.gemspec +60 -0
- data/setup.rb +1585 -0
- data/spec/poolparty/base_packages/haproxy_spec.rb +13 -0
- data/spec/poolparty/base_packages/heartbeat_spec.rb +30 -0
- data/spec/poolparty/bin/console_spec.rb +80 -0
- data/spec/poolparty/core/array_spec.rb +26 -0
- data/spec/poolparty/core/float.rb +13 -0
- data/spec/poolparty/core/hash_spec.rb +63 -0
- data/spec/poolparty/core/kernel_spec.rb +24 -0
- data/spec/poolparty/core/module_spec.rb +15 -0
- data/spec/poolparty/core/object_spec.rb +40 -0
- data/spec/poolparty/core/string_spec.rb +152 -0
- data/spec/poolparty/core/time_spec.rb +52 -0
- data/spec/poolparty/helpers/binary_spec.rb +26 -0
- data/spec/poolparty/helpers/display_spec.rb +13 -0
- data/spec/poolparty/helpers/optioner_spec.rb +39 -0
- data/spec/poolparty/helpers/provisioner_base_spec.rb +121 -0
- data/spec/poolparty/helpers/provisioners/master_spec.rb +54 -0
- data/spec/poolparty/helpers/provisioners/slave_spec.rb +28 -0
- data/spec/poolparty/modules/cloud_resourcer_spec.rb +135 -0
- data/spec/poolparty/modules/configurable_spec.rb +26 -0
- data/spec/poolparty/modules/definable_resource.rb +9 -0
- data/spec/poolparty/modules/file_writer_spec.rb +49 -0
- data/spec/poolparty/modules/s3_string_spec.rb +15 -0
- data/spec/poolparty/net/remote_bases/ec2_spec.rb +92 -0
- data/spec/poolparty/net/remote_instance_spec.rb +70 -0
- data/spec/poolparty/net/remote_spec.rb +286 -0
- data/spec/poolparty/net/remoter_base_spec.rb +80 -0
- data/spec/poolparty/net/remoter_spec.rb +191 -0
- data/spec/poolparty/plugins/git_spec.rb +19 -0
- data/spec/poolparty/plugins/line_spec.rb +16 -0
- data/spec/poolparty/plugins/svn_spec.rb +16 -0
- data/spec/poolparty/pool/base_spec.rb +108 -0
- data/spec/poolparty/pool/cloud_spec.rb +299 -0
- data/spec/poolparty/pool/configurers/files/ruby_basic.rb +17 -0
- data/spec/poolparty/pool/configurers/files/ruby_plugins.rb +16 -0
- data/spec/poolparty/pool/configurers/ruby_spec.rb +58 -0
- data/spec/poolparty/pool/custom_resource_spec.rb +115 -0
- data/spec/poolparty/pool/example_spec.rb +112 -0
- data/spec/poolparty/pool/plugin_model_spec.rb +63 -0
- data/spec/poolparty/pool/plugin_spec.rb +85 -0
- data/spec/poolparty/pool/pool_spec.rb +83 -0
- data/spec/poolparty/pool/resource_spec.rb +224 -0
- data/spec/poolparty/pool/resources/class_package_spec.rb +84 -0
- data/spec/poolparty/pool/resources/conditional_spec.rb +38 -0
- data/spec/poolparty/pool/resources/cron_spec.rb +49 -0
- data/spec/poolparty/pool/resources/directory_spec.rb +40 -0
- data/spec/poolparty/pool/resources/exec_spec.rb +37 -0
- data/spec/poolparty/pool/resources/file_spec.rb +40 -0
- data/spec/poolparty/pool/resources/gem_spec.rb +16 -0
- data/spec/poolparty/pool/resources/host_spec.rb +28 -0
- data/spec/poolparty/pool/resources/package_spec.rb +44 -0
- data/spec/poolparty/pool/resources/remote_file_spec.rb +40 -0
- data/spec/poolparty/pool/resources/service_spec.rb +45 -0
- data/spec/poolparty/pool/resources/sshkey_spec.rb +48 -0
- data/spec/poolparty/pool/resources/variable_spec.rb +20 -0
- data/spec/poolparty/pool/script_spec.rb +51 -0
- data/spec/poolparty/pool/test_plugins/sshkey_test +2 -0
- data/spec/poolparty/pool/test_plugins/virtual_host_template.erb +0 -0
- data/spec/poolparty/pool/test_plugins/webserver.rb +46 -0
- data/spec/poolparty/poolparty_spec.rb +33 -0
- data/spec/poolparty/spec_helper.rb +120 -0
- data/test/test_generator_helper.rb +29 -0
- data/test/test_helper.rb +2 -0
- data/test/test_pool_spec_generator.rb +47 -0
- data/test/test_poolparty.rb +11 -0
- data/website/index.html +81 -0
- data/website/index.txt +72 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.html.erb +48 -0
- metadata +178 -60
@@ -23,7 +23,8 @@ module PoolParty
|
|
23
23
|
# Do not print if the option is nil or empty.
|
24
24
|
# Also, don't show the option if the option is empty or the default option on the cloud
|
25
25
|
def pretty_options(prev, o)
|
26
|
-
|
26
|
+
return "" unless o.respond_to?(:options)
|
27
|
+
print_options = (o.respond_to?(:parent) && o.parent && o.parent.respond_to?(:options)) ?
|
27
28
|
(o.options.delete_if {|k,v| o.parent.options.has_key?(k) && o.parent.options[k] == o.options[k] && !o.options[k].nil? } ) :
|
28
29
|
o.options
|
29
30
|
print_options = print_options.map {|k,v| [k, o.send(k.to_sym).to_s] }.inject({}) { |r,e| r[e[0]] = e[1] unless o.class.default_options[e[0]] == e[1] || e[1].nil? || e[1].empty?; r }
|
data/lib/poolparty/net/remote.rb
CHANGED
@@ -12,7 +12,7 @@ module PoolParty
|
|
12
12
|
self.class.send :attr_reader, :remote_base
|
13
13
|
mod = "#{t}".preserved_module_constant
|
14
14
|
|
15
|
-
mod.send :include, PoolParty::Remote::RemoterBase
|
15
|
+
mod.send :include, PoolParty::Remote::RemoterBase
|
16
16
|
self.class.send :include, mod
|
17
17
|
self.extend mod
|
18
18
|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require 'rubygems'
|
2
|
+
require 'EC2'
|
3
|
+
|
2
4
|
class String
|
3
5
|
def convert_from_ec2_to_ip
|
4
6
|
self.gsub(/.compute-1.amazonaws.com*/, '').gsub(/ec2-/, '').gsub(/-/, '.')
|
@@ -6,15 +8,15 @@ class String
|
|
6
8
|
end
|
7
9
|
module PoolParty
|
8
10
|
module Ec2
|
9
|
-
def launch_new_instance!
|
11
|
+
def launch_new_instance!(num=1)
|
10
12
|
instance = ec2.run_instances(
|
11
|
-
:image_id =>
|
13
|
+
:image_id => (ami || Base.ami),
|
12
14
|
:user_data => "",
|
13
15
|
:minCount => 1,
|
14
|
-
:maxCount =>
|
15
|
-
:key_name =>
|
16
|
+
:maxCount => num,
|
17
|
+
:key_name => (keypair || Base.keypair),
|
16
18
|
:availability_zone => nil,
|
17
|
-
:size => "#{
|
19
|
+
:size => "#{size || Base.size}")
|
18
20
|
begin
|
19
21
|
item = instance#.instancesSet.item
|
20
22
|
EC2ResponseObject.get_hash_from_response(item)
|
@@ -34,7 +36,7 @@ module PoolParty
|
|
34
36
|
@id = 0
|
35
37
|
@describe_instances = get_instances_description.each_with_index do |h,i|
|
36
38
|
if h[:status] == "running"
|
37
|
-
@name = "node#{@id}"
|
39
|
+
@name = @id == 0 ? "master" : "node#{@id}"
|
38
40
|
@id += 1
|
39
41
|
else
|
40
42
|
@name = "#{h[:status]}_node#{i}"
|
@@ -45,7 +47,6 @@ module PoolParty
|
|
45
47
|
:ip => h[:ip].convert_from_ec2_to_ip
|
46
48
|
})
|
47
49
|
end
|
48
|
-
@describe_instances.first[:name] = "master" unless @describe_instances.empty?
|
49
50
|
end
|
50
51
|
@describe_instances
|
51
52
|
end
|
@@ -58,8 +59,10 @@ module PoolParty
|
|
58
59
|
# This is a helper to create the keypair and add them to the cloud for you
|
59
60
|
def create_keypair
|
60
61
|
return false unless keypair
|
61
|
-
|
62
|
-
|
62
|
+
unless ::File.exists?( new_keypair_path )
|
63
|
+
FileUtils.mkdir_p ::File.dirname( new_keypair_path )
|
64
|
+
Kernel.system "ec2-add-keypair #{keypair} > #{new_keypair_path} && chmod 600 #{new_keypair_path}"
|
65
|
+
end
|
63
66
|
end
|
64
67
|
# EC2 connections
|
65
68
|
def ec2
|
@@ -9,8 +9,9 @@ module PoolParty
|
|
9
9
|
include CloudResourcer
|
10
10
|
|
11
11
|
def initialize(opts, parent=self)
|
12
|
-
|
13
|
-
set_vars_from_options(
|
12
|
+
@parent = parent
|
13
|
+
set_vars_from_options(parent.options) if parent && parent.respond_to?(:options)
|
14
|
+
set_vars_from_options(opts) unless opts.nil? || opts.empty?
|
14
15
|
on_init
|
15
16
|
end
|
16
17
|
|
@@ -46,7 +46,7 @@ module PoolParty
|
|
46
46
|
out = list_from_remote(:cache => true)
|
47
47
|
end
|
48
48
|
return out
|
49
|
-
end
|
49
|
+
end
|
50
50
|
# List the instances that are known from the remoter_base
|
51
51
|
# Create a RemoteInstance for each of the instances from the hash
|
52
52
|
# returned by the list of instances, write them to the cached file
|
@@ -87,14 +87,15 @@ module PoolParty
|
|
87
87
|
]
|
88
88
|
end
|
89
89
|
|
90
|
-
#
|
90
|
+
# List calculation methods
|
91
|
+
#
|
91
92
|
# Are the minimum number of instances running?
|
92
93
|
def minimum_number_of_instances_are_running?
|
93
|
-
list_of_running_instances.size >= minimum_instances
|
94
|
+
list_of_running_instances.size >= minimum_instances.to_i
|
94
95
|
end
|
95
96
|
# Can we shutdown an instance?
|
96
97
|
def can_shutdown_an_instance?
|
97
|
-
list_of_running_instances.size > minimum_instances
|
98
|
+
list_of_running_instances.size > minimum_instances.to_i
|
98
99
|
end
|
99
100
|
# Request to launch a number of instances
|
100
101
|
def request_launch_new_instances(num=1)
|
@@ -113,38 +114,52 @@ module PoolParty
|
|
113
114
|
end
|
114
115
|
# Are the maximum number of instances running?
|
115
116
|
def maximum_number_of_instances_are_not_running?
|
116
|
-
list_of_running_instances.size < maximum_instances
|
117
|
+
list_of_running_instances.size < maximum_instances.to_i
|
117
118
|
end
|
118
119
|
# Launch new instance while waiting for the number of pending instances
|
119
120
|
# to be zero before actually launching. This ensures that we only
|
120
121
|
# launch one instance at a time
|
121
|
-
def request_launch_one_instance_at_a_time
|
122
|
-
when_no_pending_instances
|
123
|
-
launch_new_instance!
|
124
|
-
end
|
122
|
+
def request_launch_one_instance_at_a_time
|
123
|
+
when_no_pending_instances { launch_new_instance! }
|
125
124
|
end
|
126
125
|
# A convenience method for waiting until there are no more
|
127
126
|
# pending instances and then running the block
|
128
127
|
def when_no_pending_instances(&block)
|
129
128
|
reset!
|
130
|
-
if list_of_pending_instances.size
|
129
|
+
if list_of_pending_instances.size == 0
|
130
|
+
block.call if block
|
131
|
+
else
|
131
132
|
wait "5.seconds"
|
132
133
|
when_no_pending_instances(&block)
|
133
|
-
else
|
134
|
-
block.call if block
|
135
134
|
end
|
136
135
|
end
|
137
136
|
|
138
137
|
# This will launch the minimum_instances if the minimum number of instances are not running
|
139
138
|
# If the minimum number of instances are not running and if we can start a new instance
|
140
|
-
def launch_minimum_number_of_instances
|
141
|
-
if can_start_a_new_instance?
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
end
|
139
|
+
def launch_minimum_number_of_instances
|
140
|
+
if can_start_a_new_instance? && !minimum_number_of_instances_are_running?
|
141
|
+
list_of_pending_instances.size == 0 ? request_launch_one_instance_at_a_time : wait("5.seconds")
|
142
|
+
reset!
|
143
|
+
launch_minimum_number_of_instances unless minimum_number_of_instances_are_running?
|
146
144
|
end
|
147
145
|
end
|
146
|
+
# Launch the master and let the master handle the starting of the cloud
|
147
|
+
# We should only launch an instance if there are no pending instances, in the case
|
148
|
+
# that the master has launched, but is still pending
|
149
|
+
# and if the master is not running AND we can start a new instance
|
150
|
+
# Then wait for the master to launch
|
151
|
+
def launch_and_configure_master!(testing=false)
|
152
|
+
request_launch_new_instances(1) if list_of_pending_instances.size.zero? && can_start_a_new_instance? && !is_master_running?
|
153
|
+
|
154
|
+
when_no_pending_instances do
|
155
|
+
wait "5.seconds"
|
156
|
+
Provisioner.provision_master(self, testing)
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
def is_master_running?
|
161
|
+
!list_of_running_instances.select {|a| a.name == "master"}.first.nil?
|
162
|
+
end
|
148
163
|
# Stub method for the time being to handle expansion of the cloud
|
149
164
|
def should_expand_cloud?(force=false)
|
150
165
|
force || false
|
@@ -54,7 +54,7 @@ module PoolParty
|
|
54
54
|
list.reject {|i| true if !i.terminating? }
|
55
55
|
end
|
56
56
|
# Get the instances that are non-master instances
|
57
|
-
def nonmaster_nonterminated_instances(list =
|
57
|
+
def nonmaster_nonterminated_instances(list = list_of_nonterminated_instances)
|
58
58
|
list_of_nonterminated_instances.reject {|i| i.master? }
|
59
59
|
end
|
60
60
|
# list all the nonterminated instances
|
@@ -73,7 +73,7 @@ module PoolParty
|
|
73
73
|
# If no keypair is passed, select them all
|
74
74
|
def list_of_instances(keyp=nil)
|
75
75
|
key = keyp ? keyp : keypair
|
76
|
-
describe_instances.select {|a| key ? a[:keypair] == key : true }
|
76
|
+
describe_instances.select {|a| key ? a[:keypair] == key : true } if describe_instances
|
77
77
|
end
|
78
78
|
# Instances
|
79
79
|
# Get the master from the cloud
|
@@ -87,7 +87,7 @@ module PoolParty
|
|
87
87
|
end
|
88
88
|
# Reset the cache of descriptions
|
89
89
|
def reset!
|
90
|
-
end
|
90
|
+
end
|
91
91
|
def self.included(other)
|
92
92
|
PoolParty.register_remote_base(self.class.to_s.downcase.to_sym)
|
93
93
|
end
|
@@ -1,38 +1,15 @@
|
|
1
1
|
module PoolParty
|
2
2
|
class Gem
|
3
3
|
|
4
|
-
|
4
|
+
virtual_resource(:gempackage) do
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
}
|
12
|
-
EOE
|
6
|
+
def loaded
|
7
|
+
has_exec(:name => "gem-package-#{name}", :cwd => "/tmp", :path => "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/var/lib/gems/1.8/bin") do
|
8
|
+
command "gem install --no-ri --no-rdoc #{"--version \"#{version}\"" if respond_to?(:version)} #{"--source \"#{source}\"" if respond_to?(:source)} #{@parent.name}"
|
9
|
+
ifnot "gem list --local #{@parent.name} | grep #{@parent.name} #{"| grep #{version}" if respond_to?(:version)}"
|
10
|
+
end
|
13
11
|
end
|
14
12
|
|
15
|
-
custom_function <<-EOF
|
16
|
-
define gem_package ($source = "http://gems", $version, $package=false) {
|
17
|
-
include ruby
|
18
|
-
|
19
|
-
if $version {
|
20
|
-
exec { "gem-package-$package":
|
21
|
-
path => "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/var/lib/gems/1.8/bin",
|
22
|
-
cwd => "/tmp",
|
23
|
-
command => "gem install --source $source --version \"$version\" $package",
|
24
|
-
unless => "gem list --local $package | grep \"$package\" | grep \"$version\""
|
25
|
-
}
|
26
|
-
} else {
|
27
|
-
exec { "gem-package-$package":
|
28
|
-
path => "/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/var/lib/gems/1.8/bin",
|
29
|
-
cwd => "/tmp",
|
30
|
-
command => "gem install --source $source $package",
|
31
|
-
unless => "gem list --local $package | grep \"$package\"
|
32
|
-
}
|
33
|
-
}
|
34
|
-
}
|
35
|
-
EOF
|
36
13
|
end
|
37
14
|
|
38
15
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PoolParty
|
2
|
+
class Git
|
3
|
+
|
4
|
+
virtual_resource(:git) do
|
5
|
+
|
6
|
+
def loaded
|
7
|
+
|
8
|
+
has_directory(:name => "#{name}", :path => "#{path}", :user => "#{user || Base.user}")
|
9
|
+
|
10
|
+
exec({:name => "git-#{name}", :command => (user ? "git clone #{user}@#{source}" : "git clone #{source}")}) do
|
11
|
+
cwd "#{path}"
|
12
|
+
requires "File[#{name}]"
|
13
|
+
end
|
14
|
+
|
15
|
+
exec(:name => "git-update-#{name}", :cwd => "#{path}") do
|
16
|
+
requires "Exec['git-#{name}']"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
data/lib/poolparty/pool/base.rb
CHANGED
@@ -20,21 +20,19 @@ module PoolParty
|
|
20
20
|
:base_config_directory => "/etc/poolparty",
|
21
21
|
:template_directory => "tmp/templates",
|
22
22
|
:template_path => "/var/lib/puppet/templates",
|
23
|
+
:default_specfile_name => "pool.spec",
|
23
24
|
:port => "80",
|
24
25
|
:forwarding_port => "8080",
|
25
26
|
:proxy_mode => "http",
|
26
27
|
:pool_logger_location => File.join(Dir.pwd, "logs"),
|
27
28
|
# EC2 Options
|
28
|
-
:ami => "ami-
|
29
|
+
:ami => "ami-1cd73375"
|
29
30
|
})
|
30
31
|
|
31
32
|
# Class methods
|
32
33
|
class << self
|
33
|
-
def actionable_default_options
|
34
|
-
default_options.merge!({:access_key => self.access_key,:secret_access_key => secret_access_key})
|
35
|
-
end
|
36
34
|
def options(h={})
|
37
|
-
@options ||=
|
35
|
+
@options ||= default_options.merge(h)
|
38
36
|
end
|
39
37
|
# Get the access_key
|
40
38
|
def access_key
|
@@ -46,6 +44,8 @@ module PoolParty
|
|
46
44
|
def load_keys_from_file
|
47
45
|
@keys ||= get_working_key_file_locations ? YAML::load( open(get_working_key_file_locations).read ) : {}
|
48
46
|
end
|
47
|
+
# Store the keys in a yaml format to give the master access
|
48
|
+
# So that the master has access to the files
|
49
49
|
def store_keys_in_file
|
50
50
|
unless access_key.nil? || secret_access_key.nil?
|
51
51
|
write_to_file( key_file_locations.first, YAML::dump({:access_key => access_key, :secret_access_key => secret_access_key}))
|
@@ -62,8 +62,9 @@ module PoolParty
|
|
62
62
|
# Expected places for the instances.list to be located at on the machine
|
63
63
|
def key_file_locations
|
64
64
|
[
|
65
|
-
"
|
65
|
+
".ppkeys",
|
66
66
|
"#{Base.base_config_directory}/.ppkeys",
|
67
|
+
"#{Base.storage_directory}/ppkeys",
|
67
68
|
"~/.ppkeys",
|
68
69
|
"ppkeys"
|
69
70
|
]
|
data/lib/poolparty/pool/cloud.rb
CHANGED
@@ -23,7 +23,7 @@ module PoolParty
|
|
23
23
|
include PrettyPrinter
|
24
24
|
include Configurable
|
25
25
|
include CloudResourcer
|
26
|
-
extend CloudResourcer
|
26
|
+
# extend CloudResourcer
|
27
27
|
# Net methods
|
28
28
|
include PoolParty::Remote::RemoterBase
|
29
29
|
include Remote
|
@@ -40,11 +40,12 @@ module PoolParty
|
|
40
40
|
})
|
41
41
|
|
42
42
|
def initialize(name, parent, &block)
|
43
|
-
@name = name
|
43
|
+
@name = name
|
44
|
+
# store_block(&block)
|
44
45
|
set_parent(parent) if parent
|
45
|
-
self.instance_eval &block if
|
46
|
+
self.instance_eval &block if block
|
46
47
|
# this can be overridden in the spec, but ec2 is the default
|
47
|
-
using :ec2
|
48
|
+
self.using :ec2
|
48
49
|
end
|
49
50
|
|
50
51
|
# Keypairs
|
@@ -60,13 +61,34 @@ module PoolParty
|
|
60
61
|
options[:keypair] = args.length > 0 ? args[0] : "#{@parent.respond_to?(:name) ? @parent.name : ""}_#{@name}"
|
61
62
|
end
|
62
63
|
|
64
|
+
# Prepare to send the new configuration to the instances
|
65
|
+
# First, let's make sure that our base directory is made
|
66
|
+
# Then copy the templates that have no other reference in
|
67
|
+
# a spec file. Make sure the keys are stored in a file
|
68
|
+
# For the master to have access to them
|
69
|
+
# Then, send the saved containing cloud instances to give the
|
70
|
+
# remote master access to the cloud options that are required
|
71
|
+
# for the master to run checks
|
63
72
|
def prepare_to_configuration
|
64
73
|
# clear_base_directory
|
65
74
|
make_base_directory
|
66
75
|
copy_misc_templates
|
67
76
|
Base.store_keys_in_file
|
77
|
+
Script.save!
|
78
|
+
copy_ssh_key # not my favorite...
|
68
79
|
end
|
69
80
|
|
81
|
+
def copy_ssh_key
|
82
|
+
copy_file_to_storage_directory(full_keypair_path)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Build the new poolparty manifest
|
86
|
+
# Wrapping all of these requirements into the one
|
87
|
+
# poolparty class.
|
88
|
+
#
|
89
|
+
# TODO: Consider the benefits of moving all the manifest
|
90
|
+
# classes to separate files and keeping the containing
|
91
|
+
# references in the include
|
70
92
|
def build_and_store_new_config_file
|
71
93
|
@manifest = build_manifest
|
72
94
|
config_file = ::File.join(Base.storage_directory, "poolparty.pp")
|
@@ -85,7 +107,7 @@ module PoolParty
|
|
85
107
|
|
86
108
|
# Configuration files
|
87
109
|
def build_manifest
|
88
|
-
reset_resources!
|
110
|
+
reset_resources!
|
89
111
|
add_poolparty_base_requirements
|
90
112
|
|
91
113
|
returning Array.new do |str|
|
@@ -105,6 +127,13 @@ module PoolParty
|
|
105
127
|
end.join("\n")
|
106
128
|
end
|
107
129
|
|
130
|
+
# To allow the remote instances to do their job,
|
131
|
+
# they need a few options to run, these are the required options
|
132
|
+
# to be saved on the remote "master" machine
|
133
|
+
def minimum_runnable_options
|
134
|
+
[:keypair, :minimum_instances, :maximum_instances]
|
135
|
+
end
|
136
|
+
|
108
137
|
# Add all the poolparty requirements here
|
109
138
|
# NOTE: These are written as plugins in the lib/poolparty/base_packages directory
|
110
139
|
# for examples.
|
@@ -20,9 +20,9 @@ module PoolParty
|
|
20
20
|
|
21
21
|
# Resources for function call
|
22
22
|
class CallFunction < Resource
|
23
|
-
def initialize(str="", opts={}, &block)
|
23
|
+
def initialize(str="", opts={}, parent=self, &block)
|
24
24
|
@str = str
|
25
|
-
super(opts, &block)
|
25
|
+
super(opts, parent, &block)
|
26
26
|
end
|
27
27
|
def to_string(prev="")
|
28
28
|
returning Array.new do |arr|
|
@@ -32,9 +32,9 @@ module PoolParty
|
|
32
32
|
end
|
33
33
|
|
34
34
|
class CustomResource < Resource
|
35
|
-
def initialize(name=:custom_method, opts={}, &block)
|
35
|
+
def initialize(name=:custom_method, opts={}, parent=self, &block)
|
36
36
|
@name = name
|
37
|
-
super(opts, &block)
|
37
|
+
super(opts, parent, &block)
|
38
38
|
end
|
39
39
|
|
40
40
|
def self.inherited(subclass)
|
@@ -6,7 +6,6 @@ module PoolParty
|
|
6
6
|
include Configurable
|
7
7
|
include CloudResourcer
|
8
8
|
include Resources
|
9
|
-
extend Resources
|
10
9
|
|
11
10
|
attr_accessor :parent
|
12
11
|
class_inheritable_accessor :name
|
@@ -22,19 +21,19 @@ module PoolParty
|
|
22
21
|
def enable
|
23
22
|
end
|
24
23
|
|
25
|
-
def method_missing(m, *args, &block)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
def get_from_options(m, *args)
|
36
|
-
|
37
|
-
end
|
24
|
+
# def method_missing(m, *args, &block)
|
25
|
+
# if block_given?
|
26
|
+
# (args[0].class == self.class) ? args[0].instance_eval(&block) : super
|
27
|
+
# elsif parent && parent.respond_to?(m)
|
28
|
+
# parent.send m, *args, &block
|
29
|
+
# else
|
30
|
+
# get_from_options(m, *args)
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# def get_from_options(m, *args)
|
35
|
+
# args.empty? ? options[m] : options[m] = args[0]
|
36
|
+
# end
|
38
37
|
|
39
38
|
end
|
40
39
|
|