auser-poolparty 0.2.80 → 0.2.81

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.
data/Manifest.txt CHANGED
@@ -262,6 +262,7 @@ lib/poolparty/poolparty/resources/symlink.rb
262
262
  lib/poolparty/poolparty/resources/variable.rb
263
263
  lib/poolparty/poolparty/script.rb
264
264
  lib/poolparty/provisioners/provisioner_base.rb
265
+ lib/poolparty/provisioners/provisioners/become_master.rb
265
266
  lib/poolparty/provisioners/provisioners/master.rb
266
267
  lib/poolparty/provisioners/provisioners/slave.rb
267
268
  lib/poolparty/spec/core/string.rb
data/PostInstall.txt CHANGED
@@ -1,4 +1,4 @@
1
- Get ready to jump in the pool, you just installed PoolParty! (Updated at 15:39 12/09/08)
1
+ Get ready to jump in the pool, you just installed PoolParty! (Updated at 13:44 12/10/08)
2
2
 
3
3
  To get started, run the generator:
4
4
 
@@ -1,5 +1,5 @@
1
1
  Description:
2
- Create a basic pool.spec template
2
+ Create a basic pool template
3
3
 
4
4
  Usage:
5
- pool spec [name]
5
+ pool generate [name]
@@ -21,7 +21,7 @@ class PoolspecGenerator < RubiGen::Base
21
21
  m.directory ''
22
22
  BASEDIRS.each { |path| m.directory path }
23
23
 
24
- m.template "pool_spec_template.erb", "pool.spec"
24
+ m.template "pool_spec_template.erb", "#{@name}.pool"
25
25
  # Create stubs
26
26
  # m.template "template.rb", "some_file_after_erb.rb"
27
27
  # m.template_copy_each ["template.rb", "template2.rb"]
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 resolv ruby2ruby digest/sha2).each do |lib|
5
+ %w(activesupport ftools logging resolv ruby2ruby digest/sha2 open3).each do |lib|
6
6
  begin
7
7
  require lib
8
8
  rescue Exception => e
@@ -5,7 +5,7 @@ module PoolParty
5
5
  def load_pool(filename)
6
6
 
7
7
  unless filename && ::File.readable?(filename)
8
- puts "Please specify your cloud with -s, move it to ./pool.spec or in your POOL_SPEC environment variable"
8
+ puts "Please specify your cloud with -s, move it to ./clouds.pool or in your POOL_SPEC environment variable"
9
9
  exit(1)
10
10
  else
11
11
  $pool_specfile = filename
@@ -10,7 +10,6 @@ module PoolParty
10
10
  include Configurable
11
11
  include MethodMissingSugar
12
12
 
13
-
14
13
  def initialize(args=[], opts={}, &block)
15
14
  boolean_args << opts[:boolean_args] if opts.has_key?(:boolean_args)
16
15
 
@@ -109,7 +108,7 @@ module PoolParty
109
108
  self.loaded_pools extract_pool_from_options(self)
110
109
 
111
110
  reject_junk_options!
112
- 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?
111
+ raise CloudNotFoundException.new("Please specify your cloud with -s, move it to ./clouds.pool or in your POOL_SPEC environment variable") unless loaded_clouds && !loaded_clouds.empty?
113
112
  loaded_pools.each do |pl|
114
113
  pl.configure(self.options)
115
114
  end
@@ -36,7 +36,6 @@ 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
39
  def full_keypair_path
41
40
  unless keypair_path
42
41
  raise RuntimeException.new("Keypair cannot be found")
@@ -1,3 +1,5 @@
1
+ #TODO: rdoc: this defines methods on poolparty objects from a passed hash of options.
2
+ # For example, this is how instance.minimum_runtime is set. See base.rb line 12 for example of default options that are added as methods in this way.
1
3
  module PoolParty
2
4
  module Configurable
3
5
  module ClassMethods
@@ -4,8 +4,8 @@ module PoolParty
4
4
  class CpuMonitor < BaseMonitor
5
5
 
6
6
  def run
7
- str = %x[uptime]
8
- str.split(/\s+/)[-1].to_f rescue 0.0
7
+ stdin, stdout, stderr = Open3.popen3('uptime')
8
+ stdout.split(/\s+/)[-1].to_f rescue 0.0
9
9
  end
