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.
Files changed (59) hide show
  1. data/CHANGELOG +1 -0
  2. data/README.txt +5 -7
  3. data/Rakefile +27 -12
  4. data/bin/instance +2 -2
  5. data/bin/pool +8 -6
  6. data/config/reconfigure_instances_script.sh +3 -3
  7. data/config/sample-config.yml +1 -1
  8. data/lib/core/array.rb +5 -2
  9. data/lib/core/hash.rb +1 -1
  10. data/lib/core/string.rb +6 -2
  11. data/lib/helpers/plugin_spec_helper.rb +4 -5
  12. data/lib/modules/sprinkle_overrides.rb +24 -29
  13. data/lib/poolparty/application.rb +37 -27
  14. data/lib/poolparty/master.rb +35 -14
  15. data/lib/poolparty/plugin.rb +11 -6
  16. data/lib/poolparty/plugin_manager.rb +2 -2
  17. data/lib/poolparty/provider/{packages/essential.rb → essential.rb} +0 -0
  18. data/lib/poolparty/provider/{packages/git.rb → git.rb} +0 -0
  19. data/lib/poolparty/provider/{packages/haproxy.rb → haproxy.rb} +1 -1
  20. data/lib/poolparty/provider/{packages/heartbeat.rb → heartbeat.rb} +0 -0
  21. data/lib/poolparty/provider/{packages/rsync.rb → rsync.rb} +0 -0
  22. data/lib/poolparty/provider/{packages/ruby.rb → ruby.rb} +1 -1
  23. data/lib/poolparty/provider/{packages/s3fuse.rb → s3fuse.rb} +0 -0
  24. data/lib/poolparty/provider.rb +86 -2
  25. data/lib/poolparty/remote_instance.rb +35 -21
  26. data/lib/poolparty/remoter.rb +4 -1
  27. data/lib/poolparty/remoting.rb +2 -1
  28. data/lib/poolparty/tasks/cloud.rake +1 -1
  29. data/lib/poolparty/tasks/development.rake +48 -13
  30. data/lib/poolparty/tasks.rb +24 -6
  31. data/lib/poolparty.rb +8 -4
  32. data/poolparty.gemspec +10 -7
  33. data/spec/helpers/ec2_mock.rb +5 -2
  34. data/spec/{application_spec.rb → lib/application_spec.rb} +42 -9
  35. data/spec/{callback_spec.rb → lib/callback_spec.rb} +1 -1
  36. data/spec/{core_spec.rb → lib/core_spec.rb} +6 -4
  37. data/spec/{ec2_wrapper_spec.rb → lib/ec2_wrapper_spec.rb} +3 -3
  38. data/spec/{file_writer_spec.rb → lib/file_writer_spec.rb} +2 -2
  39. data/spec/{kernel_spec.rb → lib/kernel_spec.rb} +1 -1
  40. data/spec/{master_spec.rb → lib/master_spec.rb} +38 -16
  41. data/spec/{optioner_spec.rb → lib/optioner_spec.rb} +1 -1
  42. data/spec/{plugin_manager_spec.rb → lib/plugin_manager_spec.rb} +3 -3
  43. data/spec/{plugin_spec.rb → lib/plugin_spec.rb} +12 -1
  44. data/spec/{pool_binary_spec.rb → lib/pool_binary_spec.rb} +1 -1
  45. data/spec/{poolparty_spec.rb → lib/poolparty_spec.rb} +5 -5
  46. data/spec/lib/provider_spec.rb +72 -0
  47. data/spec/{remote_instance_spec.rb → lib/remote_instance_spec.rb} +51 -9
  48. data/spec/{remoter_spec.rb → lib/remoter_spec.rb} +7 -2
  49. data/spec/{remoting_spec.rb → lib/remoting_spec.rb} +60 -4
  50. data/spec/{scheduler_spec.rb → lib/scheduler_spec.rb} +1 -1
  51. data/spec/{string_spec.rb → lib/string_spec.rb} +1 -1
  52. data/spec/monitors/cpu_monitor_spec.rb +2 -2
  53. data/spec/monitors/memory_spec.rb +3 -3
  54. data/spec/monitors/misc_monitor_spec.rb +1 -1
  55. data/spec/monitors/web_spec.rb +3 -3
  56. metadata +46 -41
  57. data/lib/poolparty/provider/packages/monit.rb +0 -6
  58. data/lib/poolparty/provider/provider.rb +0 -100
  59. data/spec/provider_spec.rb +0 -18
@@ -1,2 +1,86 @@
1
- $:.unshift(File.dirname(__FILE__))
2
- require "provider/provider"
1
+ module PoolParty
2
+ class Provider
3
+ include Sprinkle
4
+
5
+ def install_poolparty
6
+ PoolParty.message "Installing required poolparty paraphernalia"
7
+ load_packages
8
+ user_packages.map {|blk| blk.call if blk }
9
+
10
+ policy :poolparty, :roles => :app do
11
+ requires :git
12
+ requires :ruby
13
+ requires :heartbeat
14
+ requires :haproxy
15
+ requires :s3fs
16
+ requires :rsync
17
+ requires :required_gems
18
+
19
+ PoolParty::Provider.user_install_packages.each do |req|
20
+ requires req.to_sym
21
+ end
22
+ end
23
+
24
+ set_start_with_sprinkle
25
+ @deployment.process if @deployment
26
+ end
27
+
28
+ def self.define_custom_package name=:userpackages, &block
29
+ (user_install_packages << name).uniq!
30
+ user_packages << block
31
+ end
32
+
33
+ def user_packages
34
+ self.class.user_packages
35
+ end
36
+
37
+ def user_install_packages
38
+ self.class.user_install_packages
39
+ end
40
+
41
+ def self.user_packages
42
+ @user_packages ||= []
43
+ end
44
+
45
+ def self.user_install_packages
46
+ @load_strings ||= []
47
+ end
48
+
49
+ def load_packages
50
+ Dir["#{File.expand_path(File.dirname(__FILE__))}/provider/*"].each do |f|
51
+ load f
52
+ end
53
+ end
54
+
55
+ def set_start_with_sprinkle
56
+ deployment do
57
+ delivery :vlad do
58
+ set :user, "#{Application.username}"
59
+
60
+ Master.cloud_ips.each do |ip|
61
+ role :app, "#{Application.username}@#{ip}"
62
+ end
63
+ end
64
+
65
+ source do
66
+ prefix '/usr/local'
67
+ archives '/root/sources'
68
+ builds '/root/builds'
69
+ end
70
+ end
71
+
72
+ end
73
+
74
+ class << self
75
+ require "sprinkle"
76
+
77
+ def install_poolparty
78
+ singleton.install_poolparty
79
+ end
80
+ def singleton
81
+ @singleton ||= new
82
+ end
83
+ end
84
+
85
+ end
86
+ end
@@ -67,42 +67,42 @@ module PoolParty
67
67
  ssh("monit #{cmd} all")
