auser-poolparty 0.2.2 → 0.2.3
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 +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
|
|