10
10
 
11
11
  end
@@ -10,15 +10,19 @@ module PoolParty
10
10
 
11
11
  def initialize(opts, parent=self)
12
12
  run_setup(parent)
13
-
13
+
14
14
  set_vars_from_options(parent.options) if parent && parent.respond_to?(:options)
15
15
  set_vars_from_options(opts) unless opts.nil? || opts.empty?
16
16
 
17
17
  on_init
18
18
  end
19
19
 
20
+ def elapsed_runtime
21
+ Time.now.to_i - launching_time.to_time.to_i
22
+ end
23
+
20
24
  # Callback
21
- def on_init
25
+ def on_init
22
26
  end
23
27
 
24
28
  # Is this remote instance the master?
@@ -221,6 +221,12 @@ module PoolParty
221
221
  end
222
222
  end
223
223
  end
224
+ def list_of_nodes_exceeding_minimum_runtime
225
+ list_of_running_instances.reject{|i| i.elapsed_runtime < minimum_runtime}
226
+ end
227
+ def are_any_nodes_exceeding_minimum_runtime?
228
+ !list_of_nodes_exceeding_minimum_runtime.blank?
229
+ end
224
230
  def is_master_running?
225
231
  !list_of_running_instances.select {|a| a.name == "master"}.first.nil?
226
232
  end
@@ -233,7 +239,8 @@ module PoolParty
233
239
  end
234
240
  # Stub method for the time being to handle the contraction of the cloud
235
241
  def should_contract_cloud?(force=false)
236
- (are_too_many_instances_running? || are_contraction_rules_valid?) || force || false
242
+ return true if force
243
+ ((are_any_nodes_exceeding_minimum_runtime? and are_too_many_instances_running?) || are_contraction_rules_valid?) || false
237
244
  end
238
245
  def are_contraction_rules_valid?
239
246
  valid_rules?(:contract_when)
@@ -20,12 +20,13 @@ module PoolParty
20
20
  :template_directory => "templates",
21
21
  :template_path => "/var/lib/puppet/templates",
22
22
  :module_path => "/etc/puppet/modules/poolparty",
23
- :default_specfile_name => "pool.spec",
24
- :default_project_specfile_name => "spec/pool.spec",
23
+ :default_specfile_name => "clouds.pool",
24
+ :default_project_specfile_name => "spec/clouds.pool",
25
25
  :port => "80",
26
26
  :forwarding_port => "8080",
27
27
  :proxy_mode => "http",
28
28
  :messenger_client_port => 7050,
29
+ :minimum_runtime => 3000, #50.minutes in seconds
29
30
  # EC2 Options
30
31
  :ami => "ami-1cd73375",
31
32
  :size => 'm1.small', # must be 'm1.small', 'm1.large', 'm1.xlarge', 'c1.medium', or 'c1.xlarge'
@@ -38,6 +38,7 @@ module PoolParty
38
38
  :secret_access_key => Base.secret_access_key,
39
39
  :ec2_dir => ENV["EC2_HOME"],
40
40
  :keypair => (ENV["KEYPAIR_NAME"].nil? || ENV["KEYPAIR_NAME"].empty?) ? nil : ENV["KEYPAIR_NAME"],
41
+ :minimum_runtime => Base.minimum_runtime,
41
42
  :ami => 'ami-44bd592d'
42
43
  })
43
44
 
@@ -144,7 +145,7 @@ module PoolParty
144
145
  end
145
146
 
146
147
  def copy_misc_templates
147
- ["namespaceauth.conf"].each do |f|
148
+ ["namespaceauth.conf", "puppet.conf"].each do |f|
148
149
  copy_file_to_storage_directory(::File.join(::File.dirname(__FILE__), "..", "templates", f))
149
150
  end
150
151
  end
@@ -40,6 +40,10 @@ module PoolParty
40
40
  Provisioner::Slave.new(instance, cloud).process_configure!(testing)
41
41
  end
42
42
 
43
+ def self.become_master(cloud, testing=false)
44
+ Provisioner::BecomeMaster.new(cloud).process_install!(testing)
45
+ end
46
+
43
47
  def self.process_clean_reconfigure_for!(instance, cloud, testing=false)
