auser-poolparty 0.2.81 → 0.2.84

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.
Files changed (49) hide show
  1. data/Capfile +1 -0
  2. data/Manifest.txt +13 -6
  3. data/PostInstall.txt +1 -1
  4. data/bin/cloud-configure +2 -1
  5. data/bin/cloud-handle-load +3 -3
  6. data/bin/cloud-maintain +2 -2
  7. data/bin/cloud-provision +4 -4
  8. data/bin/cloud-setup-dev +25 -0
  9. data/bin/cloud-start +1 -0
  10. data/bin/server-start-client +1 -1
  11. data/bin/server-start-master +1 -1
  12. data/bin/server-start-node +1 -1
  13. data/bin/server-write-new-nodes +26 -0
  14. data/lib/poolparty/capistrano.rb +18 -0
  15. data/lib/poolparty/exceptions/ProvisionerException.rb +5 -0
  16. data/lib/poolparty/helpers/optioner.rb +2 -1
  17. data/lib/poolparty/modules/cloud_resourcer.rb +17 -0
  18. data/lib/poolparty/modules/file_writer.rb +2 -2
  19. data/lib/poolparty/net/messenger.rb +1 -1
  20. data/lib/poolparty/net/remote_bases/ec2.rb +3 -2
  21. data/lib/poolparty/net/remoter.rb +12 -8
  22. data/lib/poolparty/plugins/git.rb +5 -1
  23. data/lib/poolparty/poolparty/cloud.rb +3 -1
  24. data/lib/poolparty/provisioners/capistrano/capistrano.rb +129 -0
  25. data/lib/poolparty/provisioners/capistrano/capistrano_configurer.rb +58 -0
  26. data/lib/poolparty/provisioners/capistrano/recipies/base.rb +100 -0
  27. data/lib/poolparty/provisioners/capistrano/recipies/master.rb +120 -0
  28. data/lib/poolparty/provisioners/capistrano/recipies/slave.rb +12 -0
  29. data/lib/poolparty/provisioners/provisioner_base.rb +98 -274
  30. data/lib/poolparty/templates/gem +12 -10
  31. data/lib/poolparty/version.rb +1 -1
  32. data/lib/poolparty.rb +5 -3
  33. data/poolparty.gemspec +18 -9
  34. data/spec/poolparty/helpers/optioner_spec.rb +1 -1
  35. data/spec/poolparty/net/remote_spec.rb +13 -14
  36. data/spec/poolparty/net/remoter_spec.rb +11 -11
  37. data/spec/poolparty/plugins/git_spec.rb +1 -1
  38. data/spec/poolparty/poolparty_spec.rb +1 -1
  39. data/spec/poolparty/provisioners/capistrano/capistrano_spec.rb +27 -0
  40. data/spec/poolparty/provisioners/provisioner_base_spec.rb +120 -0
  41. data/spec/poolparty/spec_helper.rb +15 -1
  42. data/website/index.html +1 -1
  43. metadata +18 -9
  44. data/lib/poolparty/provisioners/provisioners/become_master.rb +0 -166
  45. data/lib/poolparty/provisioners/provisioners/master.rb +0 -196
  46. data/lib/poolparty/provisioners/provisioners/slave.rb +0 -65
  47. data/spec/poolparty/helpers/provisioner_base_spec.rb +0 -137
  48. data/spec/poolparty/helpers/provisioners/master_spec.rb +0 -53
  49. data/spec/poolparty/helpers/provisioners/slave_spec.rb +0 -27
data/Capfile ADDED
@@ -0,0 +1 @@
1
+ Dir["#{::File.dirname(__FILE__)}/lib/poolparty/provisioners/capistrano/tasks/*.rb"].each { |plugin| load(plugin) }
data/Manifest.txt CHANGED
@@ -1,3 +1,4 @@
1
+ Capfile
1
2
  History.txt
2
3
  License.txt
3
4
  Manifest.txt
@@ -18,6 +19,7 @@ bin/cloud-provision
18
19
  bin/cloud-refresh
19
20
  bin/cloud-rsync
20
21
  bin/cloud-run
22
+ bin/cloud-setup-dev
21
23
  bin/cloud-spec
22
24
  bin/cloud-ssh
