auser-poolparty 0.2.53 → 0.2.54

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 (47) hide show
  1. data/Manifest.txt +15 -1
  2. data/README.txt +20 -4
  3. data/bin/cloud-ensure-provisioning +13 -7
  4. data/bin/cloud-handle-load +1 -0
  5. data/bin/cloud-start +1 -1
  6. data/bin/messenger-get-current-nodes +13 -0
  7. data/bin/server-show-stats +1 -1
  8. data/bin/server-start-client +15 -8
  9. data/bin/server-start-master +11 -7
  10. data/bin/server-start-node +12 -10
  11. data/bin/server-stop-client +3 -0
  12. data/bin/server-stop-master +3 -0
  13. data/bin/server-stop-node +3 -0
  14. data/lib/erlang/messenger/include/defines.hrl +1 -0
  15. data/lib/erlang/messenger/pm_client_rel-0.1.script +1 -1
  16. data/lib/erlang/messenger/pm_master_rel-0.1.script +1 -1
  17. data/lib/erlang/messenger/pm_node_rel-0.1.script +1 -1
  18. data/lib/erlang/messenger/src/client_server.erl +22 -8
  19. data/lib/erlang/messenger/src/pm_master.erl +7 -9
  20. data/lib/erlang/messenger/src/pm_node.erl +0 -1
  21. data/lib/erlang/messenger/src/pm_strings.erl +11 -0
  22. data/lib/erlang/messenger/src/utils.erl +12 -4
  23. data/lib/erlang/messenger/useful_snippets +1 -1
  24. data/lib/poolparty.rb +10 -2
  25. data/lib/poolparty/base_packages/poolparty.rb +23 -16
  26. data/lib/poolparty/base_packages/runit.rb +21 -0
  27. data/lib/poolparty/helpers/binary.rb +0 -1
  28. data/lib/poolparty/helpers/provisioner_base.rb +4 -0
  29. data/lib/poolparty/helpers/provisioners/master.rb +15 -8
  30. data/lib/poolparty/modules/file_writer.rb +10 -2
  31. data/lib/poolparty/net/messenger.rb +9 -3
  32. data/lib/poolparty/net/remoter.rb +12 -8
  33. data/lib/poolparty/plugins/runit.rb +96 -0
  34. data/lib/poolparty/pool/cloud.rb +1 -1
  35. data/lib/poolparty/pool/resource.rb +2 -1
  36. data/lib/poolparty/pool/resources/custom_service.rb +30 -0
  37. data/lib/poolparty/pool/resources/package.rb +5 -2
  38. data/lib/poolparty/templates/messenger/client/log-run.erb +2 -0
  39. data/lib/poolparty/templates/messenger/client/run.erb +4 -0
  40. data/lib/poolparty/templates/messenger/master/log-run.erb +2 -0
  41. data/lib/poolparty/templates/messenger/master/run.erb +4 -0
  42. data/lib/poolparty/templates/messenger/node/log-run.erb +2 -0
  43. data/lib/poolparty/templates/messenger/node/run.erb +4 -0
  44. data/lib/poolparty/version.rb +1 -1
  45. data/poolparty.gemspec +58 -504
  46. data/spec/poolparty/net/remote_spec.rb +1 -1
  47. metadata +21 -7
@@ -6,7 +6,7 @@
6
6
  % erl -pa ./ebin -kernel inet_dist_listen_min 7000 inet_dist_listen_max 7050 -setcookie poolparty -boot pm_node_rel-0.1 -sname node1
7
7
 
8
8
  % Starting the client on the master
9
- % erl -pa /var/lib/gems/1.8/gems/poolparty-0.2.47/lib/erlang/messenger/ebin -kernel inet_dist_listen_min 7000 inet_dist_listen_max 7050 -sname client -setcookie poolparty -run pm_client start
9
+ % erl -pa /var/lib/gems/1.8/gems/poolparty-0.2.54/lib/erlang/messenger/ebin -kernel inet_dist_listen_min 7000 inet_dist_listen_max 7050 -sname client -setcookie poolparty -run pm_client start
10
10
 
11
11
  % Get the load