44
48
  Provisioner::Master.new(cloud).process_clean_reconfigure_for!(instance, testing)
45
49
  end
@@ -154,7 +158,7 @@ module PoolParty
154
158
  s << "puppetca --clean #{instance.name}.compute-1.internal 2>&1 > /dev/null;"
155
159
  s << "puppetca --clean #{instance.name}.ec2.internal 2>&1 > /dev/null"
156
160
  end
157
- @cloud.run_command_on(str, @cloud.master)
161
+ # @cloud.run_command_on(str, @cloud.master)
158
162
  end
159
163
  end
160
164
  def clear_master_ssl_certs
@@ -0,0 +1,166 @@
1
+ module PoolParty
2
+ module Provisioner
3
+ class BecomeMaster < ProvisionerBase
4
+
5
+ def initialize(cl=self, os=:ubuntu)
6
+ raise MasterException.new(:no_ip) unless cl.master && cl.master.ip
7
+ super(cl.master, cl, os)
8
+ @master_ip = cl.master.ip
9
+ end
10
+
11
+ def valid?
12
+ !(@cloud.nil? || @cloud.master.nil?)
13
+ end
14
+
15
+ def error
16
+ raise RemoteException.new(:could_not_install, "Your cloud does not have a master")
17
+ end
18
+
19
+ def first_install_tasks
20
+ [
21
+ create_local_hosts_entry
22
+ ]
23
+ end
24
+
25
+ def install_tasks
26
+ [
27
+ setup_basic_structure,
28
+ setup_configs,
29
+ setup_fileserver,
30
+ setup_autosigning,
31
+ restart_puppetmaster,
32
+ run_first_time,
33
+ create_local_node,
34
+ ] << configure_tasks
35
+ end
36
+
37
+ def configure_tasks
38
+ [
39
+ create_local_node,
40
+ move_templates,
41
+ setup_poolparty,
42
+ create_poolparty_manifest,
43
+ restart_puppetd
44
+ ]
45
+ end
46
+
47
+ # If the master is not in the hosts file, then add it to the hosts file
48
+ def create_local_hosts_entry
49
+ <<-EOS
50
+ echo "Creating local host entry"
51
+ if [ -z \"$(grep -v '#' /etc/hosts | grep 'puppet')" ]; then echo '#{@master_ip} master puppet localhost' >> /etc/hosts; fi
52
+ hostname master
53
+ EOS
54
+ end
55
+
56
+ def setup_basic_structure
57
+ <<-EOS
58
+ echo "Creating basic structure for poolparty"
59
+ mkdir -p /etc/puppet/manifests/nodes
60
+ mkdir -p /etc/puppet/manifests/classes
61
+ echo "import 'nodes/*.pp'" > /etc/puppet/manifests/site.pp
62
+ echo "import 'classes/*.pp'" >> /etc/puppet/manifests/site.pp
63
+ cp #{Base.remote_storage_path}/namespaceauth.conf /etc/puppet/namespaceauth.conf
64
+ EOS
65
+ end
66
+
67
+ def setup_configs
68
+ <<-EOS
69
+ echo "Setting up configuration"
70
+ cp #{Base.remote_storage_path}/puppet.conf /etc/puppet/puppet.conf
71
+ EOS
72
+ end
73
+
74
+ def setup_fileserver
75
+ <<-EOS
76
+ echo "Setting up the master fileserver"
77
+ echo "
78
+ [files]
79
+ path #{Base.remote_storage_path}
80
+ allow *" > /etc/puppet/fileserver.conf
81
+ mkdir -p /var/poolparty/facts
82
+ mkdir -p /var/poolparty/files
83
+ mkdir -p /etc/poolparty
84
+ EOS
85
+ end
86
+ # Change this eventually for better security supportsetup_fileserver
87
+ def setup_autosigning
88
+ <<-EOS
89
+ echo "Creating accessibility for the nodes"
90
+ echo "*" > /etc/puppet/autosign.conf
91
+ EOS
92
+ end
93
+
94
+ def setup_poolparty
95
+ <<-EOS
96
+ echo "Setting the poolparty configuration"
97
+ cp #{Base.remote_storage_path}/#{Base.key_file_locations.first} "#{Base.base_config_directory}/.ppkeys"
98
+ mv #{Base.remote_storage_path}/#{Base.default_specfile_name} #{Base.base_config_directory}/
99
+ EOS
100
+ end
101
+
102
+ def copy_ssh_app
103
+ "cp #{Base.remote_storage_path}/#{@cloud.full_keypair_name} #{@cloud.remote_keypair_path}" if @cloud.remote_keypair_path != "#{Base.remote_storage_path}/#{@cloud.full_keypair_name}"
104
+ end
105
+
106
+ # /etc/init.d/puppetmaster stop; rm -rf /etc/puppet/ssl; /etc/init.d/puppetmaster start
107
+ # ps aux | grep puppetmaster | grep -v grep | awk '{print $2}' | xargs kill;
108
+ def restart_puppetmaster
109
+ <<-EOS
110
+ echo "(Re)starting poolparty"
111
+ . /etc/profile
112
+ /etc/init.d/puppetmaster stop;rm -rf /etc/poolparty/ssl;puppetmasterd --verbose;/etc/init.d/puppetmaster start
113
+ EOS
114
+ end
115
+
116
+ def run_first_time
117
+ <<-EOE
118
+ echo "Running first time run"
119
+ cp #{Base.remote_storage_path}/#{Base.template_directory}/puppetrunner /usr/bin/puppetrunner
120
+ chmod +x /usr/bin/puppetrunner
121
+ EOE
122
+ end
123
+
124
+ # TODO:
125
+ # Consider this method in the manifest
126
+ def create_local_node
127
+ str = <<-EOS
128
+ node default {
129
+ include poolparty
130
+ }
131
+ EOS
132
+ @cloud.list_of_running_instances.each do |ri|
133
+ str << <<-EOS
134
+ node "#{ri.name}" inherits default {}
135
+ EOS
136
+ end
137
+ "echo '#{str}' > #{Base.manifest_path}/nodes/nodes.pp"
138
+ end
139
+
140
+ def move_templates
141
+ <<-EOS
142
+ echo "Moving templates into place"
143
+ mkdir -p #{Base.template_path}
144
+ cp -R #{Base.remote_storage_path}/#{Base.template_directory}/* #{Base.template_path}
145
+ EOS
146
+ end
147
+
148
+ def create_poolparty_manifest
149
+ <<-EOS
150
+ echo "Creating the manifest"
151
+ cp #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes/poolparty.pp
152
+ #{copy_ssh_app}
153
+ EOS
154
+ end
155
+
156
+ def restart_puppetd
157
+ # /usr/bin/puppetrerun
158
+ # /usr/bin/puppetcleaner master
159
+ <<-EOS
160
+ echo "Running puppet manifest"
161
+ /usr/bin/puppetrerun
162
+ EOS
163
+ end
164
+ end
165
+ end
166
+ end
@@ -49,7 +49,7 @@ module PoolParty
49
49
  def create_local_hosts_entry