23
25
  bin/cloud-start
@@ -47,6 +49,7 @@ bin/server-stop-client
47
49
  bin/server-stop-master
48
50
  bin/server-stop-node
49
51
  bin/server-update-hosts
52
+ bin/server-write-new-nodes
50
53
  config/hoe.rb
51
54
  config/requirements.rb
52
55
  examples/basic.rb
@@ -173,6 +176,7 @@ lib/poolparty/base_packages/heartbeat.rb
173
176
  lib/poolparty/base_packages/poolparty.rb
174
177
  lib/poolparty/base_packages/ruby.rb
175
178
  lib/poolparty/base_packages/runit.rb
179
+ lib/poolparty/capistrano.rb
176
180
  lib/poolparty/config/postlaunchmessage.txt
177
181
  lib/poolparty/core/array.rb
178
182
  lib/poolparty/core/class.rb
@@ -193,6 +197,7 @@ lib/poolparty/dependency_resolutions/puppet.rb
193
197
  lib/poolparty/exceptions/CloudNotFoundException.rb
194
198
  lib/poolparty/exceptions/LoadRulesException.rb
195
199
  lib/poolparty/exceptions/MasterException.rb
200
+ lib/poolparty/exceptions/ProvisionerException.rb
196
201
  lib/poolparty/exceptions/RemoteException.rb
197
202
  lib/poolparty/exceptions/ResourceException.rb
198
203
  lib/poolparty/exceptions/RuntimeException.rb
@@ -261,10 +266,12 @@ lib/poolparty/poolparty/resources/sshkey.rb
261
266
  lib/poolparty/poolparty/resources/symlink.rb
262
267
  lib/poolparty/poolparty/resources/variable.rb
263
268
  lib/poolparty/poolparty/script.rb
269
+ lib/poolparty/provisioners/capistrano/capistrano.rb
270
+ lib/poolparty/provisioners/capistrano/capistrano_configurer.rb
271
+ lib/poolparty/provisioners/capistrano/recipies/base.rb
272
+ lib/poolparty/provisioners/capistrano/recipies/master.rb
273
+ lib/poolparty/provisioners/capistrano/recipies/slave.rb
264
274
  lib/poolparty/provisioners/provisioner_base.rb
265
- lib/poolparty/provisioners/provisioners/become_master.rb
266
- lib/poolparty/provisioners/provisioners/master.rb
267
- lib/poolparty/provisioners/provisioners/slave.rb
268
275
  lib/poolparty/spec/core/string.rb
269
276
  lib/poolparty/spec/matchers/a_spec_extensions_base.rb
270
277
  lib/poolparty/spec/matchers/have_cron.rb
@@ -332,9 +339,6 @@ spec/poolparty/extra/deployments_spec.rb
332
339
  spec/poolparty/helpers/binary_spec.rb
333
340
  spec/poolparty/helpers/display_spec.rb
334
341
  spec/poolparty/helpers/optioner_spec.rb
335
- spec/poolparty/helpers/provisioner_base_spec.rb
336
- spec/poolparty/helpers/provisioners/master_spec.rb
337
- spec/poolparty/helpers/provisioners/slave_spec.rb
338
342
  spec/poolparty/modules/cloud_resourcer_spec.rb
339
343
  spec/poolparty/modules/configurable_spec.rb
340
344
  spec/poolparty/modules/definable_resource.rb
@@ -343,6 +347,7 @@ spec/poolparty/modules/s3_string_spec.rb
343
347
  spec/poolparty/monitors/base_monitor_spec.rb
344
348
  spec/poolparty/monitors/monitors/cpu_monitor_spec.rb
345
349
  spec/poolparty/monitors/monitors/memory_monitor_spec.rb
350
+ spec/poolparty/net/log/pool.log
346
351
  spec/poolparty/net/messenger_spec.rb
347
352
  spec/poolparty/net/remote_bases/ec2_spec.rb
348
353
  spec/poolparty/net/remote_instance_spec.rb
@@ -384,6 +389,8 @@ spec/poolparty/poolparty/test_plugins/sshkey_test
384
389
  spec/poolparty/poolparty/test_plugins/virtual_host_template.erb
385
390
  spec/poolparty/poolparty/test_plugins/webserver.rb
