auser-poolparty 0.2.60 → 0.2.61

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/Manifest.txt +2 -0
  2. data/README.txt +2 -0
  3. data/bin/cloud-ensure-provisioning +8 -2
  4. data/bin/cloud-provision +1 -0
  5. data/bin/pool-list +10 -2
  6. data/bin/server-send-command +18 -0
  7. data/bin/server-update-hosts +47 -0
  8. data/lib/poolparty.rb +1 -1
  9. data/lib/poolparty/aska/aska.rb +1 -1
  10. data/lib/poolparty/base_packages/haproxy.rb +2 -2
  11. data/lib/poolparty/base_packages/poolparty.rb +14 -19
  12. data/lib/poolparty/core/object.rb +7 -4
  13. data/lib/poolparty/helpers/console.rb +4 -0
  14. data/lib/poolparty/helpers/optioner.rb +3 -0
  15. data/lib/poolparty/helpers/provisioners/master.rb +18 -15
  16. data/lib/poolparty/helpers/provisioners/slave.rb +2 -1
  17. data/lib/poolparty/modules/cloud_resourcer.rb +27 -8
  18. data/lib/poolparty/modules/method_missing_sugar.rb +1 -1
  19. data/lib/poolparty/net/remote.rb +3 -0
  20. data/lib/poolparty/net/remote_bases/ec2.rb +6 -3
  21. data/lib/poolparty/net/remote_instance.rb +9 -3
  22. data/lib/poolparty/net/remoter.rb +8 -39
  23. data/lib/poolparty/net/remoter_base.rb +4 -9
  24. data/lib/poolparty/pool/base.rb +4 -3
  25. data/lib/poolparty/pool/cloud.rb +19 -23
  26. data/lib/poolparty/pool/plugin.rb +3 -27
  27. data/lib/poolparty/pool/plugin_model.rb +6 -8
  28. data/lib/poolparty/pool/pool.rb +15 -4
  29. data/lib/poolparty/pool/resource.rb +5 -10
  30. data/lib/poolparty/pool/resources/class_package.rb +6 -4
  31. data/lib/poolparty/pool/resources/conditional.rb +2 -3
  32. data/lib/poolparty/templates/puppetrerun +1 -13
  33. data/lib/poolparty/templates/puppetrunner +1 -12
  34. data/lib/poolparty/version.rb +1 -1
  35. data/poolparty.gemspec +6 -2
  36. data/spec/poolparty/aska/aska_spec.rb +0 -8
  37. data/spec/poolparty/helpers/provisioner_base_spec.rb +2 -0
  38. data/spec/poolparty/modules/cloud_resourcer_spec.rb +2 -2
  39. data/spec/poolparty/net/remoter_spec.rb +0 -106
  40. data/spec/poolparty/pool/base_spec.rb +0 -3
  41. data/spec/poolparty/pool/cloud_spec.rb +10 -19
  42. data/spec/poolparty/pool/plugin_spec.rb +2 -2
  43. data/spec/poolparty/pool/pool_spec.rb +16 -1
  44. data/spec/poolparty/pool/resource_spec.rb +1 -1
  45. metadata +6 -2
data/Manifest.txt CHANGED
@@ -35,6 +35,7 @@ bin/server-get-load
35
35
  bin/server-list-active
36
36
  bin/server-list-responding
37
37
  bin/server-rerun
38
+ bin/server-send-command
38
39
  bin/server-show-stats
39
40
  bin/server-start-client
40
41
  bin/server-start-master
@@ -42,6 +43,7 @@ bin/server-start-node
42
43
  bin/server-stop-client
43
44
  bin/server-stop-master
44
45
  bin/server-stop-node
46
+ bin/server-update-hosts
45
47
  config/hoe.rb
46
48
  config/requirements.rb
47
49
  examples/basic.rb
data/README.txt CHANGED
@@ -41,6 +41,8 @@ sudo gem install auser-poolparty
41
41
  == TODO:
42
42
  * Replace services with Runit
43
43
  * Refactor provisioning to use erlang
44
+ * Move the building of the resource tree on read to on resolve
45
+ * Add queuing of tasks on the messenger
44
46
 
45
47
  == LICENSE:
46
48
 
@@ -23,9 +23,15 @@ o.loaded_clouds.each do |cloud|
23
23
  s << "/usr/sbin/puppetca --clean #{node}.compute-1.internal"
24
24
  s << "/usr/sbin/puppetca --clean #{node}.ec2.internal"
25
25
  end.join(";")
26
- cmd = ". /etc/profile && #{str};cloud-provision -i #{node.gsub(/node/, '')};#{str}"
26
+
27
+ node_id = node.gsub(/node/, '')
28
+
29
+ cmd = ". /etc/profile && #{str};cloud-provision -i #{node_id};#{str}"
30
+ running_cmd = "ps aux | grep -v grep | grep \"cloud-provision -i #{node_id}\""
31
+
27
32
  vputs "Executing #{cmd}"
28
- `#{cmd}`
33
+ running = %x[#{running_cmd}]
34
+ `#{cmd}` if running.chomp.empty?
29
35
  end
30
36
  # @tp.join
31
37
  end
data/bin/cloud-provision CHANGED
@@ -4,6 +4,7 @@ require "poolparty"
4
4
  require "poolpartycl"
5
5
 
6
6
  o = PoolParty::Optioner.new(ARGV) do |opts, optioner|
7
+ opts.on('-n cloudname', '--name name', 'Start cloud by this name') { |c| optioner.cloudname c }
7
8
  opts.on('-p', '--slave', 'Provision slave (default: false)') { optioner.provision_slave true }
8
9
  opts.on('-i num', '--id num', 'Instance num to provision') { |i| optioner.instance_number i }
9
10
  end
data/bin/pool-list CHANGED
@@ -15,8 +15,16 @@ o.loaded_pools.each do |pool|
15
15
  puts header("Listing pool #{name}")
16
16
  clouds.each do |name, cloud|
17
17
  puts subheader("Cloud: #{name}")
18
- out = location == "remote" ? cloud.list_from_remote({:cache => true}).map{|a| a.to_s} : cloud.list_from_local.map{|a| a.to_s}
19
- puts out
18
+ with_cloud(cloud) do
19
+ puts header("Listing cloud #{name}")
20
+ puts subheader("Active instances")
21
+ puts list_of_running_instances.map{|a| a.to_s}.join("\n")
22
+ puts ""
23
+ if list_of_pending_instances.size > 0
24
+ puts subheader("Pending instances")
25
+ puts list_of_pending_instances.map{|a| a.to_s}.join("\n")
26
+ end
27
+ end
20
28
  end
21
29
  end
22
30
  end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+ require "poolparty"
4
+ require "poolpartycl"
5
+
6
+ @command = ARGV[-1] || ""
7
+
8
+ o = PoolParty::Optioner.new(ARGV) do |opts, optioner|
9
+ opts.on('-c command', '--command command', 'Command to run') { |c| optioner.command c }
10
+ end
11
+
12
+ @command,@args = Arr.split(" ")[0], Arr.split(" ")[1..-1]
13
+
14
+ o.loaded_clouds do |cloud|
15
+ with_cloud(cloud, {:command => @command, :command_args => @args}) do
16
+ cloud.send command.to_sym, command_args
17
+ end
18
+ end
@@ -0,0 +1,47 @@
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', 'Update hosts for local pool named [name]') { |p| optioner.poolname p }
8
+ end
9
+
10
+ o.loaded_pools.each do |pool|
11
+ with_pool(pool) do
12
+ pool_clouds.each do |cl|
13
+
14
+ new_hosts_listing = returning Array.new do |arr|
15
+ cl.list_of_running_instances.each do |ri|
16
+ vputs ri.hosts_file_listing_for(cl)
17
+ arr << ri.hosts_file_listing_for(cl)
18
+ end
19
+ cl.other_clouds.each do |other|
20
+ other.list_of_running_instances.each do |ri|
21
+ vputs ri.hosts_file_listing_for(cl)
22
+ arr << ri.hosts_file_listing_for(cl)
23
+ end
24
+ end
25
+ end.join("\n")
26
+
27
+ if testing
28
+ puts new_hosts_listing
29
+ else
30
+ new_hosts_file = "#{Base.manifest_path}/classes/hosts.pp"
31
+
32
+ arr = returning Array.new do |arr|
33
+ new_hosts_listing.split(/\n/).each do |line|
34
+ parts = line.split(/\t/).map {|a| a.chomp }
35
+ ip,hostname,aliases = parts[0], parts[1], parts[2..-1]
36
+
37
+ arr << PoolParty::Resources::Host.new(:ip => ip, :name => Resolv::DNS.new.getaddress(hostname), :alias => aliases).to_string
38
+ end
39
+ end
40
+
41
+ ::File.open(new_hosts_file, "w+") {|f| f << arr.join("\n") }
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+ end
data/lib/poolparty.rb CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  # Load required gems
4
4
  @required_software = Array.new
5
- %w(activesupport ftools logging ruby2ruby).each do |lib|
5
+ %w(activesupport ftools logging resolv ruby2ruby).each do |lib|
6
6
  begin
7
7
  require lib
8
8
  rescue Exception => e
@@ -9,7 +9,7 @@ module Aska
9
9
  arr.each do |line|
10
10
  next unless line
11
11
  rule = Rule.new(line)
12
- raise LoadRulesException.new(line) unless rule.valid?
12
+ next unless rule.valid?
13
13
  k = rule.key
14
14
  v = rule.var
15
15
  m = rule.comparison
@@ -2,14 +2,14 @@ module PoolParty
2
2
  class Base
3
3
  plugin :haproxy do
4
4
 
5
- def enable
5
+ def enable
6
6
  execute_on_master do
7
7
  has_package({:name => "haproxy"})
8
8
 
9
9
  # Restart sysklogd after we update the haproxy.log
10
10
  has_service(:name => "sysklogd")
11
11
 
12
- # Template variables
12
+ # Template variables
13
13
  has_variable(:name => "name_haproxy", :value => "#{cloud.name}")
14
14
  has_variable(:name => "nodenames_haproxy", :value => "generate('/usr/bin/env', '/usr/bin/server-list-active', '-c', 'name')")
15
15
  has_variable(:name => "node_ips_haproxy", :value => "generate('/usr/bin/env', '/usr/bin/server-list-active', '-c', 'ip')")
@@ -1,15 +1,9 @@
1
1
  module PoolParty
2
2
  class Base
3
- plugin :poolparty do
3
+ plugin :poolparty_base_packages do
4
4
 
5
5
  def enable
6
6
  # Build hostsfile
7
- # TODO: COME BACK AND CLEAN THIS UP
8
- (self.respond_to?(:list_of_running_instances) ? self : parent).list_of_running_instances.each do |ri|
9
- has_host({:name => "#{ri.name}", :ip => ri.ip})
10
- end
11
-
12
- # has_host({:name => "$hostname", :ip => "127.0.0.1", :alias => "localhost"})
13
7
 
14
8
  has_package(:name => "erlang")
15
9
  has_package(:name => "erlang-dev")
@@ -43,16 +37,22 @@ module PoolParty
43
37
  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")])
44
38
 
45
39
  # , :ifnot => "/bin/ps aux | /bin/grep -q pm_node"
46
- has_exec(:name => "build_messenger", :command => ". /etc/profile && server-build-messenger -v")
40
+ has_exec(:name => "build_messenger", :command => ". /etc/profile && server-build-messenger")
47
41
  has_exec(:name => "start_node", :command => ". /etc/profile && server-start-node")
42
+ has_exec(:name => "update_hosts", :command => ". /etc/profile && server-update-hosts")
48
43
  # has_runit_service("pm_node", "pm_node", File.join(File.dirname(__FILE__), "..", "templates/messenger/node/"))
49
44
  end
50
45
 
51
46
  # execute_on_node do
52
47
  has_cron(:name => "puppetd runner", :user => Base.user, :minute => "*/5") do
53
48
  requires get_gempackage("poolparty")
54
- command "/usr/bin/puppetrun"
49
+ command "/usr/bin/puppetrunner"
50
+ end
51
+ has_remotefile(:name => "/usr/bin/puppetrunner") do
52
+ mode 744
53
+ template File.join(File.dirname(__FILE__), "..", "templates/puppetrunner")
55
54
  end
55
+
56
56
  # end
57
57
 
58
58
  # Cloud panel setup
@@ -92,17 +92,12 @@ module PoolParty
92
92
  mode 744
93
93
  template File.join(File.dirname(__FILE__), "..", "templates/puppetcleaner")
94
94
  end
95
+
96
+ has_remotefile(:name => "/usr/bin/puppetrerun") do
97
+ mode 744
98
+ template File.join(File.dirname(__FILE__), "..", "templates/puppetrerun")
99
+ end
95
100
  end
96
-
97
- has_remotefile(:name => "/usr/bin/puppetrerun") do
98
- mode 744
99
- template File.join(File.dirname(__FILE__), "..", "templates/puppetrerun")
100
- end
101
- has_remotefile(:name => "/usr/bin/puppetrunner") do
102
- mode 744
103
- template File.join(File.dirname(__FILE__), "..", "templates/puppetrunner")
104
- end
105
-
106
101
  # has_host(:name => "puppet", :ip => (self.respond_to?(:master) ? self : parent).master.ip)
107
102
  end
108
103
 
@@ -55,7 +55,7 @@ class Object
55
55
  end
56
56
  end
57
57
  def block_instance_eval(*args, &block)
58
- return instance_eval(*args,&block) unless block_given? && !block.arity.zero?
58
+ return instance_eval(*args,&block) unless block && !block.arity.zero?
59
59
  old_method = (self.class.instance_method(:__) rescue nil)
60
60
  self.class.send(:define_method, :__, &block)
61
61
  block_method = self.class.instance_method(:__)
@@ -72,16 +72,19 @@ class Object
72
72
  def meta_undef name
73
73
  meta_eval { remove_method name }
74
74
  end
75
- def run_in_context(&block)
75
+ def run_in_context(context=self, &block)
76
76
  name="temp_#{self.class}_#{respond_to?(:parent) ? parent.to_s : Time.now.to_i}".to_sym
77
77
  meta_def name, &block
78
- self.send name, self
78
+ self.send name, context
79
79
  # self.instance_eval &block if block
80
- meta_undef name
80
+ meta_undef name rescue ""
81
81
  end
82
82
  def vputs(m="", o=self)
83
83
  puts m if o.verbose
84
84
  end
85
+ def dputs(m="", o=self)
86
+ vputs(">#{::File.basename(__FILE__)} (#{__LINE__}) #{m}", o)
87
+ end
85
88
  def vprint(m="", o=self)
86
89
  print m if o.verbose
87
90
  end
@@ -20,6 +20,10 @@ module PoolParty
20
20
  o.cloudname ? [cloud(o.cloudname.downcase.to_sym)] : [clouds[clouds.keys.first]]
21
21
  end
22
22
 
23
+ def extract_pool_from_options(o)
24
+ o.poolname ? [pool(o.poolname.downcase.to_sym)] : [pools[pools.keys.first]]
25
+ end
26
+
23
27
  # Clear all the pools and reload the console
24
28
  # Call within console to reset and reload the entire poolparty base
25
29
  # as well
@@ -71,6 +71,9 @@ module PoolParty
71
71
 
72
72
  reject_junk_options!
73
73
  raise CloudNotFoundException.new("Please specify your cloud with -s, move it to ./pool.spec or in your POOL_SPEC environment variable") unless loaded_clouds && !loaded_clouds.empty?
74
+ loaded_pools.each do |pl|
75
+ pl.configure(self.options)
76
+ end
74
77
  loaded_clouds.each do |cl|
75
78
  cl.configure(self.options)
76
79
  end
@@ -25,9 +25,9 @@ module PoolParty
25
25
  setup_autosigning,
26
26
  install_poolparty,
27
27
  setup_poolparty,
28
- create_local_node,
28
+ restart_puppetmaster,
29
29
  run_first_time,
30
- restart_puppetmaster
30
+ create_local_node,
31
31
  ] << configure_tasks