50
50
  <<-EOS
51
51
  echo "Creating local host entry"
52
- if [ -z \"$(grep -v '#' /etc/hosts | grep 'puppet')" ]; then echo '#{@master_ip} puppet master localhost' >> /etc/hosts; fi
52
+ if [ -z \"$(grep -v '#' /etc/hosts | grep 'puppet')" ]; then echo '#{@master_ip} master puppet localhost' >> /etc/hosts; fi
53
53
  hostname master
54
54
  EOS
55
55
  end
data/poolparty.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poolparty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.80
4
+ version: 0.2.81
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ari Lerner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-09 00:00:00 -08:00
12
+ date: 2008-12-10 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -375,6 +375,7 @@ files:
375
375
  - lib/poolparty/poolparty/resources/variable.rb
376
376
  - lib/poolparty/poolparty/script.rb
377
377
  - lib/poolparty/provisioners/provisioner_base.rb
378
+ - lib/poolparty/provisioners/provisioners/become_master.rb
378
379
  - lib/poolparty/provisioners/provisioners/master.rb
379
380
  - lib/poolparty/provisioners/provisioners/slave.rb
380
381
  - lib/poolparty/spec/core/string.rb
@@ -520,7 +521,7 @@ files:
520
521
  has_rdoc: true
521
522
  homepage: http://poolparty.rubyforge.org