12
12
  % erl -pa /var/lib/gems/1.8/gems/poolparty-0.2.46/lib/erlang/messenger/ebin -kernel inet_dist_listen_min 7000 inet_dist_listen_max 7050 -sname client -setcookie poolparty -run pm_client start
@@ -1,13 +1,21 @@
1
1
  require 'rubygems'
2
2
 
3
3
  # Load required gems
4
+ @required_software = Array.new
4
5
  %w(activesupport ftools logging ruby2ruby).each do |lib|
5
6
  begin
6
7
  require lib
7
8
  rescue Exception => e
9
+ @required_software << lib
8
10
  puts "Could not find library #{lib}: #{e}"
9
- end
10
-
11
+ end
12
+ end
13
+
14
+ unless @required_software.empty?
15
+ puts "*****************************************"
16
+ puts "* Error *"
17
+ puts "* Missing required software *"
18
+ puts ""
11
19
  end
12
20
 
13
21
  # Use active supports auto load mechanism
@@ -7,7 +7,7 @@ module PoolParty
7
7
  # TODO: COME BACK AND CLEAN THIS UP
8
8
  (self.respond_to?(:list_of_running_instances) ? self : parent).list_of_running_instances.each do |ri|
9
9
  has_host({:name => "#{ri.name}", :ip => ri.ip })
10
- end
10
+ end
11
11
 
12
12
  has_package(:name => "erlang")
13
13
  has_package(:name => "erlang-dev")
@@ -40,16 +40,17 @@ module PoolParty
40
40
 
41
41
  has_gempackage(:name => "poolparty", :download_url => "http://github.com/auser/poolparty/tree/master%2Fpkg%2Fpoolparty.gem?raw=true", :requires => [get_gempackage("ruby2ruby"), get_gempackage("RubyInline"), get_gempackage("ParseTree")])
42
42
 
43
- has_exec(:name => "build_messenger", :command => ". /etc/profile && server-build-messenger", :requires => get_gempackage("poolparty"), :ifnot => "ps aux | grep beam | grep node")
44
- has_exec(:name => "start_node", :command => ". /etc/profile && server-start-node", :requires => get_exec("build_messenger"), :ifnot => "ps aux | grep beam | grep node")
45
-
43
+ # , :ifnot => "/bin/ps aux | /bin/grep -q pm_node"
44
+ has_exec(:name => "build_messenger", :command => ". /etc/profile && server-build-messenger -v")
45
+ has_exec(:name => "start_node", :command => ". /etc/profile && server-start-node")
46
+ # has_runit_service("pm_node", "pm_node", File.join(File.dirname(__FILE__), "..", "templates/messenger/node/"))
46
47
  end
47
48
 
48
49
  # execute_on_node do
49
- has_cron(:name => "puppetd runner", :user => Base.user, :minute => "*/5") do
50
- requires get_gempackage("poolparty")
51
- command(PoolParty::Remote::RemoteInstance.puppet_rerun_commad)
52
- end
50
+ has_cron(:name => "puppetd runner", :user => Base.user, :minute => "*/5") do
51
+ requires get_gempackage("poolparty")
52
+ command(PoolParty::Remote::RemoteInstance.puppet_rerun_commad)
53
+ end
53
54
  # end
54
55
 
55
56
  # Cloud panel setup
@@ -62,7 +63,7 @@ module PoolParty
62
63
 
63
64
  # Custom run puppet to minimize footprint
64
65
  # TODO: Update the offsetted times
65
- execute_on_master do
66
+ execute_on_master do
66
67
  has_cron(:name => "puppetd runner", :user => Base.user, :minute => "*/5") do
67
68
  requires get_gempackage("poolparty")
68
69
  command(PoolParty::Remote::RemoteInstance.puppet_master_rerun_command)
@@ -70,20 +71,26 @@ module PoolParty
70
71
  has_cron(:name => "Load handler", :user => Base.user, :minute => "*/4") do
71
72
  requires get_gempackage("poolparty")
72
73
  command(". /etc/profile && cloud-handle-load")
74
+ end
75
+ has_cron(:name => "provisioning ensurer", :user => Base.user, :minute => "*/3") do
76
+ requires get_gempackage("poolparty")
77
+ command ". /etc/profile && cloud-ensure-provisioning"
73
78
  end