386
391
  spec/poolparty/poolparty_spec.rb
392
+ spec/poolparty/provisioners/capistrano/capistrano_spec.rb
393
+ spec/poolparty/provisioners/provisioner_base_spec.rb
387
394
  spec/poolparty/spec/core/string_spec.rb
388
395
  spec/poolparty/spec_helper.rb
389
396
  tasks/cloud.rake
data/PostInstall.txt CHANGED
@@ -1,4 +1,4 @@
1
- Get ready to jump in the pool, you just installed PoolParty! (Updated at 13:44 12/10/08)
1
+ Get ready to jump in the pool, you just installed PoolParty! (Updated at 19:18 12/13/08)
2
2
 
3
3
  To get started, run the generator:
4
4
 
data/bin/cloud-configure CHANGED
@@ -15,7 +15,8 @@ o.loaded_clouds.each do |cloud|
15
15
  # hide_output do
16
16
  # if provision_class == "master" || provision_class == "all"
17
17
  @cl = self
18
- daemon ? daemonize {Provisioner.configure_master(@cl, testing)} : Provisioner.configure_master(self, testing)
18
+ # daemon ? daemonize {Provisioner.configure_master(@cl, testing)} : Provisioner.configure_master(self, testing)
19
+ verbose ? provisioner_for(master).configure(testing) : hide_output { provisioner_for(master).configure(testing) }
19
20
  # end
20
21
  # if provision_class == "slave" || provision_class == "all"
21
22
  # Provisioner.configure_slaves(self, testing)
@@ -14,12 +14,12 @@ o.loaded_clouds.each do |cloud|
14
14
  vputs "should_expand_cloud: #{should_contract_cloud?}"
15
15
  if should_expand_cloud?
16
16
  vputs "Expanding cloud based on load"
17
- logger.debug "Expanding cloud based on load"
18
- logger.debug rules_values
17
+ log.debug "Expanding cloud based on load"
18
+ log.debug rules_values
19
19
  expand_cloud_if_necessary
20
20
  elsif should_contract_cloud?
21
21
  vputs "Contracting cloud based on load"
22
- logger.debug rules_values
22
+ log.debug rules_values
23
23
  contract_cloud_if_necessary
24
24
  end
25
25
  end
data/bin/cloud-maintain CHANGED
@@ -13,8 +13,8 @@ o.loaded_clouds.each do |cloud|
13
13
 
14
14
  with_cloud(cloud) do
15
15
  vputs header("Maintaining cloud #{name}")
16
- logger.warn "Maintaining cloud"
17
- logger.warn rules_values
16
+ log.warn "Maintaining cloud"
17
+ log.warn rules_values
18
18
  if !minimum_number_of_instances_are_running?
19
19
  vputs "#{list_of_running_instances.size} running instances of between #{minimum_instances} and #{maximum_instances}"
20
20
  vputs "Launching new instance"
data/bin/cloud-provision CHANGED
@@ -12,20 +12,20 @@ end
12
12
  o.loaded_clouds.each do |cloud|
13
13
 
14
14
  with_cloud(cloud) do
15
-
15
+ setup_dev
16
16
  instance_num = instance_number.to_i if instance_number
17
17
 
18
18
  if instance_num
19
19
  @instance = get_instance_by_number( instance_num )
20
- instance_num == 0 ? Provisioner.provision_master(self, testing) : Provisioner.provision_slave(@instance, self, testing)
20
+ instance_num == 0 ? provisioner_for(master).install(testing) : provisioner_for(@instance).install(testing)
21
21
  # Provisioner.process_clean_reconfigure_for!(@instance, self, testing)
22
22
  else
23
23
  if provision_slave
24
24
  vputs "Provisioning slaves"
25
- Provisioner.provision_slaves(self, testing)
25
+ verbose ? provisioner_for(nil).install(testing) : hide_output { provisioner_for(nil).install(testing) }
26
26
  else
27
27
  vputs "Provisioning master"
28
- (verbose || testing) ? Provisioner.provision_master(self, testing) : hide_output { Provisioner.provision_master(self, testing) }
28
+ verbose ? provisioner_for(master).install(testing) : hide_output { provisioner_for(master).install(testing) }
29
29
  end