522
523
  post_install_message: |-
523
- Get ready to jump in the pool, you just installed PoolParty! (Updated at 15:39 12/09/08)
524
+ Get ready to jump in the pool, you just installed PoolParty! (Updated at 13:44 12/10/08)
524
525
 
525
526
  To get started, run the generator:
526
527
 
@@ -17,7 +17,7 @@ describe "Binary" do
17
17
  describe "get_existing_spec_location" do
18
18
  before(:each) do
19
19
  ::File.stub!(:readable?).and_return false
20
- ::File.stub!(:readable?).with("#{Base.storage_directory}/pool.spec").and_return true
20
+ ::File.stub!(:readable?).with("#{Base.storage_directory}/clouds.pool").and_return true
21
21
  end
22
22
  it "should be a String" do
23
23
  Binary.get_existing_spec_location.class.should == String
@@ -8,12 +8,12 @@ describe "Master provisioner" do
8
8
  stub_list_from_remote_for(@cloud)
9
9
  @remote_instance = PoolParty::Remote::RemoteInstance.new({:ip => "192.168.0.1", :status => "running", :name => "master"}, @cloud)
10
10
 
11
- @cloud.stub!(:master).and_return @ris.first
11
+ @cloud.stub!(:master).and_return sample_instances.first
12
12
  @master = Master.new(@cloud, :ubuntu)
13
13
  end
14
14
  describe "install_tasks" do
15
15
  before(:each) do
16
- @cloud.stub!(:master).and_return @ris.first
16
+ @cloud.stub!(:master).and_return sample_instances.first
17
17
  @master.stub!(:cloud).and_return @cloud
18
18
  end
19
19
  it "should call install_puppet_master" do
@@ -9,7 +9,7 @@ describe "Slave provisioner" do
9
9
  @remote_instance = PoolParty::Remote::RemoteInstance.new({:ip => "192.168.0.1", :status => "running", :name => "master"}, @cloud)
10
10
  stub_list_from_remote_for(@cloud)
11
11
 
12
- @cloud.stub!(:master).and_return @ris.first
12
+ @cloud.stub!(:master).and_return sample_instances.first
13
13
 
14
14
  @slave = Slave.new(@remote_instance, @cloud, :ubuntu)
15
15
  end
@@ -2,7 +2,11 @@ require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  class ResourcerTestClass
4
4
  include CloudResourcer
5
- include Configurable
5
+ include Configurable
6
+
7
+ default_options({
8
+ :minimum_runtime => 50.minutes
9
+ })
6
10
 
7
11
  def initialize(&block)
8
12
  store_block(&block) if block
@@ -40,10 +44,18 @@ describe "CloudResourcer" do
40
44
  @tc.minimum_instances.should == 1
41
45
  @tc.maximum_instances.should == 1
42
46
  end
43
- it "should set the max to the maximum instances to the last" do
47
+ it "should set the max to the maximum instances to the last in a given range" do
44
48
  @tc.instances 4..10
45
49
  @tc.maximum_instances.should == 10
46
50
  end
51
+ it "should have default minimum_runtime of 50 minutes (3000 seconds)" do
52
+ Base.stub!(:minimum_runtime).and_return 50.minutes
53
+ @tc.minimum_runtime.should == 50.minutes
54
+ end
55
+ it "should have minimum_runtime" do
56
+ @tc.minimum_runtime 40.minutes
57
+ @tc.minimum_runtime.should == 40.minutes
58
+ end
47
59
  describe "keypair_path" do
48
60
  before(:each) do
49
61
  end
@@ -1,6 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  include Remote
4
+ include Aska
4
5
 
5
6
  describe "Remote Instance" do
6
7
  before(:each) do
@@ -58,6 +59,10 @@ describe "Remote Instance" do
58
59
  before(:each) do
59
60
  @ri = RemoteInstance.new(@valid_hash, nil)
60
61
  end