79
+ # has_runit_service("client_server", "pm_client", File.join(File.dirname(__FILE__), "..", "templates/messenger/client/"))
80
+ # has_runit_service("master_server", "pm_master", File.join(File.dirname(__FILE__), "..", "templates/messenger/master/"))
81
+ # TODO: Update this so it only runs when needed
82
+ # has_customservice(:name => "start master server", :pattern => "/pm_master/", :bin => ". /etc/profile && server-start-master")
83
+ # has_customservice(:name => "start client server", :pattern => "/client_service/", :bin => ". /etc/profile && server-start-client")
84
+ has_exec(:name => "start master messenger", :command => ". /etc/profile && server-start-master") #, :ifnot => "/bin/ps aux | /bin/grep -q pm_master"
85
+ has_exec(:name => "start client server", :command => ". /etc/profile && server-start-client") #, :ifnot => "/bin/ps aux | /bin/grep -q client_server"
74
86
 
75
- # TODO: Update this so it only runs when needed
76
- has_exec(:name => "start master messenger", :command => ". /etc/profile && server-start-master", :requires => [get_gempackage("poolparty"), get_exec("build_messenger")], :ifnot => "ps aux | grep beam | grep master")
77
-
78
- has_exec(:name => "start client server", :command => ". /etc/profile && server-start-master", :requires => [get_gempackage("poolparty"), get_exec("build_messenger"), get_exec("start master messenger")], :ifnot => "ps aux | grep beam | grep client")
79
-
80
- has_cron({:name => "maintain script", :command => ". /etc/profile && which cloud-maintain | /bin/sh", :minute => "*/3", :requires => [get_gempackage("poolparty"), get_cron("puppetd runner"), get_cron("Load handler"), get_exec("start master messenger"), get_service("haproxy"), get_exec("start client server")]})
87
+ has_cron({:name => "maintain script", :command => ". /etc/profile && which cloud-maintain | /bin/sh", :minute => "*/3", :requires => [get_gempackage("poolparty"), get_cron("puppetd runner"), get_cron("Load handler"), get_service("haproxy")]})
81
88
 
82
89
  has_remotefile(:name => "/usr/bin/puppetcleaner") do
83
90
  mode 744
84
91
  template File.join(File.dirname(__FILE__), "..", "templates/puppetcleaner")
85
92
  end
86
- end
93
+ end
87
94
 
88
95
  has_remotefile(:name => "/usr/bin/puppetrerun") do
89
96
  mode 744
@@ -0,0 +1,21 @@
1
+ =begin rdoc
2
+ Runit beginning
3
+ NOT IMPLEMENTED YET
4
+ =end
5
+ module PoolParty
6
+ class Base
7
+ plugin :runit do
8
+
9
+ def enable
10
+ unless enabled
11
+ has_file(:name => "inittab", :path => "/etc/inittab", :mode => 0644, :owner => "root", :group => "root")
12
+ has_package(:name => "runit", :ensures => "latest", :requires => get_file("inittab"))
13
+ has_exec(:name => "/sbin/start runsvdir", :cwd => "/var/service")
14
+ # has_remotefile(:name => "/etc/event.d/runsvdir", :notify => get_exec("/sbin/start runsvdir"))
15
+ enabled true
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -15,7 +15,6 @@ module PoolParty
15
15
  end
16
16
  def get_existing_spec_location
17
17
  [
18
- "#{Base.base_config_directory}/#{Base.default_specfile_name}",
19
18
  "#{Base.remote_storage_path}/#{Base.default_specfile_name}",
20
19
  ENV["POOL_SPEC"],
21
20
  "#{Base.default_specfile_name}",
@@ -139,6 +139,10 @@ module PoolParty
139
139
  end
140
140
  end
141
141
  def process_clean_reconfigure_for!(instance, testing=false)
142
+ if instance.is_a?(String)
143
+ name = instance
144
+ instance = MyOpenStruct.new(:name => name)
145
+ end
142
146
  vputs "Cleaning certs from master: #{instance.name}"
143
147
  # puppetca --clean #{instance.name}.compute-1.internal; puppetca --clean #{instance.name}.ec2.internal
144
148
  # find /etc/puppet/ssl -type f -exec rm {} \;
@@ -34,8 +34,7 @@ module PoolParty
34
34
  create_local_node,
35
35
  move_templates,
36
36
  create_poolparty_manifest,
37
- restart_puppetd,
38
- start_puppetmaster
37
+ restart_puppetd
39
38
  ]