68
68
  end
69
69
  end
70
- def configure_tasks
70
+ def configure_tasks(quiet=true)
71
71
  {
72
+ :setup_pems => setup_pems,
72
73
  :move_hostfile => change_hostname,
73
74
  :config_master => configure_master,
74
75
  :move_config_file => move_config_file,
75
- :set_hostname => change_hostname,
76
76
  :mount_s3_drive => mount_s3_drive,
77
- :update_plugins => update_plugin_string,
78
- :configure_monit => configure_monit,
77
+ :update_plugins => update_plugin_string,
79
78
  :configure_authkeys => configure_authkeys,
80
79
  :configure_resource_d => configure_resource_d,
81
80
  :configure_haproxy => setup_haproxy,
82
81
  :configure_heartbeat => configure_heartbeat,
83
82
  :user_tasks => user_tasks
84
- }
83
+ }#.map {|k,v| {k.to_sym => v.nice_runnable(quiet)} }.inject({}) {|a,s| s.merge(a) }
85
84
  end
86
85
  def user_tasks
87
86
  @@user_tasks ||= []
88
87
  end
89
88
  def move_config_file
90
89
  <<-EOC
91
- mv #{remote_base_tmp_dir}/config.yml ~/.config
90
+ #{if_exists "config.yml", "mv #{remote_base_tmp_dir}/config.yml ~/.config"}
92
91
  mkdir -p ~/.ec2
93
- mv #{remote_base_tmp_dir}/keypair ~/.ec2/id_rsa-#{Application.keypair}
92
+ #{if_exists "keypair", "mv #{remote_base_tmp_dir}/keypair ~/.ec2/#{Application.keypair_name}"}
94
93
  EOC
95
94
  end
96
- def configure_heartbeat
97
- <<-EOC
95
+ def configure_heartbeat
96
+ cmd=<<-EOC
98
97
  mv #{remote_base_tmp_dir}/ha.cf /etc/ha.d/ha.cf
99
98
  /etc/init.d/heartbeat start
100
99
  EOC
100
+ Master.requires_heartbeat? ? cmd : ""
101
101
  end
102
102
  def configure_authkeys
103
103
  <<-EOC
104
104
  mkdir -p /etc/ha.d
105
- mv #{remote_base_tmp_dir}/authkeys /etc/ha.d/
105
+ #{if_exists "authkeys", "mv #{remote_base_tmp_dir}/authkeys /etc/ha.d/"}
106
106
  EOC
107
107
  end
108
108
 
@@ -118,25 +118,32 @@ module PoolParty
118
118
 
119
119
  def configure_resource_d
120
120
  <<-EOC
121
- mkdir -p /etc/ha.d/resource.d
122
- mv #{remote_base_tmp_dir}/cloud_master_takeover /etc/ha.d/resource.d
123
- mv #{remote_base_tmp_dir}/resource.d/* /etc/ha.d/resource.d
121
+ mkdir -p /etc/ha.d/resource.d/
122
+ #{if_exists "cloud_master_takeover", "mv #{remote_base_tmp_dir}/cloud_master_takeover /etc/ha.d/resource.d"}
123
+ #{if_dir_exists "resource.d/", "mv #{remote_base_tmp_dir}/resource.d/* /etc/ha.d/resource.d"}
124
124
  EOC
125
125
  end
126
126
 
127
- def configure_monit
127
+ # def configure_monit
128
+ # <<-EOC
129
+ # mv #{remote_base_tmp_dir}/monitrc /etc/monit/monitrc
130
+ # mkdir -p /etc/monit.d/
131
+ # mv #{remote_base_tmp_dir}/monit.d/* /etc/monit.d/
132
+ # chown #{Application.username} /etc/monit/monitrc
133
+ # chmod 700 /etc/monit/monitrc
134
+ # EOC
135
+ # end
136
+
137
+ def setup_pems
128
138
  <<-EOC
129
- mv #{remote_base_tmp_dir}/monitrc /etc/monit/monitrc
130
- mkdir -p /etc/monit.d/
131
- mv #{remote_base_tmp_dir}/monit.d/* /etc/monit.d/
132
- chown #{Application.username} /etc/monit/monitrc
133
- chmod 700 /etc/monit/monitrc
139
+ #{if_exists "cert.pem", "mv #{remote_base_tmp_dir}/cert-*.pem #{Application.keypair_path}/cert-CLOUD.pem"}
140
+ #{if_exists "pk.pem", "mv #{remote_base_tmp_dir}/pk-*.pem #{Application.keypair_path}/pk-CLOUD.pem"}
134
141
  EOC