62
+ it "should give the elapsed time" do
63
+ @ri.stub!(:launching_time).and_return(30.minutes.ago)
64
+ @ri.elapsed_runtime.should be >= 1800
65
+ end
61
66
  it "should be say that it is the master if the name is master" do
62
67
  @ri.name.should == "master"
63
68
  @ri.master?.should == true
@@ -101,6 +101,8 @@ describe "Remote" do
101
101
  end
102
102
  it "should be true if there are" do
103
103
  add_stub_instance_to(@tc, 8)
104
+ add_stub_instance_to(@tc, 9)
105
+ add_stub_instance_to(@tc, 10)
104
106
  @tc.minimum_number_of_instances_are_running?.should == true
105
107
  end
106
108
  end
@@ -239,9 +241,10 @@ describe "Remote" do
239
241
  describe "contract_cloud_if_necessary" do
240
242
  before(:each) do
241
243
  @tc.stub!(:request_termination_of_non_master_instance).and_return true
242
- @tc.stub!(:can_shutdown_an_instance?).and_return true
244
+ @tc.stub!(:are_any_nodes_exceeding_minimum_runtime?).and_return true
243
245
  @tc.stub!(:wait).and_return true
244
246
  @tc.stub!(:valid_rules?).and_return false
247
+ @tc.stub!(:can_shutdown_an_instance?).and_return true
245
248
  end
246
249
  it "should receive can_shutdown_an_instance?" do
247
250
  @tc.should_receive(:can_shutdown_an_instance?).once
@@ -250,7 +253,7 @@ describe "Remote" do
250
253
  @tc.should_receive(:should_contract_cloud?).once.and_return false
251
254
  end
252
255
  it "should call request_termination_of_non_master_instance if we should_contract_cloud?" do
253
- @tc.should_receive(:should_contract_cloud?).once.and_return true
256
+ @tc.stub!(:should_contract_cloud?).and_return true
254
257
  @tc.should_receive(:request_termination_of_non_master_instance).once.and_return true
255
258
  end
256
259
  after(:each) do
@@ -81,6 +81,23 @@ describe "Remoter" do
81
81
  @tc = TestClass.new
82
82
  stub_list_from_remote_for @tc # sets the list of instances to 2
83
83
  end
84
+ describe "list_of_nodes_exceeding_minimum_runtime" do
85
+ before(:each) do
86
+ @tc.stub!(:minimum_runtime).and_return 3000
87
+ end
88
+ it "should not be empty" do
89
+ @tc.list_of_running_instances.size.should == 2
90
+ @tc.list_of_running_instances.first.elapsed_runtime.should be > 3000
91
+ @tc.list_of_nodes_exceeding_minimum_runtime.size.should be > 0
92
+ end
93
+ it "should return a RemoteInstance" do
94
+ @tc.list_of_nodes_exceeding_minimum_runtime.first.should be_instance_of(PoolParty::Remote::RemoteInstance)
95
+ end
96
+ it "are_any_nodes_exceeding_minimum_runtime? should be true" do
97
+ @tc.are_any_nodes_exceeding_minimum_runtime?.should == true
98
+ end
99
+ end
100
+
84
101
  describe "are_too_few_instances_running?" do
85
102
  it "should be false if the number of running instances is larger than the minimum instances" do
86
103
  @tc.stub!(:minimum_instances).and_return 1
@@ -18,6 +18,8 @@ extend PoolParty
18
18
 
19
19
  def are_too_many_instances_running?
20
20
  end
21
+ def are_any_nodes_exceeding_minimum_runtime?
22
+ end
21
23
  def are_too_few_instances_running?
22
24
  end
23
25
 
@@ -67,7 +69,16 @@ def read_file(path)
67
69
  require "open-uri"
68
70
  open(path).read
69
71
  end
72
+ def sample_instances_list
73
+ @sample_instances_lister ||= [
74
+ {:ip => "127.0.0.1", :name => "master", :launching_time => 2.days.ago},
75
+ {:ip => "127.0.0.2", :name => "node1", :launching_time => 2.days.ago}
76
+ ]
77
+ end
70
78
 
79
+ def sample_instances
80
+ sample_instances_list.map {|h| PoolParty::Remote::RemoteInstance.new(h) }
81
+ end
71
82
  def stub_list_from_local_for(o)