40
39
  end
41
40
 
@@ -121,15 +120,16 @@ wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-
121
120
  end
122
121
 
123
122
  # ps aux | grep puppetmasterd | awk '{print $2}' | xargs kill
124
- # rm -rf /etc/puppet/ssl
123
+ # /etc/init.d/puppetmaster stop; rm -rf /etc/puppet/ssl; /etc/init.d/puppetmaster start
125
124
  def start_puppetmaster
126
125
  <<-EOS
127
126
  . /etc/profile
128
127
  # /etc/init.d/puppetmaster stop #{unix_hide_string}
129
- # ps aux | grep puppetmaster | awk '{print $2}' | xargs kill #{unix_hide_string} # just in case
130
- # rm -rf /etc/puppet/ssl
131
- # # Start it back up
132
- /etc/init.d/puppetmaster start #{unix_hide_string}
128
+ ps aux | grep puppetmaster | awk '{print $2}' | xargs kill #{unix_hide_string} # just in case
129
+ rm -rf /etc/puppet/ssl
130
+ # Start it back up
131
+ puppetmasterd --verbose
132
+ # /etc/init.d/puppetmaster start #{unix_hide_string}
133
133
  EOS
134
134
  end
135
135
 
@@ -152,7 +152,7 @@ node "#{ri.name}" inherits default {}
152
152
  def move_templates
153
153
  <<-EOS
154
154
  mkdir -p #{Base.template_path}
155
- cp #{Base.remote_storage_path}/#{Base.template_directory}/* #{Base.template_path}
155
+ cp -R #{Base.remote_storage_path}/#{Base.template_directory}/* #{Base.template_path}
156
156
  EOS
157
157
  end
158
158
 
@@ -163,6 +163,13 @@ cp #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes/poolpa
163
163
  EOS
164
164
  end
165
165
 
166
+ def clean_master_certs
167
+ returning String.new do |s|
168
+ s << "puppetca --clean master.compute-1.internal 2>&1 > /dev/null;"
169
+ s << "puppetca --clean master.ec2.internal 2>&1 > /dev/null"
170
+ end
171
+ end
172
+
166
173
  def restart_puppetd
167
174
  <<-EOS
168
175
  . /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master #{unix_hide_string}
@@ -10,6 +10,13 @@ module PoolParty
10
10
  path = ::File.join( Base.tmp_path, Base.template_directory, ::File.basename(file) )
11
11
  FileUtils.cp file, path unless file == path || ::File.exists?(path)
12
12
  end
13
+ def copy_directory_into_template_storage_directory(dir)
14
+ path = make_template_directory(dir)
15
+ Dir["#{dir}/*"].each do |file|
16
+ FileUtils.cp file, path unless ::File.exists?(::File.join(path, ::File.basename(file)))
17
+ end
18
+ ::File.basename(path)
19
+ end
13
20
  def write_to_file_in_storage_directory(file, str, preceded="", &block)
14
21
  path = ::File.join( Base.storage_directory, preceded, ::File.basename(file) )
15
22
  write_to_file(path, str, &block)
@@ -45,9 +52,10 @@ module PoolParty
45
52
  def make_base_directory
46
53
  FileUtils.mkdir_p Base.storage_directory unless ::File.directory?(Base.storage_directory)
47
54
  end
48
- def make_template_directory
49
- path = ::File.join(Base.tmp_path, Base.template_directory)
55
+ def make_template_directory(dir=nil)
56
+ path = dir ? ::File.join(Base.tmp_path, Base.template_directory, ::File.basename(dir)) : ::File.join(Base.tmp_path, Base.template_directory)
50
57
  FileUtils.mkdir_p path unless ::File.directory?(path)
58
+ path
51
59
  end
52
60
  def clear_base_directory
53
61
  FileUtils::rm_rf "#{Base.storage_directory}"
@@ -2,9 +2,6 @@
2
2
  The connection to the messenger from poolparty, the client
3
3
  =end