135
142
  end
136
143
 
137
144
  def change_hostname
138
145
  <<-EOC
139
- mv #{remote_base_tmp_dir}/#{name}-hosts /etc/hosts
146
+ #{if_exists "#{name}-hosts", "mv #{remote_base_tmp_dir}/#{name}-hosts /etc/hosts"}
140
147
  hostname -v #{name}
141
148
  EOC
142
149
  end
@@ -184,7 +191,14 @@ module PoolParty
184
191
  end
185
192
  def update_plugin_string
186
193
  dir = File.basename(Application.plugin_dir)
187
- "if [[ -f plugins.tar.gz ]]; then mkdir -p #{dir} && tar -zxf plugins.tar.gz -C #{dir}; fi"
194
+
195
+ if_exists "plugins.tar.gz", "mkdir -p #{dir} && tar -zxf #{remote_base_tmp_dir}/plugins.tar.gz -C #{dir}"
196
+ end
197
+ def if_exists(file, dothis)
198
+ "if [ -f #{remote_base_tmp_dir}/#{file} ]; then #{dothis}; fi"
199
+ end
200
+ def if_dir_exists(dir, dothis)
201
+ "if [ -d #{remote_base_tmp_dir}/#{dir} ]; then #{dothis}; fi"
188
202
  end
189
203
  # Is this the master and if not, is the master running?
190
204
  def is_not_master_and_master_is_not_running?
@@ -6,7 +6,10 @@ module PoolParty
6
6
  module Remoter
7
7
  module ClassMethods
8
8
  def ssh_string
9
- "ssh -i #{Application.keypair_path} -o StrictHostKeyChecking=no -l #{Application.username}"
9
+ (["ssh"] << ssh_array).join(" ")
10
+ end
11
+ def ssh_array
12
+ ["-o StrictHostKeyChecking=no", "-l '#{Application.username}'", "-i '#{Application.keypair_path}'"]
10
13
  end
11
14
  def rsync_string
12
15
  "rsync --delete -azP -e '#{ssh_string}' "
@@ -36,6 +36,7 @@ module PoolParty
36
36
  end
37
37
  # list of keypairs for the current AWS access key and secret key
38
38
  def cloud_keypairs
39
+ get_instances_description.each {|a| a[:keypair] = "no-keypair" unless a[:keypair] } # Get rid of the instances not launched with a keypair
39
40
  instances = get_instances_description.sort{|x,y| x[:keypair] <=> y[:keypair]}
40
41
  keypair = nil
41
42
  instances.map {|a| keypair != a[:keypair] ? (keypair = a[:keypair]; keypair) : nil }.compact
@@ -104,7 +105,7 @@ module PoolParty
104
105
  end
105
106
  # Request termination of all instances regardless of their state (includes pending instances)
106
107
  def request_termination_of_all_instances
107
- get_instances_description.each {|a| terminate_instance!(a[:instance_id])}
108
+ list_of_instances.each {|a| terminate_instance!(a[:instance_id])}
108
109
  end
109
110
  # Terminate instance by id
110
111
  def request_termination_of_instance(id)
@@ -28,7 +28,7 @@ namespace(:cloud) do
28
28
  # List the cloud
29
29
  desc "List cloud"
30
30
  task :list => :init do
31
- PoolParty::Master.new.list
31
+ puts PoolParty::Master.new.list
32
32
  end
33
33
  # Shutdown the cloud
34
34
  desc "Shutdown the entire cloud"
@@ -1,35 +1,70 @@
1
1
  namespace(:dev) do
2
- task :init do
2
+ task :initialize do
3
3
  setup_application
4
4
  run "mkdir ~/.ec2 >/dev/null 2>/dev/null" unless File.directory?("~/.ec2")
5
5
  end
6
6
  # Setup a basic development environment for the user
7
7
  desc "Setup development environment specify the config_file"
8
- task :setup => [:init] do
8
+ task :setup => [:initialize, :setup_keypair] do
9
+ certloc = "#{Application.ec2_dir}/#{Application.keypair}/cert-*.pem 2>/dev/null"
10
+ pkloc = "#{Application.ec2_dir}/#{Application.keypair}/pk-*.pem 2>/dev/null"
11
+ unless `ls #{certloc}`.length > 1 && `ls #{pkloc}`.length > 1
12
+ puts <<-EOM
13
+ Make sure you run rake dev:setup_pemkeys before you run this command
14
+
15
+ I cannot continue until your keys are setup.
16
+ exiting...
17
+ EOM
18
+ exit
19
+ end
9
20
  keyfilename = ".#{Application.keypair}_pool_keys"
10
21
  run <<-EOR
11
- echo 'export AWS_ACCESS_KEY_ID=\"#{Application.access_key}\"' > $HOME/#{keyfilename}
12
- echo 'export AWS_SECRET_ACCESS_ID=\"#{Application.secret_access_key}\"' >> $HOME/#{keyfilename}
22
+ echo 'export AWS_ACCESS_KEY=\"#{Application.access_key}\"' > $HOME/#{keyfilename}
23
+ echo 'export AWS_SECRET_ACCESS=\"#{Application.secret_access_key}\"' >> $HOME/#{keyfilename}
13
24
  echo 'export EC2_HOME=\"#{Application.ec2_dir}\"' >> $HOME/#{keyfilename}
14
25
  echo 'export KEYPAIR_NAME=\"#{Application.keypair}\"' >> $HOME/#{keyfilename}
15
- echo 'export CONFIG_FILE=\"#{Application.config_file}\"' >> $HOME/#{keyfilename}
16
26
  echo 'export EC2_PRIVATE_KEY=`ls ~/.ec2/#{Application.keypair}/pk-*.pem`;' >> $HOME/#{keyfilename}
