auser-poolparty 0.2.60 → 0.2.61

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 (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
@@ -16,7 +16,7 @@ module PoolParty
16
16
  # See get_from_options for more information
17
17
  def method_missing(m, *args, &block)
18
18
  if block_given?
19
- (args[0].class == self.class) ? args[0].instance_eval(&block) : super
19
+ (args[0].class == self.class) ? args[0].run_in_context(&block) : super
20
20
  else
21
21
  get_from_options(m, *args, &block)
22
22
  end
@@ -7,9 +7,11 @@ module PoolParty
7
7
  include PoolParty::Remote::Remoter
8
8
 
9
9
  def using(t)
10
+ @cloud = self
10
11
  if available_bases.include?(t.to_sym)
11
12
  unless using_remoter? || t.nil?
12
13
  self.class.send :attr_reader, :remote_base
14
+ self.class.send :attr_reader, :parent_cloud
13
15
  mod = "#{t}".preserved_module_constant
14
16
 
15
17
  # mod.send :include, PoolParty::Remote::RemoterBase
@@ -17,6 +19,7 @@ module PoolParty
17
19
  self.extend mod
18
20
 
19
21
  @remote_base = "#{t}".preserved_module_constant
22
+ @parent_cloud = @cloud
20
23
  end
21
24
  else
22
25
  puts "Unknown remote base"
@@ -11,6 +11,8 @@ begin
11
11
  end
12
12
  module PoolParty
13
13
  module Ec2
14
+ include PoolParty::Remote::RemoterBase
15
+
14
16
  def launch_new_instance!(num=1)
15
17
  instance = ec2.run_instances(
16
18
  :image_id => (ami || Base.ami),
@@ -40,13 +42,13 @@ begin
40
42
  @id = 0
41
43
  get_instances_description.each_with_index do |h,i|
42
44
  if h[:status] == "running"
43
- @name = @id == 0 ? "master" : "node#{@id}"
45
+ inst_name = @id == 0 ? "master" : "node#{@id}"
44
46
  @id += 1
45
47
  else
46
- @name = "#{h[:status]}_node#{i}"
48
+ inst_name = "#{h[:status]}_node#{i}"
47
49
  end
48
50
  h.merge!({
49
- :name => @name,
51
+ :name => inst_name,
50
52
  :hostname => h[:ip],
51
53
  :ip => h[:ip].convert_from_ec2_to_ip,
52
54
  :index => i,
@@ -160,6 +162,7 @@ begin
160
162
  :ip => resp.dnsName || "not-assigned",
161
163
  :status => resp.instanceState.name,
162
164
  :launching_time => resp.launchTime.parse_datetime,
165
+ :internal_ip => resp.privateDnsName,
163
166
  :keypair => resp.keyName
164
167
  }
165
168
  rescue Exception => e
@@ -7,11 +7,13 @@ module PoolParty
7
7
  include Remote
8
8
  include Configurable
9
9
  include CloudResourcer
10
-
11
- def initialize(opts, parent=self)
12
- @parent = parent
10
+
11
+ def initialize(opts, parent=nil)
12
+ run_setup(parent)
13
+
13
14
  set_vars_from_options(parent.options) if parent && parent.respond_to?(:options)
14
15
  set_vars_from_options(opts) unless opts.nil? || opts.empty?
16
+
15
17
  on_init
16
18
  end
17
19
 
@@ -77,6 +79,10 @@ module PoolParty
77
79
  def self.puppet_rerun_commad
78
80
  puppet_runner_command
79
81
  end
82
+ def hosts_file_listing_for(cl)
83
+ string = (cl.name == parent.name) ? "#{name}.#{parent.name}\t#{name}" : "#{name}.#{parent.name}"
84
+ "#{internal_ip}\t#{string}"
85
+ end
80
86
  end
81
87
 
82
88
  end
@@ -40,30 +40,6 @@ module PoolParty
40
40
  def remote_rsync_command
41
41
  "rsync -azP --exclude cache -e '#{remote_ssh_string}'"
42
42
  end
43
- # Open the cached local copy of the instances list and
44
- # create a new RemoteInstance from each line
45
- def list_from_local
46
- list_file = get_working_listing_file
47
- if list_file
48
- out = returning Array.new do |instances|
49
- open(list_file).read.split("\n").each do |line|
50
- instances << RemoteInstance.new(line)
51
- end
52
- end
53
- else
54
- out = list_from_remote(:cache => true)
55
- end
56
- return out
57
- end
58
- # List the instances that are known from the remoter_base
59
- # Create a RemoteInstance for each of the instances from the hash
60
- # returned by the list of instances, write them to the cached file
61
- # and then return the array of instances
62
- def list_from_remote(options={})
63
- out_array = get_remote_nodes
64
- write_to_file( local_instances_list_file_locations.first, out_array.map{|a| a.to_s }.join("\n")) if options[:cache]
65
- out_array
66
- end
67
43
  # Get the names of the nodes. Mainly used for puppet templating
68
44
  def list_of_node_names(options={})
69
45
  list_of_running_instances.collect {|ri| ri.name }
@@ -72,13 +48,7 @@ module PoolParty
72
48
  def list_of_node_ips(options={})
73
49
  list_of_running_instances.collect {|ri| ri.ip }
74
50
  end
75
- def get_remote_nodes
76
- returning Array.new do |instances|
77
- list_of_instances(respond_to?(:keypair) ? keypair : nil).each do |h|
78
- instances << PoolParty::Remote::RemoteInstance.new(h)
79
- end
80
- end
81
- end
51
+
82
52
  # Get the instance first instance file that exists on the system from the expected places
83
53
  # denoted in the local_instances_list_file_locations
84
54
  def get_working_listing_file
@@ -210,15 +180,16 @@ module PoolParty
210
180
  logger.debug "Launching master"
211
181
  request_launch_master_instance if list_of_pending_instances.size.zero? && can_start_a_new_instance? && !is_master_running?
212
182
  reset!
213
-
183
+ vputs ""
214
184
  vputs "Waiting for there to be no pending instances..."
215
185
  when_no_pending_instances do
216
186
  wait "20.seconds"
217
187
  vputs ""
218
188
  vputs "Provisioning master..."
219
- hide_output { Provisioner.provision_master(self, testing) }
220
- PoolParty::Provisioner.clear_master_ssl_certs(self)
221
- PoolParty::Provisioner.reconfigure_master(self, testing)
189
+
190
+ verbose ? Provisioner.provision_master(self, testing) : hide_output { Provisioner.provision_master(self, testing) }
191
+ verbose ? Provisioner.clear_master_ssl_certs(self, testing) : hide_output { Provisioner.clear_master_ssl_certs(self, testing) }
192
+
222
193
  after_launched
223
194
  end
224
195
  end
@@ -258,7 +229,7 @@ module PoolParty
258
229
  def contract_cloud_if_necessary(force=false)
259
230
  if can_shutdown_an_instance?
260
231
  if should_contract_cloud?(force)
261
- logger.debug "Shrinking the cloud by 1"
232
+ vputs "Shrinking the cloud by 1"
262
233
  before_shutdown
263
234
  request_termination_of_non_master_instance
264
235
  end
@@ -279,9 +250,7 @@ module PoolParty
279
250
 
280
251
  # Rsync command to the instance
281
252
  def rsync_storage_files_to(instance=nil)
282
- hide_output do
283
- Kernel.system "#{rsync_storage_files_to_command(instance)}" if instance
284
- end
253
+ hide_output {Kernel.system "#{rsync_storage_files_to_command(instance)}" if instance}
285
254
  end
286
255
  # Take the rsync command and execute it on the system
287
256
  # if there is an instance given
@@ -71,7 +71,9 @@ module PoolParty
71
71
  list.select {|i| i.name == name }.first
72
72
  end
73
73
  def remote_instances_list
74
- list_of_instances.map {|i| PoolParty::Remote::RemoteInstance.new(i, self) }
74
+ # puts "> #{@containing_cloud.name} - #{@containing_cloud.class}"
75
+ @containing_cloud = self
76
+ @remote_instances_list ||= list_of_instances(keypair).collect {|h| PoolParty::Remote::RemoteInstance.new(h, @containing_cloud) }
75
77
  end
76
78
  # List the instances for the current key pair, regardless of their states
77
79
  # If no keypair is passed, select them all
@@ -79,7 +81,7 @@ module PoolParty
79
81
  key = keyp ? keyp : keypair
80
82
  unless @describe_instances
81
83
  tmpInstanceList = describe_instances.select {|a| key ? a[:keypair] == key : true }
82
- has_master = !tmpInstanceList.select {|a| a[:name] == "master" }.empty?
84
+ has_master = !tmpInstanceList.select {|a| a[:name] == "master" }.empty?
83
85
  if has_master
84
86
  @describe_instances = tmpInstanceList
85
87
  else
@@ -103,13 +105,6 @@ module PoolParty
103
105
  def select_from_instances_on_status(status=/running/, list=[])
104
106
  list.select {|a| a[:status] =~ status}
105
107
  end
106
- # Instances
107
- # Get the master from the cloud
108
- def master
109
- # remote_instances_list.select {|a| a.master }.first
110
- @list = list_from_remote
111
- @list.reject {|a| a unless a.name =~ /master/ }.first if @list.class != String
112
- end
113
108
  # Helpers
114
109
  def create_keypair
115
110
  end
@@ -10,7 +10,6 @@ module PoolParty
10
10
  extend MethodMissingSugar
11
11
 
12
12
  default_options({
13
- :environment => "production",
14
13
  :user => "root", # This should change here
15
14
  :base_keypair_path => "#{ENV["HOME"]}/.ec2",
16
15
  :tmp_path => "/tmp/poolparty",
@@ -25,9 +24,11 @@ module PoolParty
25
24
  :default_project_specfile_name => "spec/pool.spec",
26
25
  :port => "80",
27
26
  :forwarding_port => "8080",
28
- :proxy_mode => "http",
27
+ :proxy_mode => "http",
29
28
  # EC2 Options
30
- :ami => "ami-1cd73375"
29
+ :ami => "ami-1cd73375",
30
+ # Options that should not be touched pretty much ever
31
+ :manifest_path => "/etc/puppet/manifests"
31
32
  })
32
33
 
33
34
  # Class methods
@@ -3,8 +3,8 @@ require File.dirname(__FILE__) + "/resource"
3
3
 
4
4
  module PoolParty
5
5
  module Cloud
6
- def cloud(name=:app, &block)
7
- clouds.has_key?(name) ? clouds[name] : (clouds[name] = Cloud.new(name, self, &block))
6
+ def cloud(name=:app, parent=self, &block)
7
+ clouds.has_key?(name) ? clouds[name] : (clouds[name] = Cloud.new(name, parent, &block))
8
8
  end
9
9
 
10
10
  def clouds
@@ -14,7 +14,7 @@ module PoolParty
14
14
  def with_cloud(cl, opts={}, &block)
15
15
  raise CloudNotFoundException.new("Cloud not found") unless cl
16
16
  cl.options.merge!(opts) if opts
17
- cl.instance_eval &block if block
17
+ cl.run_in_context &block if block
18
18
  end
19
19
 
20
20
  class Cloud
@@ -25,8 +25,7 @@ module PoolParty
25
25
  include Configurable
26
26
  include CloudResourcer
27
27
  # extend CloudResourcer
28
- # Net methods
29
- include PoolParty::Remote::RemoterBase
28
+ # Net methods
30
29
  include Remote
31
30
  include PoolParty::CloudDsl
32
31
 
@@ -43,15 +42,17 @@ module PoolParty
43
42
  :polling_time => "30.seconds"
44
43
  })
45
44
 
46
- def initialize(name, parent, &block)
47
- @name = name
45
+ def initialize(name, parent=self, &block)
46
+ @cloud_name = @name = name
48
47
 
48
+ setup_defaults
49
49
  plugin_directory "#{::Dir.pwd}/plugins"
50
50
 
51
- set_parent(parent) if parent
52
- self.instance_eval &block if block
51
+ p = parent if parent.is_a?(PoolParty::Pool::Pool)
52
+ run_setup(p, &block)
53
53
 
54
- setup_defaults
54
+ # set_parent(parent) if parent && !@parent
55
+ # self.run_in_context parent, &block if block
55
56
  end
56
57
 
57
58
  def setup_defaults
@@ -126,7 +127,6 @@ module PoolParty
126
127
  @build_manifest ||= build_from_existing_file
127
128
  unless @build_manifest
128
129
 
129
- # reset_resources!
130
130
  add_poolparty_base_requirements
131
131
 
132
132
  @build_manifest = "class poolparty {\n #{build_short_manifest}\n}"
@@ -177,23 +177,19 @@ module PoolParty
177
177
  # Also note that there is no block associated. This is because we have written
178
178
  # all that is necessary in a method called enable
179
179
  # which is called when there is no block
180
- def add_poolparty_base_requirements
180
+ def add_poolparty_base_requirements
181
181
  heartbeat
182
182
  haproxy
183
183
  ruby
184
- poolparty
185
- end
186
-
187
- def provisioning?
188
- @provisioning_in_progress == true
184
+ poolparty_base_packages
189
185
  end
190
186
 
191
- def provisioning_in_progress
192
- @provisioning_in_progress = true
193
- end
194
-
195
- def provisioning_complete
196
- @provisioning_in_progress = false
187
+ def other_clouds
188
+ returning Array.new do |arr|
189
+ clouds.each do |name, cl|
190
+ arr << cl if name != self.name
191
+ end
192
+ end
197
193
  end
198
194
 
199
195
  def reset!
@@ -7,43 +7,19 @@ module PoolParty
7
7
  include CloudResourcer
8
8
  include Resources
9
9
 
10
- attr_accessor :parent
11
10
  class_inheritable_accessor :name
12
11
 
13
12
  default_options({})
14
13
 
15
- def initialize(parent=self, opts={}, &block)
16
- set_parent(parent)
17
- block ? instance_eval(&block) : enable
14
+ def initialize(p=self, opts={}, &block)
15
+ run_setup(p, &block)
16
+ enable unless block
18
17
  end
19
18
 
20
19
  # Overwrite this method
21
20
  def enable
22
21
  end
23
22
 
24
- # Call the cloud from within the plugin
25
- def cloud
26
- @p = parent
27
- while !@p.is_a?(PoolParty::Cloud)
28
- @p = @p.parent
29
- end
30
- @p
31
- end
32
-
33
- # def method_missing(m, *args, &block)
34
- # if block_given?
35
- # (args[0].class == self.class) ? args[0].instance_eval(&block) : super
36
- # elsif parent && parent.respond_to?(m)
37
- # parent.send m, *args, &block
38
- # else
39
- # get_from_options(m, *args)
40
- # end
41
- # end
42
- #
43
- # def get_from_options(m, *args)
44
- # args.empty? ? options[m] : options[m] = args[0]
45
- # end
46
-
47
23
  end
48
24
 
49
25
  end
@@ -14,28 +14,26 @@ module PoolParty
14
14
 
15
15
  class PluginModel
16
16
  attr_accessor :name, :klass
17
- attr_reader :parent
18
17
  include MethodMissingSugar
19
18
  include Configurable
20
19
  include PrettyPrinter
21
20
 
22
21
  def initialize(name,cld,&block)
23
22
  @name = name
24
- @parent = cld
23
+ # @parent = cld
25
24
  class_string_name = "#{name}"
26
25
 
27
26
  # Create the class to evaluate the plugin on the implemented call
28
27
  klass = class_string_name.class_constant(PoolParty::Plugin::Plugin)
29
- klass.extend PoolParty::Resources
30
- klass.send :include, PoolParty::Resources
31
-
32
- # Create the block inside the instantiated plugin
33
- klass.module_eval &block if block
28
+ mod = class_string_name.module_constant(&block)
29
+
30
+ # klass.extend PoolParty::Resources
31
+ klass.send :include, mod
34
32
 
35
33
  # Store the name of the class for pretty printing later
36
34
  klass.name = name
37
35
  # Add the plugin definition to the cloud as an instance method
38
- Cloud::Cloud.module_eval <<-EOE
36
+ Cloud::Cloud.class_eval <<-EOE
39
37
  def #{name}(parent=self, &block)
40
38
  @#{class_string_name.downcase} ||= #{class_string_name.class_constant}.new(parent, &block)
41
39
  end
@@ -9,9 +9,10 @@ module PoolParty
9
9
  $pools ||= {}
10
10
  end
11
11
 
12
- def with_pool(pool, opts={}, &block)
13
- pool.options.merge!(opts)
14
- pool.instance_eval &block if block
12
+ def with_pool(pl, opts={}, &block)
13
+ raise CloudNotFoundException.new("Pool not found") unless pl
14
+ pl.options.merge!(opts) if pl.options
15
+ pl.run_in_context &block if block
15
16
  end
16
17
 
17
18
  def reset!
@@ -37,7 +38,8 @@ module PoolParty
37
38
  setup_defaults
38
39
 
39
40
  @name = name
40
- instance_eval &block if block
41
+ # run_in_context &block if block
42
+ run_setup(self, &block)
41
43
  end
42
44
 
43
45
  def setup_defaults
@@ -47,6 +49,15 @@ module PoolParty
47
49
  # This is where the entire process starts
48
50
  def inflate
49
51
  end
52
+
53
+ def pool_clouds
54
+ @pool_clouds ||= returning Array.new do |arr|
55
+ clouds.each do |name, cl|
56
+ arr << cl if cl.parent.name == self.name
57
+ end
58
+ end
59
+ end
60
+
50
61
  end
51
62
 
52
63
  # Helpers