72
83
  @list =<<-EOS
73
84
  master 192.168.0.1
@@ -77,22 +88,21 @@ def stub_list_from_local_for(o)
77
88
  @file.stub!(:read).and_return @list
78
89
  o.stub!(:get_working_listing_file).and_return @file
79
90
  o.stub!(:open).and_return @file
80
-
91
+
81
92
  @ris = @list.split(/\n/).map {|line| PoolParty::Remote::RemoteInstance.new(line) }
82
93
  end
83
94
  def stub_remoter_for(o)
84
- o.stub!(:ec2).and_return EC2::Base.new( :access_key_id => "not a key", :secret_access_key => "even more not a key")
95
+ o.stub!(:ec2).and_return EC2::Base.new( :access_key_id => "not a key", :secret_access_key => "even more not a key")
96
+ o.stub!(:list_of_running_instances).and_return sample_instances
85
97
  end
86
98
  def stub_list_from_remote_for(o, launch_stub=true)
87
99
  stub_remoter_for(o)
88
- @sample_instances_list = [{:ip => "127.0.0.1", :name => "master"}, {:ip => "127.0.0.2", :name => "node1"}]
89
- @ris = @sample_instances_list.map {|h| PoolParty::Remote::RemoteInstance.new(h) }
90
100
  o.stub!(:access_key).and_return "NOT A KEY"
91
101
  o.stub!(:secret_access_key).and_return "NOT A SECRET"
92
102
  # o.stub!(:list_from_remote).and_return ris
93
103
  # o.stub!(:remote_instances_list).once.and_return ris
94
104
  # o.stub!(:master).and_return @ris[0]
95
- o.stub!(:launch_new_instance!).and_return @ris.first if launch_stub
105
+ o.stub!(:launch_new_instance!).and_return sample_instances.first if launch_stub
96
106
  stub_list_of_instances_for(o)
97
107
  end
98
108
 
@@ -125,7 +135,9 @@ end
125
135
  def add_stub_instance_to(o, num, status="running")
126
136
  reset_response!
127
137
  response_list_of_instances << stub_instance(num, status)
138
+ sample_instances_list << stub_instance(num, status)
128
139
  stub_list_of_instances_for o
140
+ stub_remoter_for(o)
129
141
  end
130
142
  def ris
131
143
  @ris ||= response_list_of_instances.collect {|h| PoolParty::Remote::RemoteInstance.new(h) }
data/website/index.html CHANGED
@@ -34,7 +34,7 @@
34
34
  <h1>PoolParty</h1>
35
35
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/poolparty"; return false'>
36
36
  <p>Get Version</p>
37
- <a href="http://rubyforge.org/projects/poolparty" class="numbers">0.2.80</a>
37
+ <a href="http://rubyforge.org/projects/poolparty" class="numbers">0.2.81</a>
38
38
  </div>
39
39
  <h1>&#8216;Easy cloud computing&#8217;</h1>
40
40
  <h2>What</h2>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auser-poolparty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.80
4
+ version: 0.2.81
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ari Lerner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-09 00:00:00 -08:00
12
+ date: 2008-12-10 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -375,6 +375,7 @@ files:
375
375
  - lib/poolparty/poolparty/resources/variable.rb
376
376
  - lib/poolparty/poolparty/script.rb
377
377
  - lib/poolparty/provisioners/provisioner_base.rb
378
+ - lib/poolparty/provisioners/provisioners/become_master.rb
378
379
  - lib/poolparty/provisioners/provisioners/master.rb
379
380
  - lib/poolparty/provisioners/provisioners/slave.rb
380
381
  - lib/poolparty/spec/core/string.rb
@@ -520,7 +521,7 @@ files:
520
521
  has_rdoc: true
521
522
  homepage: http://poolparty.rubyforge.org
522
523
  post_install_message: |-
523
- Get ready to jump in the pool, you just installed PoolParty! (Updated at 15:39 12/09/08)
524
+ Get ready to jump in the pool, you just installed PoolParty! (Updated at 13:44 12/10/08)
524
525
 
525
526
  To get started, run the generator:
526
527