30
30
  end
31
31
 
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+ require "poolparty"
4
+ require "poolpartycl"
5
+
6
+ o = PoolParty::Optioner.new(ARGV) do |opts, optioner|
7
+ opts.on('-n name', '--name name', 'Setup development environment for cloud named') { |c| optioner.cloudname c }
8
+ end
9
+
10
+ o.loaded_clouds.each do |cloud|
11
+ with_cloud(cloud) do
12
+
13
+ setup_dev
14
+
15
+ str =<<-EOE
16
+ Host #{name}-master
17
+ User #{user}
18
+ Hostname #{master.ip}
19
+ IdentityFile #{full_keypair_path}
20
+ EOE
21
+
22
+ puts "Enter the following in your .ssh/config file"
23
+ puts str
24
+ end
25
+ end
data/bin/cloud-start CHANGED
@@ -10,6 +10,7 @@ end
10
10
 
11
11
  o.loaded_clouds.each do |cloud|
12
12
  with_cloud(cloud) do
13
+ setup_dev
13
14
  vputs header("Starting cloud #{name}")
14
15
  vputs "#{list_of_running_instances.size} running instances (#{minimum_instances} - #{maximum_instances})"
15
16
  # if list_of_running_instances.size <= 1
@@ -18,7 +18,7 @@ o.loaded_clouds.each do |cloud|
18
18
  boot_file = "#{Messenger.append_dir}/pm_client_rel-0.1"
19
19
 
20
20
  Kernel.system "cd #{Messenger.append_dir} && rake build_boot_scripts" unless ::File.file?("#{boot_file}.boot") || testing
21
- command = Messenger.erl_command("client", "-boot #{boot_file} #{noshell ? "" : "-detached -heart -noshell"}", 7049, 7050)
21
+ command = Messenger.erl_command("client", "-setcookie #{generate_unique_cookie_string} -boot #{boot_file} #{noshell ? "" : "-detached -heart -noshell"}", 7049, 7050)
22
22
  vputs "Running #{command}"
23
23
 
24
24
  Kernel.system "export HOME=/root && #{command}" unless testing
@@ -16,7 +16,7 @@ o.loaded_clouds.each do |cloud|
16
16
 
17
17
  boot_file = "#{Messenger.append_dir}/pm_master_rel-0.1"
18
18
  Kernel.system ". /etc/profile && server-build-messenger" unless ::File.file?("#{boot_file}.boot") || testing
19
- command = Messenger.erl_command("master", "-boot #{boot_file} #{noshell ? "" : "-noshell -detached -heart"}")
19
+ command = Messenger.erl_command("master", "-setcookie #{generate_unique_cookie_string} -boot #{boot_file} #{noshell ? "" : "-noshell -detached -heart"}")
20
20
  vputs "Running #{command}"
21
21
 
22
22
  Kernel.system "export HOME=/root && #{command}" unless testing
@@ -22,7 +22,7 @@ o.loaded_clouds.each do |cloud|
22
22
  boot_file = "#{Messenger.append_dir}/pm_node_rel-0.1"
23
23
 
24
24
  Kernel.system ". /etc/profile && server-build-messenger" unless ::File.file?("#{boot_file}.boot") || testing
25
- command = Messenger.erl_command(hostname, "-boot #{boot_file} #{noshell ? "" : "-noshell -detached -heart"} -- #{available_monitors.join(" ")}")
25
+ command = Messenger.erl_command(hostname, "-setcookie #{generate_unique_cookie_string} -boot #{boot_file} #{noshell ? "" : "-noshell -detached -heart"} -- #{available_monitors.join(" ")}")
26
26
  vputs "Running #{command}"
27
27
 