32
32
  end
33
33
 
@@ -45,6 +45,7 @@ module PoolParty
45
45
  <<-EOS
46
46
  echo "Creating local host entry"
47
47
  if [ -z \"$(grep -v '#' /etc/hosts | grep 'puppet')" ]; then echo '#{@master_ip} puppet master localhost' >> /etc/hosts; fi
48
+ hostname master
48
49
  EOS
49
50
  end
50
51
 
@@ -116,11 +117,11 @@ wget http://rubyforge.org/frs/download.php/45546/rubyforge-1.0.1.gem -O rubyforg
116
117
  wget http://rubyforge.org/frs/download.php/43954/rake-0.8.3.gem -O rake.gem 2>&1
117
118
  wget http://rubyforge.org/frs/download.php/45589/sexp_processor-3.0.0.gem -O sexp_processor.gem 2>&1
118
119
  wget http://github.com/auser/poolparty/tree/master%2Fpkg%2Fpoolparty.gem?raw=true -O poolparty.gem 2>&1
119
- wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-ec2.gem 2>&1
120
+ # wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-ec2.gem 2>&1
120
121
 
121
122
  #{
122
123
  %w(rake lockfile rubyforge hoe ZenTest sexp_processor flexmock logging activesupport
123
- RubyInline ParseTree ruby2ruby xml-simple poolparty amazon-ec2).map do |dep|
124
+ RubyInline ParseTree ruby2ruby xml-simple poolparty).map do |dep|
124
125
  "gem install --ignore-dependencies -y --no-ri --no-rdoc #{dep}.gem #{unix_hide_string}"