17
27
  echo 'export EC2_CERT=`ls ~/.ec2/#{Application.keypair}/cert-*.pem`;' >> $HOME/#{keyfilename}
18
- source $HOME/#{keyfilename}
19
28
  EOR
29
+ puts <<-EOM
30
+ To work on this cloud, source the file like:
31
+
32
+ source #{Application.ec2_dir}/#{keyfilename}
33
+
34
+ EOM
20
35
  end
21
- desc "Generate a keypair"
22
- task :setup_keypair => :init do
36
+ desc "Generate a new keypair"
37
+ task :setup_keypair => [:initialize] do
23
38
  unless File.file?(Application.keypair_path)
24
- Application.keypair = "cloud"
25
- run <<-EOR
26
- ec2-add-keypair cloud > #{Application.keypair_path}
27
- chmod 600 #{Application.keypair_path}
39
+ Application.keypair ||= "cloud"
40
+ puts "-- setting up keypair named #{Application.keypair}"
41
+ run <<-EOR
42
+ chmod 600 #{Application.keypair_path} 2>/dev/null
43
+ mkdir ~/.ec2/#{Application.keypair} 2>/dev/null
44
+ ec2-add-keypair #{Application.keypair} > #{Application.keypair_path}
28
45
  EOR
29
46
  end
30
47
  end
48
+ desc "Setup pem keys"
49
+ task :setup_pemkeys => [:initialize] do
50
+ puts "Setting up stubbed pem keys in ~/.ec2/#{Application.keypair}"
51
+ run <<-EOR
52
+ mkdir -p ~/.ec2/#{Application.keypair} 2>/dev/null
53
+ echo 'UPDATE ME' > #{Application.ec2_dir}/#{Application.keypair}/cert-UPDATEME.pem
54
+ echo 'UPDATE ME' > #{Application.ec2_dir}/#{Application.keypair}/pk-UPDATEME.pem
55
+ EOR
56
+ puts "Don't forget to replace your ~/.ec2/#{Application.keypair}/*.pem keys with the real amazon keys"
57
+ end
58
+ desc "initialize setup"
59
+ task :init => [:setup_pemkeys]
60
+
61
+ desc "Just an argv test"
62
+ task :test => :initialize do
63
+ puts "---- Testing ----"
64
+ puts PoolParty.options(ARGV.dup)
65
+ end
31
66
  desc "Authorize base ports for application"
32
- task :authorize_ports => :init do
67
+ task :authorize_ports => :initialize do
33
68
  run <<-EOR
34
69
  ec2-authorize -p 22 default
35
70
  ec2-authorize -p 80 default
@@ -11,19 +11,37 @@ module PoolParty
11
11
  def define_tasks
12
12
  # Run the command on the local system
13
13
  def run(cmd)
14
- system(cmd.runnable)
14
+ Kernel.system(cmd.runnable)
15
15
  end
16
16
  # Basic setup action
17
17
  def setup_application
18
- PoolParty.options({:config_file => (ENV["CONFIG_FILE"] || ENV["config"]) })
18
+ @options ||= PoolParty.options(ARGV.dup)
19
19
  end
20
20
 
21
21
  # Require the poolparty specific tasks
22
- Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].each { |t| load t }
23
-
24
- Dir["#{PoolParty.plugin_dir}/*/Rakefile"].each {|t| load "#{t}" }
22
+ compiled_rakefile
25
23
 
24
+ desc "Reload the static variables"
25
+ task :reload do
26
+ reload!
27
+ end
26
28
  true
27
- end
29
+ end
30
+
31
+ def reload!
32
+ @compiled_rakefile = nil
33
+ end
34
+
35
+ def compiled_rakefile
36
+ rake_str = []
37
+
38
+ Dir["#{File.expand_path(File.dirname(__FILE__))}/tasks/*.rake"].each { |t| rake_str << open(t).read }
39
+ plugin_rakefiles
40
+
41
+ @compiled_rakefile ||= eval(rake_str.join("\n")) # Not ideal
42
+ end
43
+ def plugin_rakefiles
44
+ Dir["#{PoolParty.plugin_dir}/*/Rakefile"].each {|t| load t }
45
+ end
28
46
  end
29
47
  end
data/lib/poolparty.rb CHANGED
@@ -10,7 +10,11 @@ require 'rubygems'
10
10
  require "aws/s3"
11
11
  require "EC2"
12
12
  require "aska"
13
- require 'sprinkle'
13
+ begin
14
+ require 'crafterm-sprinkle'
15
+ rescue LoadError
16
+ require "sprinkle"
17
+ end
14
18
  require "pp"
15
19
  require "tempfile"
16
20
 
@@ -44,7 +48,7 @@ module PoolParty
44
48
  class Version #:nodoc:
45
49
  @major = 0
46
50
  @minor = 1
47
- @tiny = 0
51
+ @tiny = 1
48
52
 
49
53
  def self.string
50
54
  [@major, @minor, @tiny].join('.')
@@ -95,7 +99,7 @@ module PoolParty
95
99
  def registered_monitor?(name); registered_monitors.include?(name); end
96
100
  def registered_monitors; @@registered_monitors ||= [];end
97
101
 
98
- def load
102
+ def load_app
99
103
  load_monitors
100
104
  load_plugins
101
105
  end
@@ -112,7 +116,7 @@ module PoolParty
112
116
  @@installed_plugins = nil
113
117
  end
114
118
  def plugin_dir
115
- "#{user_dir}/vendor"
119
+ "#{user_dir}/plugins"
116
120
  end
117
121
  def read_config_file(filename)
118
122
  return {} unless filename