28
28
  Kernel.system "export HOME=/root && #{command}" unless testing
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+ require "rubygems"
4
+ require "poolparty"
5
+ require "poolpartycl"
6
+
7
+ o = PoolParty::Optioner.new(ARGV) do |opts, optioner|
8
+ opts.on('-n name', '--name name', 'Update hosts for local pool named [name]') { |p| optioner.cloudname p }
9
+ end
10
+
11
+ o.loaded_clouds.each do |cloud|
12
+ with_cloud(cloud) do
13
+
14
+ new_nodes_file = "#{Base.manifest_path}/nodes/nodes.pp"
15
+
16
+ str = returning Array.new do |arr|
17
+ arr << "node default { include poolparty }"
18
+ list_of_running_instances.each do |ri|
19
+ arr << "node \"#{ri.name}\" inherits default {}"
20
+ end
21
+ end.join("\n")
22
+
23
+ testing ? puts(str) : ::File.open(new_nodes_file, "w+") {|f| f << str }
24
+
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ module PoolParty
2
+ module Capistrano
3
+
4
+ def set_cloud(cld=nil)
5
+ raise unless cld
6
+ @cloud = cld
7
+ end
8
+
9
+ def set_poolparty_roles
10
+ returning Array.new do |arr|
11
+ arr << "role 'master.#{@cloud.name}'.to_sym, '#{@cloud.master.ip}'"
12
+ arr << "role :master, '#{@cloud.master.ip}'"
13
+ arr << "role :slaves, '#{@cloud.nonmaster_nonterminated_instances.map{|a| a.ip}.join('", "')}'" if @cloud.nonmaster_nonterminated_instances.size > 0
14
+ end.join("\n")
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ class ProvisionerException < Exception
2
+ def initialize(msg="Provisioner process failed")
3
+ @message = "Error: #{msg}"
4
+ end
5
+ end
@@ -37,7 +37,7 @@ module PoolParty
37
37
  @flagged_args ||= []
38
38
  end
39
39
  def boolean_args
40
- @boolean_args ||= ['-V', '-h', '-t', '-v']
40
+ @boolean_args ||= ['-V', '-h', '-t', '-v', '--debug']
41
41
  end
42
42
 
43
43
  # Break ARGV into 2 arrays, one for flagged options one for unflagged
@@ -83,6 +83,7 @@ module PoolParty
83
83
  @opts.separator "Options:"
84
84
 
85
85
  @opts.on('-v', '--verbose', 'Be verbose') { self.verbose true }
86
+ @opts.on("--debug", "Debug setting") {self.debug true}
86
87
  @opts.on('-s [file]', '--spec-file [file]', 'Set the spec file') { |file| self.spec file.chomp }
87
88
  @opts.on('-t', '--test', 'Testing mode') { self.testing true }
88
89
 
@@ -36,6 +36,15 @@ module PoolParty
36
36
  raise SpecException.new("Don't know how to handle instances cloud input #{arg}")
37
37
  end
38
38
  end
39
+
40
+ def setup_dev
41
+ unless ::File.exists?("#{full_keypair_basename_path}.pub")
42
+ cmd = "scp #{ssh_array.join(" ")} #{Base.user}@#{master.ip}:.ssh/authorized_keys #{full_keypair_basename_path}.pub"
43
+ vputs "Running #{cmd}"
44
+ Kernel.system(cmd)
45
+ end
46
+ end
47
+
39
48
  def full_keypair_path
40
49
  unless keypair_path
41
50
  raise RuntimeException.new("Keypair cannot be found")
@@ -43,6 +52,14 @@ module PoolParty
43
52
  ::File.expand_path(keypair_path)
44
53
  end
45
54
  end
55
+ def full_pub_keypair_path
56
+ @full_pub_keypair_path ||= ::File.expand_path("#{full_keypair_basename_path}.pub")
57
+ end
58
+ def full_keypair_basename_path
59
+ dir = ::File.dirname(full_keypair_path)
60
+ basename = ::File.basename(full_keypair_path, ::File.extname(full_keypair_path))
61
+ ::File.join(dir, basename)
62
+ end
46
63
 
47
64
  def keypair_path
48
65
  keypair_paths.each do |path|
@@ -2,8 +2,8 @@ module PoolParty
2
2
  module FileWriter
3
3
  def copy_file_to_storage_directory(file, preceded="")
4
4
  make_base_directory
5
- path = ::File.join( Base.storage_directory, preceded, ::File.basename(file) )
6
- FileUtils.cp file, path unless file == path || ::File.exists?(path)
5
+ path = ::File.join( Base.storage_directory, preceded, ::File.basename(file) )
6
+ ::FileUtils.cp file, path unless file == path || ::File.file?(path)
7
7
  end