125
126
  end.join("\n")
126
127
  }
@@ -132,21 +133,24 @@ wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-
132
133
  def restart_puppetmaster
133
134
  <<-EOS
134
135
  echo "(Re)starting poolparty"
135
- . /etc/profile
136
- /etc/init.d/puppetmaster stop #{unix_hide_string}
137
- ps aux | grep puppetmaster | awk '{print $2}' | xargs kill #{unix_hide_string} # just in case
138
- rm -rf /etc/puppet/ssl
139
- # Start it back up
140
- # puppetmasterd --verbose
136
+ # . /etc/profile
137
+ # /etc/init.d/puppetmaster stop #{unix_hide_string}
138
+ # ps aux | grep puppetmaster | awk '{print $2}' | xargs kill #{unix_hide_string} # just in case
139
+ # rm -rf /etc/puppet/ssl
140
+ # # Start it back up
141
+ # # puppetmasterd --verbose
141
142
  /etc/init.d/puppetmaster start
142
143
  EOS
143
144
  end
144
145
 
145
146
  def run_first_time
146
147
  <<-EOE
147
- echo "#{open(File.join(template_directory, "puppetrerun")).read}" > /usr/bin/puppetrerun
148
+ echo "Running first time run"
149
+ cp #{Base.remote_storage_path}/#{Base.template_directory}/puppetrerun /usr/bin/puppetrerun
150
+ cp #{Base.remote_storage_path}/#{Base.template_directory}/puppetrunner /usr/bin/puppetrunner
148
151
  chmod +x /usr/bin/puppetrerun