data/poolparty.gemspec CHANGED
@@ -1,21 +1,21 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{poolparty}
3
- s.version = "0.1.0"
3
+ s.version = "0.1.1"
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new("= 1.2") if s.respond_to? :required_rubygems_version=
6
6
  s.authors = ["Ari Lerner"]
7
7
  s.cert_chain = nil
8
- s.date = %q{2008-07-02}
8
+ s.date = %q{2008-07-19}
9
9
  s.description = %q{Run your entire application off EC2, managed and auto-scaling}
10
10
  s.email = %q{ari.lerner@citrusbyte.com}
11
11
  s.executables = ["instance", "pool", "poolnotify"]
12
- s.extra_rdoc_files = ["CHANGELOG", "README.txt", "bin", "bin/instance", "bin/pool", "bin/poolnotify", "lib", "lib/core", "lib/core/array.rb", "lib/core/exception.rb", "lib/core/float.rb", "lib/core/hash.rb", "lib/core/kernel.rb", "lib/core/module.rb", "lib/core/object.rb", "lib/core/proc.rb", "lib/core/string.rb", "lib/core/time.rb", "lib/helpers", "lib/helpers/plugin_spec_helper.rb", "lib/modules", "lib/modules/callback.rb", "lib/modules/ec2_wrapper.rb", "lib/modules/file_writer.rb", "lib/modules/safe_instance.rb", "lib/modules/sprinkle_overrides.rb", "lib/modules/vlad_override.rb", "lib/poolparty", "lib/poolparty.rb", "lib/poolparty/application.rb", "lib/poolparty/init.rb", "lib/poolparty/master.rb", "lib/poolparty/monitors", "lib/poolparty/monitors.rb", "lib/poolparty/monitors/cpu.rb", "lib/poolparty/monitors/memory.rb", "lib/poolparty/monitors/web.rb", "lib/poolparty/optioner.rb", "lib/poolparty/plugin.rb", "lib/poolparty/plugin_manager.rb", "lib/poolparty/provider", "lib/poolparty/provider.rb", "lib/poolparty/provider/packages", "lib/poolparty/provider/packages/essential.rb", "lib/poolparty/provider/packages/git.rb", "lib/poolparty/provider/packages/haproxy.rb", "lib/poolparty/provider/packages/heartbeat.rb", "lib/poolparty/provider/packages/monit.rb", "lib/poolparty/provider/packages/rsync.rb", "lib/poolparty/provider/packages/ruby.rb", "lib/poolparty/provider/packages/s3fuse.rb", "lib/poolparty/provider/provider.rb", "lib/poolparty/remote_instance.rb", "lib/poolparty/remoter.rb", "lib/poolparty/remoting.rb", "lib/poolparty/scheduler.rb", "lib/poolparty/tasks", "lib/poolparty/tasks.rb", "lib/poolparty/tasks/cloud.rake", "lib/poolparty/tasks/development.rake", "lib/poolparty/tasks/ec2.rake", "lib/poolparty/tasks/instance.rake", "lib/poolparty/tasks/plugins.rake", "lib/poolparty/tasks/server.rake", "lib/poolparty/thread_pool.rb", "lib/s3", "lib/s3/s3_object_store_folders.rb"]
13
- s.files = ["CHANGELOG", "README.txt", "Rakefile", "assets", "assets/clouds.png", "bin", "bin/instance", "bin/pool", "bin/poolnotify", "config", "config/cloud_master_takeover", "config/create_proxy_ami.sh", "config/haproxy.conf", "config/heartbeat.conf", "config/heartbeat_authkeys.conf", "config/installers", "config/installers/ubuntu_install.sh", "config/monit", "config/monit.conf", "config/monit/haproxy.monit.conf", "config/monit/nginx.monit.conf", "config/nginx.conf", "config/reconfigure_instances_script.sh", "config/sample-config.yml", "config/scp_instances_script.sh", "lib", "lib/core", "lib/core/array.rb", "lib/core/exception.rb", "lib/core/float.rb", "lib/core/hash.rb", "lib/core/kernel.rb", "lib/core/module.rb", "lib/core/object.rb", "lib/core/proc.rb", "lib/core/string.rb", "lib/core/time.rb", "lib/helpers", "lib/helpers/plugin_spec_helper.rb", "lib/modules", "lib/modules/callback.rb", "lib/modules/ec2_wrapper.rb", "lib/modules/file_writer.rb", "lib/modules/safe_instance.rb", "lib/modules/sprinkle_overrides.rb", "lib/modules/vlad_override.rb", "lib/poolparty", "lib/poolparty.rb", "lib/poolparty/application.rb", "lib/poolparty/init.rb", "lib/poolparty/master.rb", "lib/poolparty/monitors", "lib/poolparty/monitors.rb", "lib/poolparty/monitors/cpu.rb", "lib/poolparty/monitors/memory.rb", "lib/poolparty/monitors/web.rb", "lib/poolparty/optioner.rb", "lib/poolparty/plugin.rb", "lib/poolparty/plugin_manager.rb", "lib/poolparty/provider", "lib/poolparty/provider.rb", "lib/poolparty/provider/packages", "lib/poolparty/provider/packages/essential.rb", "lib/poolparty/provider/packages/git.rb", "lib/poolparty/provider/packages/haproxy.rb", "lib/poolparty/provider/packages/heartbeat.rb", "lib/poolparty/provider/packages/monit.rb", "lib/poolparty/provider/packages/rsync.rb", "lib/poolparty/provider/packages/ruby.rb", "lib/poolparty/provider/packages/s3fuse.rb", "lib/poolparty/provider/provider.rb", "lib/poolparty/remote_instance.rb", "lib/poolparty/remoter.rb", "lib/poolparty/remoting.rb", "lib/poolparty/scheduler.rb", "lib/poolparty/tasks", "lib/poolparty/tasks.rb", "lib/poolparty/tasks/cloud.rake", "lib/poolparty/tasks/development.rake", "lib/poolparty/tasks/ec2.rake", "lib/poolparty/tasks/instance.rake", "lib/poolparty/tasks/plugins.rake", "lib/poolparty/tasks/server.rake", "lib/poolparty/thread_pool.rb", "lib/s3", "lib/s3/s3_object_store_folders.rb", "spec", "spec/application_spec.rb", "spec/callback_spec.rb", "spec/core_spec.rb", "spec/ec2_wrapper_spec.rb", "spec/file_writer_spec.rb", "spec/files", "spec/files/describe_response", "spec/files/multi_describe_response", "spec/files/remote_desc_response", "spec/helpers", "spec/helpers/ec2_mock.rb", "spec/kernel_spec.rb", "spec/master_spec.rb", "spec/monitors", "spec/monitors/cpu_monitor_spec.rb", "spec/monitors/memory_spec.rb", "spec/monitors/misc_monitor_spec.rb", "spec/monitors/web_spec.rb", "spec/optioner_spec.rb", "spec/plugin_manager_spec.rb", "spec/plugin_spec.rb", "spec/pool_binary_spec.rb", "spec/poolparty_spec.rb", "spec/provider_spec.rb", "spec/remote_instance_spec.rb", "spec/remoter_spec.rb", "spec/remoting_spec.rb", "spec/scheduler_spec.rb", "spec/spec_helper.rb", "spec/string_spec.rb", "poolparty.gemspec"]
12
+ s.extra_rdoc_files = ["CHANGELOG", "README.txt", "bin", "bin/instance", "bin/pool", "bin/poolnotify", "lib", "lib/core", "lib/core/array.rb", "lib/core/exception.rb", "lib/core/float.rb", "lib/core/hash.rb", "lib/core/kernel.rb", "lib/core/module.rb", "lib/core/object.rb", "lib/core/proc.rb", "lib/core/string.rb", "lib/core/time.rb", "lib/helpers", "lib/helpers/plugin_spec_helper.rb", "lib/modules", "lib/modules/callback.rb", "lib/modules/ec2_wrapper.rb", "lib/modules/file_writer.rb", "lib/modules/safe_instance.rb", "lib/modules/sprinkle_overrides.rb", "lib/modules/vlad_override.rb", "lib/poolparty", "lib/poolparty.rb", "lib/poolparty/application.rb", "lib/poolparty/init.rb", "lib/poolparty/master.rb", "lib/poolparty/monitors", "lib/poolparty/monitors.rb", "lib/poolparty/monitors/cpu.rb", "lib/poolparty/monitors/memory.rb", "lib/poolparty/monitors/web.rb", "lib/poolparty/optioner.rb", "lib/poolparty/plugin.rb", "lib/poolparty/plugin_manager.rb", "lib/poolparty/provider", "lib/poolparty/provider.rb", "lib/poolparty/provider/essential.rb", "lib/poolparty/provider/git.rb", "lib/poolparty/provider/haproxy.rb", "lib/poolparty/provider/heartbeat.rb", "lib/poolparty/provider/rsync.rb", "lib/poolparty/provider/ruby.rb", "lib/poolparty/provider/s3fuse.rb", "lib/poolparty/remote_instance.rb", "lib/poolparty/remoter.rb", "lib/poolparty/remoting.rb", "lib/poolparty/scheduler.rb", "lib/poolparty/tasks", "lib/poolparty/tasks.rb", "lib/poolparty/tasks/cloud.rake", "lib/poolparty/tasks/development.rake", "lib/poolparty/tasks/ec2.rake", "lib/poolparty/tasks/instance.rake", "lib/poolparty/tasks/plugins.rake", "lib/poolparty/tasks/server.rake", "lib/poolparty/thread_pool.rb", "lib/s3", "lib/s3/s3_object_store_folders.rb"]
13
+ s.files = ["CHANGELOG", "README.txt", "Rakefile", "assets", "assets/clouds.png", "bin", "bin/instance", "bin/pool", "bin/poolnotify", "config", "config/cloud_master_takeover", "config/create_proxy_ami.sh", "config/haproxy.conf", "config/heartbeat.conf", "config/heartbeat_authkeys.conf", "config/installers", "config/installers/ubuntu_install.sh", "config/monit", "config/monit.conf", "config/monit/haproxy.monit.conf", "config/monit/nginx.monit.conf", "config/nginx.conf", "config/reconfigure_instances_script.sh", "config/sample-config.yml", "config/scp_instances_script.sh", "lib", "lib/core", "lib/core/array.rb", "lib/core/exception.rb", "lib/core/float.rb", "lib/core/hash.rb", "lib/core/kernel.rb", "lib/core/module.rb", "lib/core/object.rb", "lib/core/proc.rb", "lib/core/string.rb", "lib/core/time.rb", "lib/helpers", "lib/helpers/plugin_spec_helper.rb", "lib/modules", "lib/modules/callback.rb", "lib/modules/ec2_wrapper.rb", "lib/modules/file_writer.rb", "lib/modules/safe_instance.rb", "lib/modules/sprinkle_overrides.rb", "lib/modules/vlad_override.rb", "lib/poolparty", "lib/poolparty.rb", "lib/poolparty/application.rb", "lib/poolparty/init.rb", "lib/poolparty/master.rb", "lib/poolparty/monitors", "lib/poolparty/monitors.rb", "lib/poolparty/monitors/cpu.rb", "lib/poolparty/monitors/memory.rb", "lib/poolparty/monitors/web.rb", "lib/poolparty/optioner.rb", "lib/poolparty/plugin.rb", "lib/poolparty/plugin_manager.rb", "lib/poolparty/provider", "lib/poolparty/provider.rb", "lib/poolparty/provider/essential.rb", "lib/poolparty/provider/git.rb", "lib/poolparty/provider/haproxy.rb", "lib/poolparty/provider/heartbeat.rb", "lib/poolparty/provider/rsync.rb", "lib/poolparty/provider/ruby.rb", "lib/poolparty/provider/s3fuse.rb", "lib/poolparty/remote_instance.rb", "lib/poolparty/remoter.rb", "lib/poolparty/remoting.rb", "lib/poolparty/scheduler.rb", "lib/poolparty/tasks", "lib/poolparty/tasks.rb", "lib/poolparty/tasks/cloud.rake", "lib/poolparty/tasks/development.rake", "lib/poolparty/tasks/ec2.rake", "lib/poolparty/tasks/instance.rake", "lib/poolparty/tasks/plugins.rake", "lib/poolparty/tasks/server.rake", "lib/poolparty/thread_pool.rb", "lib/s3", "lib/s3/s3_object_store_folders.rb", "plugins", "spec", "spec/files", "spec/files/describe_response", "spec/files/multi_describe_response", "spec/files/remote_desc_response", "spec/helpers", "spec/helpers/ec2_mock.rb", "spec/lib", "spec/lib/application_spec.rb", "spec/lib/callback_spec.rb", "spec/lib/core_spec.rb", "spec/lib/ec2_wrapper_spec.rb", "spec/lib/file_writer_spec.rb", "spec/lib/kernel_spec.rb", "spec/lib/master_spec.rb", "spec/lib/optioner_spec.rb", "spec/lib/plugin_manager_spec.rb", "spec/lib/plugin_spec.rb", "spec/lib/pool_binary_spec.rb", "spec/lib/poolparty_spec.rb", "spec/lib/provider_spec.rb", "spec/lib/remote_instance_spec.rb", "spec/lib/remoter_spec.rb", "spec/lib/remoting_spec.rb", "spec/lib/scheduler_spec.rb", "spec/lib/string_spec.rb", "spec/monitors", "spec/monitors/cpu_monitor_spec.rb", "spec/monitors/memory_spec.rb", "spec/monitors/misc_monitor_spec.rb", "spec/monitors/web_spec.rb", "spec/spec_helper.rb", "poolparty.gemspec"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{http://poolpartyrb.com}
16
16
  s.post_install_message = %q{
17
17
 
18
- Get ready to jump in the pool, you just installed PoolParty! (Updated at 02:12PM, 07/02/08)
18
+ Get ready to jump in the pool, you just installed PoolParty! (Updated at 05:57PM, 07/19/08)
19
19
 
20
20
  Please check out the documentation for any questions or check out the google groups at
21
21
  http://groups.google.com/group/poolpartyrb
@@ -24,8 +24,8 @@ Gem::Specification.new do |s|
24
24
 
25
25
  For more information, check http://poolpartyrb.com
26
26
  On IRC:
27
- irc.freenode.net
28
- #poolpartyrb
27
+ irc.freenode.net / #poolpartyrb
28
+
29
29
  *** Ari Lerner @ <ari.lerner@citrusbyte.com> ***
30
30
  }
31
31
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Poolparty", "--main", "README.txt"]
@@ -45,6 +45,7 @@ Gem::Specification.new do |s|
45
45
  s.add_runtime_dependency(%q<git>, [">= 0"])
46
46
  s.add_runtime_dependency(%q<crafterm-sprinkle>, [">= 0"])
47
47
  s.add_runtime_dependency(%q<SystemTimer>, [">= 0"])
48
+ s.add_runtime_dependency(%q<open4>, [">= 0"])
48
49
  s.add_development_dependency(%q<echoe>, [">= 0"])
49
50
  else
50
51
  s.add_dependency(%q<aws-s3>, [">= 0"])
@@ -53,6 +54,7 @@ Gem::Specification.new do |s|
53
54
  s.add_dependency(%q<git>, [">= 0"])
54
55
  s.add_dependency(%q<crafterm-sprinkle>, [">= 0"])
55
56
  s.add_dependency(%q<SystemTimer>, [">= 0"])
57
+ s.add_dependency(%q<open4>, [">= 0"])
56
58
  s.add_dependency(%q<echoe>, [">= 0"])
57
59
  end
58
60
  else
@@ -62,6 +64,7 @@ Gem::Specification.new do |s|
62
64
  s.add_dependency(%q<git>, [">= 0"])
63
65
  s.add_dependency(%q<crafterm-sprinkle>, [">= 0"])
64
66
  s.add_dependency(%q<SystemTimer>, [">= 0"])
67
+ s.add_dependency(%q<open4>, [">= 0"])
65
68
  s.add_dependency(%q<echoe>, [">= 0"])
66
69
  end
67
70
  end
@@ -2,9 +2,9 @@ module PoolParty
2
2
  class Master
3
3
  def launch_new_instance!
4
4
  letter = ("a".."z").to_a[instances.size] # For unique instance_ids
5
- h = {:instance_id => "i-58ba56#{letter}", :ip => "ip-127-0-0-1.aws.amazonaws.com", :status => "pending", :launching_time => Time.now }
5
+ h = {:instance_id => "i-58ba56#{letter}", :ip => "ip-127-0-0-1.aws.amazonaws.com", :status => "pending", :keypair => "alist", :launching_time => Time.now }
6
6
  instances << h
7
- Thread.new {wait 0.1;h[:status] = "running"} # Simulate the startup time
7
+ Thread.new {wait 0.01;h[:status] = "running"} # Simulate the startup time
8
8
  return h
9
9
  end
10
10
  # Shutdown the instance by instance_id
@@ -43,5 +43,8 @@ module PoolParty
43
43
  def scp(s,d,o={})
44
44
  "true"
45
45
  end
46
+ def run(s)
47
+ "true"
48
+ end
46
49
  end
47
50
  end
@@ -1,12 +1,16 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe "Application" do
4
4
  before(:each) do
5
5
  stub_option_load
6
6
  Application.reset!
7
7
  end
8
- it "should be able to send options in the Application.options" do
9
- options({:optparse => {:banner => "hi"}})
8
+ describe "command line options" do
9
+ it "should destroy the default options with the commandline options" do
10
+ ARGV << ["-k", "testappkeypair"]
11
+ ARGV.should_receive(:dup).and_return ARGV
12
+ PoolParty.options.keypair.should == "testappkeypair"
13
+ end
10
14
  end
11
15
  it "should have the root_dir defined" do
12
16
  PoolParty.root_dir.should_not be_nil
@@ -29,10 +33,17 @@ describe "Application" do
29
33
  Application.stub!(:environment).and_return("production")
30
34
  Application.production?.should == true
31
35
  end
32
- it "should be able to say it's keypair path is in the $HOME/ directory" do
33
- Application.stub!(:ec2_dir).and_return("~/.ec2")
34
- Application.stub!(:keypair).and_return("poolparty")
35
- Application.keypair_path.should == "~/.ec2/id_rsa-poolparty"
36
+ describe "keypair" do
37
+ before(:each) do
38
+ Application.stub!(:ec2_dir).and_return("~/.ec2")
39
+ Application.stub!(:keypair).and_return("poolparty")
40
+ end
41
+ it "should be able to say it's keypair path is in the $HOME/ directory" do
42
+ Application.keypair_path.should == "~/.ec2/id_rsa-poolparty"
43
+ end
44
+ it "should be able to say the keypair is of the structure id_rsa-keyname" do
45
+ Application.keypair_name.should == "id_rsa-poolparty"
46
+ end
36
47
  end
37
48
  it "should be able to show the version of the gem" do
38
49
  Application.version.should_not be_nil
@@ -46,8 +57,16 @@ describe "Application" do
46
57
  Application.options = nil
47
58
  Application.stub!(:open).with("http://169.254.169.254/latest/user-data").and_return(@str)
48
59
  @str.stub!(:read).and_return ":access_key: 3.14159\n:secret_access_key: pi"
49
- Application.default_options.stub!(:merge!).with({})
50
- Application.default_options.stub!(:merge!).with({:access_key => 3.14159, :secret_access_key => "pi"})
60
+ # Application.default_options.stub!(:merge!).with({})
61
+ # Application.default_options.stub!(:merge!).with({:access_key => 3.14159, :secret_access_key => "pi"})
62
+ end
63
+ describe "added data keypair_path" do
64
+ before(:each) do
65
+ @str.stub!(:read).and_return ":access_key: 3.14159\n:secret_access_key: pi\n:keypair_path: hopscotch"
66
+ end
67
+ it "should use the options keypair_path if it exists" do
68
+ Application.keypair_path.should == "hopscotch"
69
+ end
51
70
  end
52
71
  it "should try to load the user data into a yaml hash" do
53
72
  YAML.should_receive(:load).with(":access_key: 3.14159\n:secret_access_key: pi")
@@ -73,6 +92,20 @@ describe "Application" do
73
92
  YAML.should_receive(:load).at_least(1).and_return({:config_file => "config/sample-config.yml"})
74
93
  Application.make_options(:config_file => "config/sample-config.yml")
75
94
  end
95
+ describe "config file" do
96
+ before(:each) do
97
+ @str = ":access_key: 3.14159\n:secret_access_key: pi"
98
+ Application.options = nil
99
+ @str.stub!(:read).and_return ":access_key: 3.14159\n:secret_access_key: pi"
100
+ Application.make_options
101
+ end
102
+ it "should read the config file and use the options in the config file if it exists" do
103
+ Application.access_key.should == 3.14159
104
+ end
105
+ it "should set the secret_access_key if the config file exists" do
106
+ Application.secret_access_key.should == "pi"
107
+ end
108
+ end
76
109
  it "should not read the config file if it is not passed and doesn't exist" do
77
110
  File.stub!(:file?).and_return false
78
111
  YAML.should_not_receive(:load).with("config/config.yml")
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  class TestCallbacks
4
4
  include Callbacks
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe "Hash" do
4
4
  it "should preserve the contents of the original hash when safe_merge'ing" do
@@ -14,11 +14,13 @@ describe "Hash" do
14
14
  end
15
15
  end
16
16
  describe "String" do
17
- it "should be able to convert a big string with \n to a runnable string" do
18
- str =<<-EOS
17
+ before(:each) do
18
+ @str =<<-EOS
19
19
  echo 'hi'
20
20
  puts 'hi'
21
21
  EOS
22
- str.runnable.should == "echo 'hi' && puts 'hi'"
22
+ end
23
+ it "should be able to convert a big string with \n to a runnable string" do
24
+ @str.runnable.should == "echo 'hi' && puts 'hi'"
23
25
  end
24
26
  end
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
- require File.dirname(__FILE__) + "/helpers/ec2_mock"
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + "/../helpers/ec2_mock"
3
3
 
4
4
  class EC2Test
5
5
  include Ec2Wrapper
@@ -14,7 +14,7 @@ class EC2Test
14
14
  @resp3 = EC2::Response.parse(:xml => read_file("remote_desc_response"))
15
15
  end
16
16
  def read_file(name)
17
- open("#{File.dirname(__FILE__)}/files/#{name}").read
17
+ open("#{File.dirname(__FILE__)}/../files/#{name}").read
18
18
  end
19
19
  end
20
20
  describe "EC2ResponseObject" do