4
4
  module PoolParty
5
- def reconfigure_cloud!
6
- Messenger.messenger_send!("reconfigure_cloud")
7
- end
8
5
  module Messenger
9
6
  def with_socket(testing=false, &block)
10
7
  host = testing ? "localhost" : (master.ip)
@@ -51,6 +48,15 @@ module PoolParty
51
48
  module Cloud
52
49
  class Cloud
53
50
  include PoolParty::Messenger
51
+
52
+ def get_current_nodes
53
+ nodes = messenger_send!("get_current_nodes")
54
+ nodes.split(" ").map {|a| a.split(/@/)[-1] }
55
+ end
56
+
57
+ def reconfigure_cloud!
58
+ messenger_send!("reconfigure_cloud")
59
+ end
54
60
  end
55
61
  end
56
62
  end
@@ -178,16 +178,17 @@ module PoolParty
178
178
  reset!
179
179
  when_no_pending_instances do
180
180
  vputs "Waiting for 10 seconds"
181
- wait "10.seconds" # Give some time for ssh to startup
181
+ wait "10.seconds" # Give some time for ssh to startup
182
182
  @num_instances = list_of_running_instances.size
183
183
  vputs "(@num_instances - (num))..(@num_instances): #{(@num_instances - (num))..(@num_instances)}"
184
184
  last_instances = nonmaster_nonterminated_instances[(@num_instances - (num))..(@num_instances)]
185
185
  last_instances.each do |inst|
186
186
  vputs "Provision slave: #{inst}"
187
+ hide_output {PoolParty::Provisioner.process_clean_reconfigure_for!(inst, self)}
187
188
  PoolParty::Provisioner.provision_slave(inst, self, false) unless inst.master? rescue vputs "Error"
188
- cmd = ". /etc/profile && cloud-provision -i #{inst.name.gsub(/node/, '')} #{unix_hide_string} &"
189
- vputs "Provision slave with command #{cmd}"
190
- Kernel.system cmd
189
+ hide_output {PoolParty::Provisioner.process_clean_reconfigure_for!(inst, self)}
190
+ # cmd = ". /etc/profile && cloud-provision -i #{inst.name.gsub(/node/, '')} &"
191
+ # vputs "Provision slave with command #{cmd}"
191
192
  end
192
193
  PoolParty::Provisioner.reconfigure_master(self)
193
194
  end
@@ -235,10 +236,13 @@ module PoolParty
235
236
  if can_start_a_new_instance? && should_expand_cloud?(force)
236
237
  vputs "Expanding the cloud based on load"
237
238
  @num = 1
238
- request_launch_new_instances(@num)
239
-
240
- vputs "request_launch_new_instances: #{@num}"
241
- provision_slaves_from_n(@num)
239
+ @num.times do |i|
240
+ list_of_pending_instances.size == 0 ? request_launch_one_instance_at_a_time : wait("5.seconds")
241
+ reset!
242
+ vputs "request_launch_new_instances: #{@num}"
243
+ provision_slaves_from_n(@num)
244
+ after_launched
245
+ end
242
246
  end
243
247
  end
244
248
  # Contract the cloud