8
8
  def cleanup_storage_directory
9
9
  Dir["#{Base.storage_directory}/**/*"].each do |f|
@@ -16,7 +16,7 @@ module PoolParty
16
16
  end
17
17
  # TODO: Fix cookie setting
18
18
  def self.erl_command(hostname, extra="", min_ports=7000, max_ports=7050)
19
- command_line_opts = "-pa #{append_dir}/ebin -kernel inet_dist_listen_min #{min_ports} inet_dist_listen_max #{max_ports} -sname #{hostname} -cookie"
19
+ command_line_opts = "-pa #{append_dir}/ebin -kernel inet_dist_listen_min #{min_ports} inet_dist_listen_max #{max_ports} -sname #{hostname}"
20
20
 
21
21
  "erl #{command_line_opts} #{extra}"
22
22
  end
@@ -139,7 +139,8 @@ begin
139
139
  [:ami, :availabilty_zone, :security_group]
140
140
  end
141
141
 
142
- # Callback
142
+ # Hook
143
+ #TODO#: Change this so they match with the cap tasks
143
144
  def custom_install_tasks_for(o)
144
145
  arr = if has_cert_and_key?
145
146
  [
@@ -159,11 +160,11 @@ begin
159
160
  "cd /var/poolparty && wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-ec2.gem 2>&1",
160
161
  "/usr/bin/gem install -y --no-ri --no-rdoc amazon-ec2.gem 2>&1",
161
162
  ]
163
+ []
162
164
  end
163
165
 
164
166
  def custom_configure_tasks_for(o)
165
167
  [
166
- "# ec2 configuration"
167
168
  ]
168
169
  end
169
170
 
@@ -28,11 +28,12 @@ module PoolParty
28
28
  # Includes StrictHostKeyChecking to no
29
29
  # Ssh with the user in Base
30
30
  # And including the keypair_path
31
+ # "-l '#{Base.user}'",
31
32
  def ssh_array
32
- ["-o StrictHostKeyChecking=no", "-l '#{Base.user}'", '-i "'+full_keypair_path+'"']
33
+ ["-o StrictHostKeyChecking=no", "-l #{Base.user}", '-i "'+full_keypair_path+'"']
33
34
  end
34
35
  def rsync_command
35
- "rsync -azP --exclude cache -e '#{ssh_string}'"
36
+ "rsync -azP --exclude cache -e '#{ssh_string} -l #{Base.user}'"
36
37
  end
37
38
  def remote_ssh_array
38
39
  ["-o StrictHostKeyChecking=no", "-l '#{Base.user}'", '-i "'+remote_keypair_path+'"']
@@ -188,12 +189,13 @@ module PoolParty
188
189
  last_instances.each do |inst|
189
190
  vputs "Provision slave: #{inst}"
190
191
  # hide_output {PoolParty::Provisioner.process_clean_reconfigure_for!(inst, self)}
191
- PoolParty::Provisioner.provision_slave(inst, self, false) unless inst.master? rescue vputs "Error"
192
+ # PoolParty::Provisioner.provision_slave(inst, self, false) unless inst.master? rescue vputs "Error"
193
+ verbose ? provisioner_for(inst).install(testing) : hide_output { provisioner_for(inst).install(testing) }
192
194
  # hide_output {PoolParty::Provisioner.process_clean_reconfigure_for!(inst, self)}
193
195
  # cmd = ". /etc/profile && cloud-provision -i #{inst.name.gsub(/node/, '')} &"
194
196
  # vputs "Provision slave with command #{cmd}"
195
197
  end
196
- PoolParty::Provisioner.reconfigure_master(self)
198
+ # PoolParty::Provisioner.reconfigure_master(self)
197
199
  end
198
200
  end
199
201
  # Launch the master and let the master handle the starting of the cloud
@@ -203,7 +205,7 @@ module PoolParty
203
205
  # Then wait for the master to launch
204
206
  def launch_and_configure_master!(testing=false)
205
207
  vputs "Requesting to launch new instance"
206
- logger.debug "Launching master"
208
+ log.debug "Launching master"
207
209
  request_launch_master_instance if list_of_pending_instances.size.zero? && can_start_a_new_instance? && !is_master_running? && !testing
