auser-poolparty 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +1 -0
- data/README.txt +5 -7
- data/Rakefile +27 -12
- data/bin/instance +2 -2
- data/bin/pool +8 -6
- data/config/reconfigure_instances_script.sh +3 -3
- data/config/sample-config.yml +1 -1
- data/lib/core/array.rb +5 -2
- data/lib/core/hash.rb +1 -1
- data/lib/core/string.rb +6 -2
- data/lib/helpers/plugin_spec_helper.rb +4 -5
- data/lib/modules/sprinkle_overrides.rb +24 -29
- data/lib/poolparty/application.rb +37 -27
- data/lib/poolparty/master.rb +35 -14
- data/lib/poolparty/plugin.rb +11 -6
- data/lib/poolparty/plugin_manager.rb +2 -2
- data/lib/poolparty/provider/{packages/essential.rb → essential.rb} +0 -0
- data/lib/poolparty/provider/{packages/git.rb → git.rb} +0 -0
- data/lib/poolparty/provider/{packages/haproxy.rb → haproxy.rb} +1 -1
- data/lib/poolparty/provider/{packages/heartbeat.rb → heartbeat.rb} +0 -0
- data/lib/poolparty/provider/{packages/rsync.rb → rsync.rb} +0 -0
- data/lib/poolparty/provider/{packages/ruby.rb → ruby.rb} +1 -1
- data/lib/poolparty/provider/{packages/s3fuse.rb → s3fuse.rb} +0 -0
- data/lib/poolparty/provider.rb +86 -2
- data/lib/poolparty/remote_instance.rb +35 -21
- data/lib/poolparty/remoter.rb +4 -1
- data/lib/poolparty/remoting.rb +2 -1
- data/lib/poolparty/tasks/cloud.rake +1 -1
- data/lib/poolparty/tasks/development.rake +48 -13
- data/lib/poolparty/tasks.rb +24 -6
- data/lib/poolparty.rb +8 -4
- data/poolparty.gemspec +10 -7
- data/spec/helpers/ec2_mock.rb +5 -2
- data/spec/{application_spec.rb → lib/application_spec.rb} +42 -9
- data/spec/{callback_spec.rb → lib/callback_spec.rb} +1 -1
- data/spec/{core_spec.rb → lib/core_spec.rb} +6 -4
- data/spec/{ec2_wrapper_spec.rb → lib/ec2_wrapper_spec.rb} +3 -3
- data/spec/{file_writer_spec.rb → lib/file_writer_spec.rb} +2 -2
- data/spec/{kernel_spec.rb → lib/kernel_spec.rb} +1 -1
- data/spec/{master_spec.rb → lib/master_spec.rb} +38 -16
- data/spec/{optioner_spec.rb → lib/optioner_spec.rb} +1 -1
- data/spec/{plugin_manager_spec.rb → lib/plugin_manager_spec.rb} +3 -3
- data/spec/{plugin_spec.rb → lib/plugin_spec.rb} +12 -1
- data/spec/{pool_binary_spec.rb → lib/pool_binary_spec.rb} +1 -1
- data/spec/{poolparty_spec.rb → lib/poolparty_spec.rb} +5 -5
- data/spec/lib/provider_spec.rb +72 -0
- data/spec/{remote_instance_spec.rb → lib/remote_instance_spec.rb} +51 -9
- data/spec/{remoter_spec.rb → lib/remoter_spec.rb} +7 -2
- data/spec/{remoting_spec.rb → lib/remoting_spec.rb} +60 -4
- data/spec/{scheduler_spec.rb → lib/scheduler_spec.rb} +1 -1
- data/spec/{string_spec.rb → lib/string_spec.rb} +1 -1
- data/spec/monitors/cpu_monitor_spec.rb +2 -2
- data/spec/monitors/memory_spec.rb +3 -3
- data/spec/monitors/misc_monitor_spec.rb +1 -1
- data/spec/monitors/web_spec.rb +3 -3
- metadata +46 -41
- data/lib/poolparty/provider/packages/monit.rb +0 -6
- data/lib/poolparty/provider/provider.rb +0 -100
- data/spec/provider_spec.rb +0 -18
data/CHANGELOG
CHANGED
data/README.txt
CHANGED
@@ -93,26 +93,24 @@ For more help, check http://poolpartyrb.com
|
|
93
93
|
== REQUIREMENTS:
|
94
94
|
|
95
95
|
* aws/s3
|
96
|
-
* SQS
|
97
96
|
* aska
|
98
97
|
* EC2
|
99
98
|
|
100
99
|
== INSTALL:
|
101
100
|
|
102
|
-
gem install poolparty
|
101
|
+
gem install auser-poolparty
|
103
102
|
|
104
103
|
== ROADMAP
|
105
104
|
|
106
|
-
|
107
|
-
* v0.0.6 - Speed the configuration on the instances
|
108
|
-
* v0.0.7 - Callback support
|
109
|
-
* v0.0.8 - Add SQS task support
|
105
|
+
v0.1.5 - Add AMI bundling tasks
|
110
106
|
|
111
107
|
== THANKS
|
112
108
|
|
113
109
|
Ron Evans, http://deadprogrammersociety.blogspot.com/ for his enthusiasm
|
114
110
|
Tim Goh, http://citrusbyte.com for sanity checks and thoughts
|
115
|
-
|
111
|
+
PJ Cabrera, http://pjtrix.com for excitement, thoughts and contribution
|
112
|
+
Blake Mizerany, http://sinatrarb.com/, for his support and ideas
|
113
|
+
Nicolás 'Foca' Sanguinetti, http://nicolassanguinetti.info/
|
116
114
|
|
117
115
|
== LICENSE:
|
118
116
|
|
data/Rakefile
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require "lib/poolparty"
|
2
|
+
require "./lib/poolparty"
|
3
|
+
|
3
4
|
begin
|
4
5
|
require 'echoe'
|
5
6
|
|
6
7
|
Echoe.new("poolparty") do |s|
|
7
|
-
s.author = "Ari Lerner"
|
8
|
+
s.author = ["Ari Lerner"]
|
9
|
+
s.rubyforge_name = "poolparty"
|
8
10
|
s.email = "ari.lerner@citrusbyte.com"
|
9
11
|
s.summary = "Run your entire application off EC2, managed and auto-scaling"
|
10
12
|
s.url = "http://poolpartyrb.com"
|
11
|
-
s.dependencies = ["aws-s3", "amazon-ec2", "auser-aska", "git", "crafterm-sprinkle", "SystemTimer"]
|
13
|
+
s.dependencies = ["aws-s3", "amazon-ec2", "auser-aska", "git", "crafterm-sprinkle", "SystemTimer", "open4"]
|
12
14
|
s.install_message = %q{
|
13
15
|
|
14
16
|
Get ready to jump in the pool, you just installed PoolParty!
|
@@ -20,20 +22,34 @@ begin
|
|
20
22
|
|
21
23
|
For more information, check http://poolpartyrb.com
|
22
24
|
On IRC:
|
23
|
-
irc.freenode.net
|
24
|
-
|
25
|
+
irc.freenode.net / #poolpartyrb
|
26
|
+
|
25
27
|
*** Ari Lerner @ <ari.lerner@citrusbyte.com> ***
|
26
28
|
}
|
27
29
|
end
|
28
|
-
|
29
30
|
rescue LoadError => boom
|
30
31
|
puts "You are missing a dependency required for meta-operations on this gem."
|
31
32
|
end
|
32
33
|
|
33
|
-
task :default => :test
|
34
|
-
|
35
34
|
PoolParty.include_tasks
|
36
35
|
|
36
|
+
# add spec tasks, if you have rspec installed
|
37
|
+
begin
|
38
|
+
require 'spec/rake/spectask'
|
39
|
+
|
40
|
+
Spec::Rake::SpecTask.new("spec") do |t|
|
41
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
42
|
+
t.spec_opts = ['--color']
|
43
|
+
end
|
44
|
+
|
45
|
+
Spec::Rake::SpecTask.new("rcov_spec") do |t|
|
46
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
47
|
+
t.spec_opts = ['--color']
|
48
|
+
t.rcov = true
|
49
|
+
t.rcov_opts = ['--exclude', '^spec,/gems/']
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
37
53
|
namespace(:pkg) do
|
38
54
|
## Rake task to create/update a .manifest file in your project, as well as update *.gemspec
|
39
55
|
desc %{Update ".manifest" with the latest list of project filenames. Respect\
|
@@ -64,9 +80,8 @@ namespace(:pkg) do
|
|
64
80
|
File.open('Manifest', 'w') {|f| f << list.join("\n") }
|
65
81
|
end
|
66
82
|
desc "Build gemspec for github"
|
67
|
-
task :gemspec => :manifest do
|
83
|
+
task :gemspec => [:manifest, :gem] do
|
68
84
|
require "yaml"
|
69
|
-
`rake manifest gem`
|
70
85
|
data = YAML.load(open("poolparty.gemspec").read).to_ruby
|
71
86
|
File.open("poolparty.gemspec", "w+") {|f| f << data }
|
72
87
|
end
|
@@ -82,12 +97,12 @@ namespace(:pkg) do
|
|
82
97
|
File.open("poolparty.gemspec", "w+") {|f| f << data }
|
83
98
|
end
|
84
99
|
desc "Get ready to release the gem"
|
85
|
-
task :prerelease => :gemspec_update do
|
100
|
+
task :prerelease => [:gemspec_update] do
|
86
101
|
`git add .`
|
87
102
|
`git ci -a -m "Updated gemspec for github"`
|
88
103
|
end
|
89
104
|
desc "Release them gem to the gem server"
|
90
|
-
task :release => :prerelease do
|
105
|
+
task :release => [:prerelease] do
|
91
106
|
`git push origin master`
|
92
107
|
end
|
93
108
|
end
|
data/bin/instance
CHANGED
@@ -13,13 +13,13 @@ Usage: instance [OPTIONS] { #{commandables.join(" | ")} }
|
|
13
13
|
EOU
|
14
14
|
})
|
15
15
|
|
16
|
-
PoolParty.
|
16
|
+
PoolParty.load_app
|
17
17
|
|
18
18
|
master = PoolParty::Master.new
|
19
19
|
list = PoolParty::Optioner.parse(ARGV.dup, %w(-v --verbose))
|
20
20
|
num = list.reject {|a| commandables.include?(a) }.pop
|
21
21
|
|
22
|
-
instance = master.get_node(num)
|
22
|
+
instance = master.get_node( num || 0 )
|
23
23
|
|
24
24
|
unless instance
|
25
25
|
puts "Cloud is not running"
|
data/bin/pool
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
-
|
3
|
-
$:.unshift(File.join(File.dirname(__FILE__), "lib"))
|
2
|
+
$:.unshift(File.join(File.dirname(__FILE__)))
|
4
3
|
require 'poolparty'
|
5
4
|
|
6
5
|
def display_config_data
|
7
6
|
PoolParty.message <<-EOM
|
8
|
-
|
7
|
+
PoolParty cloud: #{PoolParty::Application.app_name ? "#{PoolParty::Application.app_name} " : "" }
|
9
8
|
On #{PoolParty::Application.ami}
|
10
9
|
Minimum instances: #{PoolParty::Application.minimum_instances}
|
11
10
|
Maximum instances: #{PoolParty::Application.maximum_instances}
|
@@ -16,6 +15,7 @@ Starting #{PoolParty::Application.app_name ? "#{PoolParty::Application.app_name}
|
|
16
15
|
Monitors available:
|
17
16
|
--------------
|
18
17
|
#{PoolParty.registered_monitors.collect {|a| " #{a}"}}
|
18
|
+
|
19
19
|
Plugins:
|
20
20
|
--------------
|
21
21
|
#{Dir["#{PoolParty::Application.plugin_dir}/*"].collect {|a| " #{File.basename(a)}"}.join("\n")}
|
@@ -30,8 +30,8 @@ Usage: pool [OPTIONS] {start | stop | list | clouds_list | maintain | restart |
|
|
30
30
|
-----------------------------------------------------------------
|
31
31
|
EOU
|
32
32
|
})
|
33
|
-
|
34
|
-
PoolParty.
|
33
|
+
|
34
|
+
PoolParty.load_app
|
35
35
|
master = PoolParty::Master.new
|
36
36
|
list = PoolParty::Optioner.parse(ARGV.dup, %w(-v))
|
37
37
|
|
@@ -74,7 +74,9 @@ list.each do |cmd|
|
|
74
74
|
when "switch"
|
75
75
|
list.shift
|
76
76
|
context = list.shift
|
77
|
-
|
77
|
+
keyfilename = ".#{context}_pool_keys"
|
78
|
+
PoolParty.message "switching cloud to #{context}"
|
79
|
+
context ? Kernel.system("source $HOME/#{keyfilename}") : puts("You must supply a context to switch to")
|
78
80
|
else
|
79
81
|
puts master.list
|
80
82
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
#!/bin/sh
|
2
2
|
|
3
|
+
echo "Setting up pem files"
|
4
|
+
:setup_pems
|
3
5
|
# Move the hosts file
|
4
6
|
echo "Moving the hosts file into place"
|
5
7
|
:move_hostfile
|
@@ -15,9 +17,6 @@ echo "If this is the master, I'm configuring it as the master now"
|
|
15
17
|
# Configure haproxy
|
16
18
|
echo "Configuring and starting haproxy"
|
17
19
|
:configure_haproxy
|
18
|
-
# Set this hostname as appropriate in the cloud
|
19
|
-
echo "Setting new hostname"
|
20
|
-
:set_hostname
|
21
20
|
# Configure heartbeat
|
22
21
|
echo "Moving all the resource.d files into place"
|
23
22
|
:configure_resource_d
|
@@ -33,5 +32,6 @@ echo "Configuring monit"
|
|
33
32
|
# Update the plugins
|
34
33
|
echo "Updating plugins"
|
35
34
|
:update_plugins
|
35
|
+
# Run user tasks
|
36
36
|
echo "Running user tasks"
|
37
37
|
:user_tasks
|
data/config/sample-config.yml
CHANGED
data/lib/core/array.rb
CHANGED
@@ -7,7 +7,10 @@ class Array
|
|
7
7
|
def collect_with_index &block
|
8
8
|
self.enum_for(:each_with_index).collect &block
|
9
9
|
end
|
10
|
-
def runnable
|
11
|
-
self.join(" \n ").runnable
|
10
|
+
def runnable(quiet=true)
|
11
|
+
self.join(" \n ").runnable(quiet)
|
12
|
+
end
|
13
|
+
def nice_runnable(quiet=true)
|
14
|
+
self.join(" \n ").nice_runnable(quiet)
|
12
15
|
end
|
13
16
|
end
|
data/lib/core/hash.rb
CHANGED
data/lib/core/string.rb
CHANGED
@@ -17,8 +17,12 @@ class String
|
|
17
17
|
def arrayable
|
18
18
|
self.strip.split(/\n/)
|
19
19
|
end
|
20
|
-
def runnable
|
21
|
-
|
20
|
+
def runnable(quite=true)
|
21
|
+
# map {|l| l << "#{" >/dev/null 2>/dev/null" if quite}" }.
|
22
|
+
self.strip.split(/\n/).join(" && ")
|
23
|
+
end
|
24
|
+
def nice_runnable(quite=true)
|
25
|
+
self.split(/ && /).join("\n")
|
22
26
|
end
|
23
27
|
def classify
|
24
28
|
self.capitalize
|
@@ -6,8 +6,10 @@ module PoolParty
|
|
6
6
|
@klass = klass.send :new
|
7
7
|
klass.stub!(:new).and_return @klass
|
8
8
|
|
9
|
-
|
9
|
+
@master = Master.new
|
10
10
|
@instances = define_instances(num)
|
11
|
+
|
12
|
+
Master.stub!(:new).and_return @master
|
11
13
|
|
12
14
|
@master.stub!(:execute_tasks).and_return true
|
13
15
|
@master.stub!(:launch_minimum_instances).and_return true
|
@@ -19,13 +21,9 @@ module PoolParty
|
|
19
21
|
Kernel.stub!(:system).and_return "true"
|
20
22
|
|
21
23
|
Provider.stub!(:install_poolparty).and_return true
|
22
|
-
Provider.stub!(:install_userpackages).and_return true
|
23
24
|
|
24
25
|
[@klass, @master, @instances]
|
25
26
|
end
|
26
|
-
def self.define_master
|
27
|
-
@master ||= Master.new
|
28
|
-
end
|
29
27
|
def self.define_instances(num)
|
30
28
|
# Too many gross evals
|
31
29
|
returning [] do |arr|
|
@@ -34,6 +32,7 @@ module PoolParty
|
|
34
32
|
@instance#{i} = RemoteInstance.new
|
35
33
|
@instance#{i}.stub!(:ssh).and_return "true"
|
36
34
|
@instance#{i}.stub!(:scp).and_return "true"
|
35
|
+
@instance#{i}.stub!(:run).and_return "true"
|
37
36
|
@instance#{i}.stub!(:name).and_return "node#{i}"
|
38
37
|
@instance#{i}.stub!(:ip).and_return "127.0.0.#{i}"
|
39
38
|
EOE
|
@@ -1,32 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
if @custom_dir
|
12
|
-
return @custom_dir
|
13
|
-
elsif @source.split('/').last =~ /(.*)\.(tar\.gz|tgz|tar\.bz2|tb2)/
|
14
|
-
return $1
|
15
|
-
end
|
16
|
-
raise "Unknown base path for source archive: #{@source}, please update code knowledge"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class Gem < Installer
|
21
|
-
protected
|
22
|
-
def install_sequence
|
23
|
-
cmd = "gem install -y #{gem}"
|
24
|
-
cmd << " --version '#{version}'" if version
|
25
|
-
cmd << " --source #{source}" if source
|
26
|
-
cmd
|
27
|
-
end
|
1
|
+
Sprinkle::Installers::Source.extend Module.new do
|
2
|
+
def custom_dir(dir)
|
3
|
+
@custom_dir = dir
|
4
|
+
end
|
5
|
+
|
6
|
+
def base_dir
|
7
|
+
if @custom_dir
|
8
|
+
return @custom_dir
|
9
|
+
elsif @source.split('/').last =~ /(.*)\.(tar\.gz|tgz|tar\.bz2|tb2)/
|
10
|
+
return $1
|
28
11
|
end
|
29
|
-
|
30
|
-
|
12
|
+
raise "Unknown base path for source archive: #{@source}, please update code knowledge"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
Sprinkle::Installers::Gem.extend Module.new do
|
16
|
+
def platform(platform=nil)
|
17
|
+
@platform ||= platform
|
31
18
|
end
|
19
|
+
protected
|
20
|
+
def install_sequence
|
21
|
+
cmd = "gem install -y #{gem}"
|
22
|
+
cmd << " --version '#{version}'" if version
|
23
|
+
cmd << " --source #{source}" if source
|
24
|
+
cmd << " --platform #{platform}" if platform
|
25
|
+
cmd
|
26
|
+
end
|
32
27
|
end
|
@@ -15,22 +15,20 @@ module PoolParty
|
|
15
15
|
# Default config file assumed to be at config/config.yml
|
16
16
|
def make_options(opts={})
|
17
17
|
loading_options = opts.delete(:optsparse) || {}
|
18
|
-
loading_options.merge!( opts
|
18
|
+
loading_options.merge!( opts || {})
|
19
|
+
|
20
|
+
load_options!(loading_options) # Load command-line options
|
21
|
+
config_file_location = (default_options[:config_file] || opts[:config_file])
|
19
22
|
|
20
|
-
config_file_location = (default_options[:config_file] || opts[:config_file])
|
21
23
|
# If the config_file options are specified and not empty
|
22
24
|
unless config_file_location.nil? || config_file_location.empty?
|
23
25
|
require "yaml"
|
24
26
|
# Try loading the file if it exists
|
25
27
|
filedata = File.open("#{config_file_location}").read if File.file?("#{config_file_location}")
|
26
|
-
|
27
|
-
default_options.merge!( YAML.load(filedata) ) if filedata
|
28
|
+
default_options.merge!( YAML.load(filedata) ) if filedata rescue ""
|
28
29
|
end
|
29
|
-
|
30
|
-
default_options.merge!(
|
31
|
-
load_options!(loading_options) # Load command-line options
|
32
|
-
default_options.merge!(local_user_data) unless local_user_data.nil?
|
33
|
-
|
30
|
+
# We want the command-line to overwrite the config file
|
31
|
+
default_options.merge!(local_user_data) unless local_user_data.nil?
|
34
32
|
OpenStruct.new(default_options)
|
35
33
|
end
|
36
34
|
|
@@ -39,8 +37,8 @@ module PoolParty
|
|
39
37
|
require 'optparse'
|
40
38
|
OptionParser.new do |op|
|
41
39
|
op.banner = opts[:banner] if opts[:banner]
|
42
|
-
op.on('-A key', '--access-key key', "Ec2 access key (ENV['
|
43
|
-
op.on('-S key', '--secret-access-key key', "Ec2 secret access key (ENV['
|
40
|
+
op.on('-A key', '--access-key key', "Ec2 access key (ENV['AWS_ACCESS_KEY'])") { |key| default_options[:access_key] = key }
|
41
|
+
op.on('-S key', '--secret-access-key key', "Ec2 secret access key (ENV['AWS_SECRET_ACCESS'])") { |key| default_options[:secret_access_key] = key }
|
44
42
|
op.on('-I ami', '--image-id id', "AMI instance (default: 'ami-40bc5829')") {|id| default_options[:ami] = id }
|
45
43
|
op.on('-k keypair', '--keypair name', "Keypair name (ENV['KEYPAIR_NAME'])") { |key| default_options[:keypair] = key }
|
46
44
|
op.on('-b bucket', '--bucket bucket', "Application bucket") { |bucket| default_options[:shared_bucket] = bucket }
|
@@ -60,7 +58,7 @@ module PoolParty
|
|
60
58
|
op.on('-s size', '--size size', "Run specific sized instance") {|s| default_options[:size] = s}
|
61
59
|
op.on('-a name', '--name name', "Application name") {|n| default_options[:app_name] = n}
|
62
60
|
op.on('-u username', '--username name', "Login with the user (default: root)") {|s| default_options[:user] = s}
|
63
|
-
op.on('-d user-data','--user-data data', "Extra data to send each of the instances (default: "")") { |data| default_options[:user_data] = data }
|
61
|
+
op.on('-d user-data','--user-data data', "Extra data to send each of the instances (default: "")") { |data| default_options[:user_data] = data.to_str }
|
64
62
|
op.on('-i', '--install-on-boot', 'Install the PoolParty and custom software on boot (default: false)') {|b| default_options[:install_on_load] = true}
|
65
63
|
op.on('-t seconds', '--polling-time', "Time between polling in seconds (default 50)") {|t| default_options[:polling_time] = t }
|
66
64
|
op.on('-v', '--[no-]verbose', 'Run verbosely (default: false)') {|v| default_options[:verbose] = true}
|
@@ -97,8 +95,8 @@ module PoolParty
|
|
97
95
|
:minimum_instances => 2,
|
98
96
|
:maximum_instances => 4,
|
99
97
|
:public_ip => "",
|
100
|
-
:access_key => ENV["
|
101
|
-
:secret_access_key => ENV["
|
98
|
+
:access_key => ENV["AWS_ACCESS_KEY"],
|
99
|
+
:secret_access_key => ENV["AWS_SECRET_ACCESS"],
|
102
100
|
:config_file => if ENV["CONFIG_FILE"] && !ENV["CONFIG_FILE"].empty?
|
103
101
|
ENV["CONFIG_FILE"]
|
104
102
|
elsif File.file?("config/config.yml")
|
@@ -108,13 +106,13 @@ module PoolParty
|
|
108
106
|
end,
|
109
107
|
:username => "root",
|
110
108
|
:ec2_dir => ENV["EC2_HOME"],
|
111
|
-
:keypair => ENV["KEYPAIR_NAME"]
|
109
|
+
:keypair => (ENV["KEYPAIR_NAME"].nil? || ENV["KEYPAIR_NAME"].empty?) ? File.basename(`pwd`).strip : ENV["KEYPAIR_NAME"].empty?,
|
112
110
|
:ami => 'ami-44bd592d',
|
113
111
|
:shared_bucket => "",
|
114
112
|
:expand_when => "web < 1.5\n memory > 0.85",
|
115
113
|
:contract_when => "cpu < 0.20\n memory < 0.10",
|
116
114
|
:os => "ubuntu",
|
117
|
-
:plugin_dir => "
|
115
|
+
:plugin_dir => "plugins",
|
118
116
|
:install_on_load => false,
|
119
117
|
:working_directory => Dir.pwd
|
120
118
|
}
|
@@ -125,29 +123,41 @@ module PoolParty
|
|
125
123
|
end
|
126
124
|
alias_method :managed_services, :master_managed_services
|
127
125
|
def launching_user_data
|
128
|
-
|
126
|
+
hash_to_launch_with.to_yaml
|
127
|
+
end
|
128
|
+
def hash_to_launch_with
|
129
|
+
@hash ||= { :polling_time => polling_time,
|
129
130
|
:access_key => access_key,
|
130
131
|
:secret_access_key => secret_access_key,
|
131
|
-
:user_data => user_data
|
132
|
+
:user_data => user_data,
|
133
|
+
:keypair_path => "/mnt"
|
134
|
+
}
|
132
135
|
end
|
133
|
-
def local_user_data
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
136
|
+
def local_user_data
|
137
|
+
unless @local_user_data
|
138
|
+
begin
|
139
|
+
@@timer.timeout(3.seconds) do
|
140
|
+
@local_user_data ||=YAML.load(open("http://169.254.169.254/latest/user-data").read)
|
141
|
+
end
|
142
|
+
rescue Exception => e
|
143
|
+
@local_user_data = {}
|
144
|
+
end
|
140
145
|
end
|
146
|
+
@local_user_data
|
141
147
|
end
|
142
148
|
# For testing purposes
|
143
149
|
def reset!
|
150
|
+
@options = nil
|
144
151
|
@local_user_data = nil
|
145
152
|
end
|
146
153
|
# Keypair path
|
147
154
|
# Idiom:
|
148
|
-
# /Users/username/.ec2/
|
155
|
+
# /Users/username/.ec2/[name]
|
149
156
|
def keypair_path
|
150
|
-
|
157
|
+
options.keypair_path ? options.keypair_path : "#{ec2_dir}/#{keypair_name}"
|
158
|
+
end
|
159
|
+
def keypair_name
|
160
|
+
"id_rsa-#{keypair}"
|
151
161
|
end
|
152
162
|
# Are we in development or test mode
|
153
163
|
%w(development production test).each do |env|
|
data/lib/poolparty/master.rb
CHANGED
@@ -67,9 +67,17 @@ module PoolParty
|
|
67
67
|
build_and_send_config_files_in_temp_directory
|
68
68
|
remote_configure_instances
|
69
69
|
|
70
|
-
|
70
|
+
nodes.each do |node|
|
71
71
|
node.configure
|
72
|
-
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
before :install_cloud, :add_ssh_key
|
75
|
+
after :configure_cloud, :remove_ssh_key
|
76
|
+
def add_ssh_key(i)
|
77
|
+
Kernel.system("ssh-add #{Application.keypair_path} >/dev/null 2>/dev/null")
|
78
|
+
end
|
79
|
+
def remove_ssh_key(i)
|
80
|
+
Kernel.system("ssh-add -d #{Application.keypair_name} >/dev/null 2>/dev/null")
|
73
81
|
end
|
74
82
|
def install_cloud(bool=false)
|
75
83
|
if Application.install_on_load? || bool
|
@@ -77,14 +85,13 @@ module PoolParty
|
|
77
85
|
# update packages.
|
78
86
|
update_apt_string =<<-EOE
|
79
87
|
touch /etc/apt/sources.list
|
80
|
-
echo 'deb http://mirrors.
|
81
|
-
|
88
|
+
echo 'deb http://mirrors.kernel.org/ubuntu hardy main universe' >> /etc/apt/sources.list
|
89
|
+
apt-get update --fix-missing
|
82
90
|
EOE
|
83
91
|
|
84
92
|
ssh(update_apt_string)
|
85
93
|
|
86
|
-
Provider.install_poolparty
|
87
|
-
Provider.install_userpackages(cloud_ips)
|
94
|
+
Provider.install_poolparty
|
88
95
|
|
89
96
|
# For plugins
|
90
97
|
nodes.each do |node|
|
@@ -174,18 +181,20 @@ module PoolParty
|
|
174
181
|
Kernel.system("tar -czf #{base_tmp_dir}/plugins.tar.gz #{File.basename(Application.plugin_dir)}")
|
175
182
|
end
|
176
183
|
|
177
|
-
|
178
|
-
|
184
|
+
if Master.requires_heartbeat?
|
185
|
+
build_and_copy_heartbeat_authkeys_file
|
186
|
+
File.copy(get_config_file_for("cloud_master_takeover"), "#{base_tmp_dir}/cloud_master_takeover")
|
187
|
+
File.copy(get_config_file_for("heartbeat.conf"), "#{base_tmp_dir}/ha.cf")
|
188
|
+
end
|
179
189
|
|
180
190
|
File.copy(Application.config_file, "#{base_tmp_dir}/config.yml") if Application.config_file && File.exists?(Application.config_file)
|
181
191
|
File.copy(Application.keypair_path, "#{base_tmp_dir}/keypair") if File.exists?(Application.keypair_path)
|
182
192
|
|
183
|
-
|
184
|
-
|
193
|
+
copy_pem_files_to_tmp_dir
|
194
|
+
|
185
195
|
copy_config_files_in_directory_to_tmp_dir("config/resource.d")
|
186
|
-
copy_config_files_in_directory_to_tmp_dir("config/monit.d")
|
187
|
-
|
188
|
-
build_and_copy_heartbeat_authkeys_file
|
196
|
+
# copy_config_files_in_directory_to_tmp_dir("config/monit.d")
|
197
|
+
|
189
198
|
build_haproxy_file
|
190
199
|
Master.build_user_global_files
|
191
200
|
|
@@ -200,6 +209,15 @@ module PoolParty
|
|
200
209
|
end
|
201
210
|
end
|
202
211
|
end
|
212
|
+
def copy_pem_files_to_tmp_dir
|
213
|
+
%w(EC2_CERT EC2_PRIVATE_KEY).each do |key|
|
214
|
+
begin
|
215
|
+
file = `echo $#{key}`.strip
|
216
|
+
File.copy(file, "#{base_tmp_dir}/#{File.basename(file)}")
|
217
|
+
rescue Exception => e
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
203
221
|
def cleanup_tmp_directory(c)
|
204
222
|
Dir["#{base_tmp_dir}/*"].each {|f| FileUtils.rm_rf f} if File.directory?("tmp/")
|
205
223
|
end
|
@@ -286,7 +304,7 @@ chmod +x #{script_file}
|
|
286
304
|
# Build basic configuration script for the node
|
287
305
|
def build_reconfigure_instances_script_for(node)
|
288
306
|
write_to_file_for("configuration", node) do
|
289
|
-
open(Application.sh_reconfigure_instances_script).read.strip ^ node.configure_tasks
|
307
|
+
open(Application.sh_reconfigure_instances_script).read.strip ^ node.configure_tasks( !PoolParty.verbose? )
|
290
308
|
end
|
291
309
|
end
|
292
310
|
|
@@ -399,6 +417,9 @@ chmod +x #{script_file}
|
|
399
417
|
def get_master
|
400
418
|
new.nodes[0]
|
401
419
|
end
|
420
|
+
def cloud_ips
|
421
|
+
new.cloud_ips
|
422
|
+
end
|
402
423
|
def get_next_node(node)
|
403
424
|
new.get_next_node(node)
|
404
425
|
end
|
data/lib/poolparty/plugin.rb
CHANGED
@@ -31,12 +31,8 @@ module PoolParty
|
|
31
31
|
PoolParty::RemoteInstance.user_tasks << str
|
32
32
|
end
|
33
33
|
|
34
|
-
def self.
|
35
|
-
PoolParty::Provider.
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.define_package_string(str)
|
39
|
-
PoolParty::Provider.define_user_install str
|
34
|
+
def self.define_custom_package name=:userpackage, &block
|
35
|
+
PoolParty::Provider.define_custom_package name, &block
|
40
36
|
end
|
41
37
|
|
42
38
|
def self.define_global_file(name, &block)
|
@@ -47,6 +43,15 @@ module PoolParty
|
|
47
43
|
PoolParty::Master.define_node_user_file(name, &block)
|
48
44
|
end
|
49
45
|
|
46
|
+
def add_user_data(h={})
|
47
|
+
case h.class.to_s
|
48
|
+
when "String"
|
49
|
+
PoolParty::Application.user_data << h
|
50
|
+
when "Hash"
|
51
|
+
PoolParty::Application.hash_to_launch_with.merge!(h)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
50
55
|
def read_config_file(filename)
|
51
56
|
return {} unless filename
|
52
57
|
YAML.load(open(filename).read)
|
@@ -51,7 +51,7 @@ module PoolParty
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def self.plugin_dirs
|
54
|
-
Dir["#{PoolParty.user_dir}/
|
54
|
+
Dir["#{PoolParty.user_dir}/plugin/*"]
|
55
55
|
end
|
56
56
|
|
57
57
|
def self.plugin_directory(path)
|
@@ -61,7 +61,7 @@ module PoolParty
|
|
61
61
|
FileUtils.mkdir_p base_plugin_dir rescue ""
|
62
62
|
end
|
63
63
|
def self.base_plugin_dir
|
64
|
-
File.join(PoolParty.root_dir, "
|
64
|
+
File.join(PoolParty.root_dir, "plugin")
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -18,7 +18,7 @@ package :rubygems do
|
|
18
18
|
# custom_install 'ruby setup.rb'
|
19
19
|
# end
|
20
20
|
apt %w( rubygems )
|
21
|
-
post :install, "gem update --system", "gem sources -a http://gems.github.com"
|
21
|
+
post :install, "sed -i s/require\ 'rubygems'/require\ 'rubygems'\nrequire\ 'rubygems\/gem_runner'/g", "gem update --system", "gem sources -a http://gems.github.com"
|
22
22
|
requires :ruby
|
23
23
|
end
|
24
24
|
|
File without changes
|