@@ -0,0 +1,96 @@
1
+ module PoolParty
2
+ class Runit
3
+ define_resource(:runitservice) do
4
+ def has_runit_service(name="runitservice", downif="", templatedir="")
5
+ path = copy_templates_from_templatedir(templatedir)
6
+ call_function <<-EOC
7
+ runit_service {
8
+ "#{name}":
9
+ directory => "/etc/sv",
10
+ downif => "/bin/ps aux | grep -v grep | grep -q #{downif}",
11
+ templatedir => "#{path}";
12
+ }
13
+ EOC
14
+ end
15
+
16
+ def copy_templates_from_templatedir(dir=nil)
17
+ raise TemplateNotFound.new("template directory given") unless dir
18
+ raise TemplateNotFound.new("template directory cannot be found #{dir}") unless ::File.readable?(dir)
19
+ copy_directory_into_template_storage_directory(dir)
20
+ end
21
+
22
+ custom_function <<-EOF
23
+ define runit_service ($directory = "/etc/sv", $downif = "/bin/false", $templatedir) {
24
+
25
+ file { "$directory-$name":
26
+ path => "$directory/$name",
27
+ ensure => directory,
28
+ owner => root,
29
+ group => root,
30
+ mode => 0755,
31
+ require => Class["runit"]
32
+ }
33
+
34
+ file { "$directory/$name/log":
35
+ ensure => directory,
36
+ owner => root,
37
+ group => root,
38
+ mode => 0755,
39
+ require => File["$directory-$name"]
40
+ }
41
+
42
+ file { "$directory/$name/log/main":
43
+ ensure => directory,
44
+ owner => root,
45
+ group => root,
46
+ mode => 0755,
47
+ require => File["$directory/$name/log"]
48
+ }
49
+
50
+ file { "/etc/init.d/$name":
51
+ ensure => $lsbdistid ? {
52
+ 'CentOS' => "/usr/local/bin/sv",
53
+ default => "/usr/bin/sv",
54
+ },
55
+ require => [ File["$directory/$name/run"], File["$directory/$name/log/run"] ]
56
+ }
57
+
58
+ file { "/var/service/$name":
59
+ ensure => "$directory/$name",
60
+ require => [ File["$directory-$name"], File["$directory/$name/run"], File["$directory/$name/log/run"] ]
61
+ }
62
+
63
+ file { "$directory/$name/log/run":
64
+ content => template("$templatedir/log-run.erb"),
65
+ owner => root,
66
+ group => root,
67
+ mode => 755,
68
+ require => File["$directory/$name/log"],
69
+ notify => Service[$name]
70
+ }
71
+
72
+ file { "$directory/$name/run":
73
+ content => template("$templatedir/run.erb"),
74
+ owner => root,
75
+ group => root,
76
+ mode => 755,
77
+ require => File["$directory-$name"],
78
+ notify => Service[$name]
79
+ }
80
+
81
+ service { "$name":
82
+ hasrestart => true,
83
+ hasstatus => true,
84
+ require => File["/etc/init.d/$name"]
85
+ }
86
+
87
+ exec { "$name-down":
88
+ command => "/etc/init.d/$name down",
89
+ onlyif => $downif,
90
+ require => File["/etc/init.d/$name"]
91
+ }
92
+ }
93
+ EOF
94
+ end
95
+ end
96
+ end
@@ -170,7 +170,7 @@ module PoolParty
170
170
  # Also note that there is no block associated. This is because we have written
171
171
  # all that is necessary in a method called enable
172
172
  # which is called when there is no block
173
- def add_poolparty_base_requirements
173
+ def add_poolparty_base_requirements
174
174
  heartbeat
175
175
  haproxy
176
176
  ruby
@@ -167,7 +167,8 @@ module PoolParty
167
167
  [
168
168
  :subscribe, :owner, :group, :path, :mode, :source, :notify, :subscribe, :check, :creates, :cwd, :command, :ensure,
169
169
  :require, :schedule, :range, :alias, :hour, :minute, :user, :month, :monthday, :name, :onlyif, :unless, :refreshonly,
170
- :refresh, :content, :template, :ip, :repeat, :provider, :key, :device, :fstype, :remounts, :options, :atboot
170
+ :refresh, :content, :template, :ip, :repeat, :provider, :key, :device, :fstype, :remounts, :options, :atboot, :before,
171
+ :binary, :status, :start, :stop, :restart, :pattern
171
172
  ]
172
173
  end
173
174
  def key
@@ -0,0 +1,30 @@
1
+ module PoolParty
2
+ module Resources
3
+
4
+ class Customservice < Resource
5
+
6
+ default_options({
7
+ :ensure => "running",
8
+ :provider => "base"
9
+ })
10
+
11
+ def bin(arg)
12
+ options.merge!(:binary => arg)
13
+ options.merge!(:start => arg)
14
+ options.merge!(:stop => arg.gsub(/start/, 'stop'))
15
+ options.merge!(:restart => "#{arg.gsub(/start/, 'stop')} && #{arg}")
16
+ end
17
+
18
+ def present
19
+ "running"
20
+ end
21
+ def absent
22
+ "stopping"
23
+ end
24
+ def class_type_name
25
+ "Service"
26
+ end
27
+ end
28
+
29
+ end
30
+ end