208
210
  reset!
209
211
  unless testing
@@ -214,8 +216,8 @@ module PoolParty
214
216
  vputs ""
215
217
  vputs "Provisioning master..."
216
218
  # cleanup_storage_directory
217
- verbose ? Provisioner.provision_master(self, testing) : hide_output { Provisioner.provision_master(self, testing) }
218
- verbose ? Provisioner.clear_master_ssl_certs(self, testing) : hide_output { Provisioner.clear_master_ssl_certs(self, testing) }
219
+ @provisioner = PoolParty::Provisioner::Capistrano.new(master, self, :ubuntu)
220
+ verbose ? @provisioner.install(testing) : hide_output { @provisioner.install(testing) }
219
221
 
220
222
  after_launched
221
223
  end
@@ -306,7 +308,9 @@ module PoolParty
306
308
 
307
309
  # Ssh into the instance given
308
310
  def ssh_into(instance=nil)
309
- Kernel.system "#{ssh_command(instance)}" if instance
311
+ cmd = "#{ssh_command(instance)}"
312
+ vputs "Running #{cmd}"
313
+ Kernel.system cmd if instance
310
314
  end
311
315
  # Find the instance by the number given
312
316
  # and then ssh into the instance
@@ -10,7 +10,7 @@ module PoolParty
10
10
  def has_git_repos
11
11
  has_package(:name => "git-core")
12
12
  has_exec({:name => key, :requires => [get_directory("#{working_dir}"), get_package("git-core")] }) do
13
- command user ? "git clone #{user}@#{source} #{path}" : "git clone #{source} #{to ? to : ""}"
13
+ command requires_user ? "git clone #{requires_user}@#{source} #{working_dir}" : "cd #{working_dir} && git clone #{source}"
14
14
  cwd "#{working_dir if working_dir}"
15
15
  creates creates_dir
16
16
  end
@@ -25,6 +25,10 @@ module PoolParty
25
25
  has_directory(:name => "#{dir}", :requires => get_directory("#{::File.dirname(dir)}"))
26
26
  end
27
27
 
28
+ def to(dir)
29
+ at(dir)
30
+ end
31
+
28
32
  def creates_dir
29
33
  "#{::File.join( working_dir, ::File.basename(source, ::File.extname(source)) )}/.git"
30
34
  end
@@ -24,6 +24,7 @@ module PoolParty
24
24
  include PrettyPrinter
25
25
  include Configurable
26
26
  include CloudResourcer
27
+ include Provisioner
27
28
  # extend CloudResourcer
28
29
  # Net methods
29
30
  include Remote
@@ -39,6 +40,7 @@ module PoolParty
39
40
  :ec2_dir => ENV["EC2_HOME"],
40
41
  :keypair => (ENV["KEYPAIR_NAME"].nil? || ENV["KEYPAIR_NAME"].empty?) ? nil : ENV["KEYPAIR_NAME"],
41
42
  :minimum_runtime => Base.minimum_runtime,
43
+ :user => Base.user,
42
44
  :ami => 'ami-44bd592d'
43
45
  })
44
46
 
@@ -145,7 +147,7 @@ module PoolParty
145
147
  end
146
148
 
147
149
  def copy_misc_templates
148
- ["namespaceauth.conf", "puppet.conf"].each do |f|
150
+ ["namespaceauth.conf", "puppet.conf", "gem"].each do |f|
149
151
  copy_file_to_storage_directory(::File.join(::File.dirname(__FILE__), "..", "templates", f))
150
152
  end
151
153
  end