149
- /bin/sh /usr/bin/puppetrerun
152
+ chmod +x /usr/bin/puppetrunner
153
+ /bin/sh /usr/bin/server-update-hosts
150
154
  EOE
151
155
  end
152
156
 
@@ -163,7 +167,7 @@ node default {
163
167
  node "#{ri.name}" inherits default {}
164
168
  EOS
165
169
  end
166
- "echo '#{str}' > /etc/puppet/manifests/nodes/nodes.pp"
170
+ "echo '#{str}' > #{Base.manifest_path}/../nodes/nodes.pp"
167
171
  end
168
172
 
169
173
  def move_templates
@@ -191,10 +195,9 @@ cp #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes/poolpa
191
195
  end
192
196
 
193
197
  def restart_puppetd
194
- terminate_string = "ps aux | grep puppetmaster | awk '{print $2}' | xargs kill #{unix_hide_string}; puppetmasterd --verbose"
195
198
  <<-EOS
196
199
  echo "Running puppet manifest"
197
- /bin/sh /usr/bin/puppetrerun
200
+ /bin/sh /usr/bin/puppetrunner
198
201
  EOS
199
202
  end
200
203
  end
@@ -4,6 +4,7 @@ module PoolParty
4
4
 
5
5
  def install_tasks
6
6
  [
7
+ setup_poolparty,
7
8
  setup_puppet,
8
9
  setup_configs,
9
10
  run_once_and_clean
@@ -18,7 +19,7 @@ module PoolParty
18
19
 
19
20
  def setup_poolparty
20
21
  <<-EOE
21
- echo "#{open(File.join(template_directory, "puppetrun")).read}" > /usr/bin/puppetrun
22
+ echo "#{open(File.join(template_directory, "puppetrunner")).read}" > /usr/bin/puppetrunner
22
23
  EOE
23
24
  end
24
25
 
@@ -10,8 +10,15 @@ module PoolParty
10
10
 
11
11
  # Store block
12
12
  def store_block(&block)
13
- @store_block ||= block
13
+ @stored_block ||= block
14
14
  end
15
+
16
+ # This will run the blocks after they are stored if there is a block
17
+ # associated
18
+ def run_stored_block
19
+ self.run_in_context @stored_block if @stored_block
20
+ end
21
+
15
22
  # Set instances with a range
16
23
  def instances(arg)
17
24
  if arg.is_a?(Range)
@@ -70,17 +77,29 @@ module PoolParty
70
77
  ]
71
78
  end
72
79
 
80
+ def context_stack
81
+ @@context_stack ||= []
82
+ end
83
+ def run_setup(parent, should_set_parent=true, &block)
84
+ context_stack.push parent
85
+
86
+ set_parent if should_set_parent
87
+ run_in_context self, &block if block
88
+
89
+ context_stack.pop
90
+ end
91
+
73
92
  # Set the parent on the resource
74
- def set_parent(pare, sink_options=true)
75
- unless pare == self
76
- @parent = pare
93
+ def set_parent(sink_options=true)
94
+ # unless context_stack.last == self
95
+ @parent = context_stack.last
77
96
  # Add self as a service on the parent
78
- pare.add_service(self) if pare.respond_to?(:add_service)
97
+ parent.add_service(self) if parent.respond_to?(:add_service)
79
98
  # Take the options of the parents
80
- configure(pare.options) if pare.respond_to?(:options) && sink_options
81
- end
99
+ configure(parent.options) if parent && parent.respond_to?(:options) && sink_options
100
+ # end
82
101
  end
83
-
102
+
84
103
  def number_of_resources
85
104
  arr = resources.map do |n, r|
86
105
  r.size