@@ -0,0 +1,129 @@
1
+ require "poolparty/capistrano"
2
+
3
+ module PoolParty
4
+ module Provisioner
5
+ class Capistrano < ProvisionerBase
6
+
7
+ include PoolParty::Capistrano
8
+ include ::Capistrano::Configuration::Actions::Invocation
9
+
10
+ def process_install!(testing=false)
11
+ unless testing
12
+ @cloud.rsync_storage_files_to(@instance)
13
+ roles = provision_master? ? [:master] : [:slaves]
14
+ run_capistrano(roles,:install)
15
+ end
16
+ end
17
+ def process_configure!(testing=false)
18
+ unless testing
19
+ @cloud.rsync_storage_files_to(@instance)
20
+ roles = provision_master? ? [:master] : [:slaves]
21
+ run_capistrano(roles, :configure)
22
+ end
23
+ end
24
+
25
+ def install_tasks
26
+ provision_master? ? master_install_tasks : slave_install_tasks
27
+ end
28
+ def configure_tasks
29
+ provision_master? ? master_configure_tasks : slave_configure_tasks
30
+ end
31
+
32
+ def master_install_tasks
33
+ [
34
+ "master:provision_master"
35
+ ].push([custom_install_tasks, master_configure_tasks]).flatten#.map {|a| a.to_sym }
36
+ end
37
+ def master_configure_tasks
38
+ [
39
+ "master:create_local_node_entry_for_puppet", "master:move_template_files", "master:setup_poolparty_base_structure",
40
+ "master:move_provisioner_manifest", "run_provisioner"
41
+ ].push(custom_configure_tasks).flatten#.map {|a| a.to_sym }
42
+ end
43
+
44
+ def slave_install_tasks
45
+ [
46
+ "slave:add_master_to_hosts_file", "slave:add_provisioner_configs", "setup_provisioner_config",
47
+ "create_puppetrunner_command", "create_puppetrerun_command", "install_rubygems",
48
+ "install_provisioner", "slave:stop_provisioner_daemon"
49
+ ].push([custom_install_tasks, slave_configure_tasks]).flatten#.map {|a| a.to_sym }
50
+ end
51
+ def slave_configure_tasks
52
+ [
53
+ "run_provisioner"
54
+ ].push(custom_configure_tasks).flatten#.map {|a| a.to_sym }
55
+ end
56
+ # Run tasks after the initialized
57
+ def loaded
58
+ create_config
59
+ end
60
+
61
+ # Create the config for capistrano
62
+ # This is a dynamic capistrano configuration file
63
+ def create_config
64
+ @config = ::Capistrano::Configuration.new
65
+ if @cloud.debug || @cloud.verbose
66
+ @config.logger.level = @cloud.debug ? ::Capistrano::Logger::MAX_LEVEL : ::Capistrano::Logger::INFO
67
+ else
68
+ @config.logger.level = ::Capistrano::Logger::IMPORTANT
69
+ end
70
+
71
+ capfile = returning Array.new do |arr|
72
+ Dir["#{::File.dirname(__FILE__)}/recipies/*.rb"].each {|a| arr << "require '#{a}'" }
73
+ arr << "ssh_options[:keys] = '#{@cloud.full_keypair_basename_path}'"
74
+
75
+ arr << set_poolparty_roles
76
+ end.join("\n")
77
+
78
+ @config.provisioner = self
79
+ @config.cloud = @cloud
80
+
81
+ @config.load(:string => capfile)
82
+
83
+ @cloud.deploy_file ? @config.load(@cloud.deploy_file) : @config.set(:user, @cloud.user)
84
+ end
85
+
86
+ # Prerun
87
+ def prerun_setup
88
+ end
89
+
90
+ def run_capistrano(roles=[:master], meth=:install)
91
+ prerun_setup
92
+
93
+ commands = meth == :install ? install_tasks : configure_tasks
94
+ name = "provisioner_#{meth}"
95
+
96
+ __define_task(name, roles) do
97
+ commands.map {|command|
98
+ task = find_task(command)
99
+ task.options.merge!(:roles => roles)
100
+ execute_task task
101
+ }
102
+ end
103
+
104
+ # @config.task_list(:all).each {|t| puts "t: #{t.fully_qualified_name}"}
105
+
106
+ begin
107
+ __run(name)
108
+ return true
109
+ rescue ::Capistrano::CommandError => e
110
+ return false unless verbose
111
+ raise ProvisionerException.new("Error: #{e}")
112
+ end
113
+ end
114
+
115
+ def __define_task(name, roles, &block)
116
+ @config.task __task_sym(name), :roles => roles, &block
117
+ end
118
+
119
+ def __run(task)
120
+ @config.send __task_sym(task)
121
+ end
122
+
123
+ def __task_sym(name)
124
+ "#{name.to_s.downcase.underscore}".to_sym
125
+ end
126
+
127
+ end
128
+ end
129
+ end