auser-poolparty 0.2.58 → 0.2.59

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/Manifest.txt +1 -0
  2. data/lib/poolparty/base_packages/poolparty.rb +8 -3
  3. data/lib/poolparty/core/string.rb +3 -0
  4. data/lib/poolparty/helpers/provisioner_base.rb +4 -2
  5. data/lib/poolparty/helpers/provisioners/master.rb +33 -14
  6. data/lib/poolparty/helpers/provisioners/slave.rb +8 -2
  7. data/lib/poolparty/modules/cloud_dsl.rb +1 -1
  8. data/lib/poolparty/modules/cloud_resourcer.rb +5 -0
  9. data/lib/poolparty/modules/file_writer.rb +3 -2
  10. data/lib/poolparty/monitors/base_monitor.rb +2 -1
  11. data/lib/poolparty/net/remote_bases/ec2.rb +5 -4
  12. data/lib/poolparty/net/remote_instance.rb +3 -3
  13. data/lib/poolparty/net/remoter.rb +9 -0
  14. data/lib/poolparty/net/remoter_base.rb +14 -4
  15. data/lib/poolparty/plugins/deploydirectory.rb +18 -9
  16. data/lib/poolparty/plugins/line.rb +2 -1
  17. data/lib/poolparty/plugins/rsyncmirror.rb +3 -6
  18. data/lib/poolparty/pool/cloud.rb +9 -2
  19. data/lib/poolparty/pool/pool.rb +4 -3
  20. data/lib/poolparty/pool/resource.rb +9 -1
  21. data/lib/poolparty/pool/resources/conditional.rb +13 -7
  22. data/lib/poolparty/templates/haproxy.conf +1 -1
  23. data/lib/poolparty/templates/puppetrerun +16 -1
  24. data/lib/poolparty/templates/puppetrunner +15 -0
  25. data/lib/poolparty/version.rb +1 -1
  26. data/poolparty.gemspec +3 -2
  27. data/spec/poolparty/helpers/provisioners/master_spec.rb +1 -1
  28. data/spec/poolparty/net/remote_instance_spec.rb +1 -1
  29. data/spec/poolparty/net/remoter_base_spec.rb +1 -1
  30. data/spec/poolparty/plugins/deploydirectory_spec.rb +8 -1
  31. data/spec/poolparty/pool/cloud_spec.rb +1 -1
  32. data/spec/poolparty/pool/pool_spec.rb +1 -1
  33. data/spec/poolparty/pool/resources/conditional_spec.rb +13 -1
  34. metadata +3 -2
@@ -273,6 +273,7 @@ lib/poolparty/templates/poolparty.monitor
273
273
  lib/poolparty/templates/puppet.conf
274
274
  lib/poolparty/templates/puppetcleaner
275
275
  lib/poolparty/templates/puppetrerun
276
+ lib/poolparty/templates/puppetrunner
276
277
  lib/poolparty/templates/yaws.conf
277
278
  lib/poolparty/version.rb
278
279
  lib/poolpartycl.rb
@@ -6,9 +6,10 @@ module PoolParty
6
6
  # Build hostsfile
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
- has_host({:name => "gen_#{ri.name}", :ip => ri.ip, :alias => "#{ri.name}" })
9
+ has_host({:name => "#{ri.name}", :ip => ri.ip})
10
10
  end
11
- has_host({:alias => "$hostname", :name => "$hostname", :ip => "localhost"})
11
+
12
+ # has_host({:name => "$hostname", :ip => "127.0.0.1", :alias => "localhost"})
12
13
 
13
14
  has_package(:name => "erlang")
14
15
  has_package(:name => "erlang-dev")
@@ -50,7 +51,7 @@ module PoolParty
50
51
  # execute_on_node do
51
52
  has_cron(:name => "puppetd runner", :user => Base.user, :minute => "*/5") do
52
53
  requires get_gempackage("poolparty")
53
- command(PoolParty::Remote::RemoteInstance.puppet_rerun_commad)
54
+ command "/usr/bin/puppetrun"
54
55
  end
55
56
  # end
56
57
 
@@ -97,6 +98,10 @@ module PoolParty
97
98
  mode 744
98
99
  template File.join(File.dirname(__FILE__), "..", "templates/puppetrerun")
99
100
  end
101
+ has_remotefile(:name => "/usr/bin/puppetrunner") do
102
+ mode 744
103
+ template File.join(File.dirname(__FILE__), "..", "templates/puppetrunner")
104
+ end
100
105
 
101
106
  # has_host(:name => "puppet", :ip => (self.respond_to?(:master) ? self : parent).master.ip)
102
107
  end
@@ -30,6 +30,9 @@ class String
30
30
  def dir_safe
31
31
  self.downcase.gsub(/[ ]/, '_')
32
32
  end
33
+ def safe_quote
34
+ self.gsub(/[']/, '\\\\\'')
35
+ end
33
36
  def nice_runnable(quite=true)
34
37
  self.split(/ && /).join("\n")
35
38
  end
@@ -275,7 +275,10 @@ module PoolParty
275
275
  end
276
276
 
277
277
  def fix_rubygems
278
- "echo '#{open(::File.join(template_directory, "gem")).read}' > /usr/bin/gem"
278
+ <<-EOE
279
+ #{installer_for("ruby rubygems")}
280
+ echo '#{open(::File.join(template_directory, "gem")).read}' > /usr/bin/gem
281
+ EOE
279
282
  end
280
283
 
281
284
  def create_local_node
@@ -306,7 +309,6 @@ aptitude update -y #{unix_hide_string} <<heredoc
306
309
  Y
307
310
 
308
311
  heredoc
309
- aptitude autoclean #{unix_hide_string}
310
312
  fi
311
313
  "
312
314
  else
@@ -25,9 +25,9 @@ module PoolParty
25
25
  setup_autosigning,
26
26
  install_poolparty,
27
27
  setup_poolparty,
28
- start_puppetmaster,
29
- restart_puppetd,
30
- clean_master_certs
28
+ create_local_node,
29
+ run_first_time,
30
+ restart_puppetmaster
31
31
  ] << configure_tasks
32
32
  end
33
33
 
@@ -43,12 +43,14 @@ module PoolParty
43
43
  # If the master is not in the hosts file, then add it to the hosts file
44
44
  def create_local_hosts_entry
45
45
  <<-EOS
46
- if [ -z \"$(grep -v '#' /etc/hosts | grep 'puppet')" ]; then echo '#{@master_ip} puppet master' >> /etc/hosts; fi
46
+ echo "Creating local host entry"
47
+ if [ -z \"$(grep -v '#' /etc/hosts | grep 'puppet')" ]; then echo '#{@master_ip} puppet master localhost' >> /etc/hosts; fi
47
48
  EOS
48
49
  end
49
50
 
50
51
  def setup_basic_structure
51
52
  <<-EOS
53
+ echo "Creating basic structure for poolparty"
52
54
  mkdir -p /etc/puppet/manifests/nodes
53
55
  mkdir -p /etc/puppet/manifests/classes
54
56
  echo "import 'nodes/*.pp'" > /etc/puppet/manifests/site.pp
@@ -59,12 +61,14 @@ cp #{Base.remote_storage_path}/namespaceauth.conf /etc/puppet/namespaceauth.conf
59
61
 
60
62
  def setup_configs
61
63
  <<-EOS
64
+ echo "Setting up configuration"
62
65
  echo "#{open(File.join(template_directory, "puppet.conf")).read}" > /etc/puppet/puppet.conf
63
66
  EOS
64
67
  end
65
68
 
66
69
  def setup_fileserver
67
70
  <<-EOS
71
+ echo "Setting up the master fileserver"
68
72
  echo "
69
73
  [files]
70
74
  path #{Base.remote_storage_path}
@@ -77,12 +81,14 @@ mkdir -p /etc/poolparty
77
81
  # Change this eventually for better security supportsetup_fileserver
78
82
  def setup_autosigning
79
83
  <<-EOS
84
+ echo "Creating accessibility for the nodes"
80
85
  echo "*" > /etc/puppet/autosign.conf
81
86
  EOS
82
87
  end
83
88
 
84
89
  def setup_poolparty
85
90
  <<-EOS
91
+ echo "Setting the poolparty configuration"
86
92
  cp #{Base.remote_storage_path}/#{Base.key_file_locations.first} "#{Base.base_config_directory}/.ppkeys"
87
93
  cp #{Base.remote_storage_path}/#{Base.default_specfile_name} #{Base.base_config_directory}/#{Base.default_specfile_name}
88
94
  EOS
@@ -94,7 +100,7 @@ cp #{Base.remote_storage_path}/#{Base.default_specfile_name} #{Base.base_config_
94
100
 
95
101
  def install_poolparty
96
102
  <<-EOE
97
- #{installer_for("ruby rubygems")}
103
+ echo "Installing poolparty"
98
104
  cd /var/poolparty
99
105
  wget http://rubyforge.org/frs/download.php/44731/logging-0.9.4.gem -O logging.gem 2>&1
100
106
  wget http://rubyforge.org/frs/download.php/45581/ZenTest-3.11.0.gem -O ZenTest.gem 2>&1
@@ -123,17 +129,26 @@ wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O amazon-
123
129
 
124
130
  # ps aux | grep puppetmasterd | awk '{print $2}' | xargs kill
125
131
  # /etc/init.d/puppetmaster stop; rm -rf /etc/puppet/ssl; /etc/init.d/puppetmaster start
126
- def start_puppetmaster
132
+ def restart_puppetmaster
127
133
  <<-EOS
134
+ echo "(Re)starting poolparty"
128
135
  . /etc/profile
129
- # /etc/init.d/puppetmaster stop #{unix_hide_string}
136
+ /etc/init.d/puppetmaster stop #{unix_hide_string}
130
137
  ps aux | grep puppetmaster | awk '{print $2}' | xargs kill #{unix_hide_string} # just in case
131
138
  rm -rf /etc/puppet/ssl
132
139
  # Start it back up
133
- puppetmasterd --verbose
134
- # /etc/init.d/puppetmaster start #{unix_hide_string}
140
+ # puppetmasterd --verbose
141
+ /etc/init.d/puppetmaster start
135
142
  EOS
136
143
  end
144
+
145
+ def run_first_time
146
+ <<-EOE
147
+ echo "#{open(File.join(template_directory, "puppetrerun")).read}" > /usr/bin/puppetrerun
148
+ chmod +x /usr/bin/puppetrerun
149
+ /bin/sh /usr/bin/puppetrerun
150
+ EOE
151
+ end
137
152
 
138
153
  # TODO:
139
154
  # Consider this method in the manifest
@@ -153,6 +168,7 @@ node "#{ri.name}" inherits default {}
153
168
 
154
169
  def move_templates
155
170
  <<-EOS
171
+ echo "Moving templates into place"
156
172
  mkdir -p #{Base.template_path}
157
173
  cp -R #{Base.remote_storage_path}/#{Base.template_directory}/* #{Base.template_path}
158
174
  EOS
@@ -160,22 +176,25 @@ cp -R #{Base.remote_storage_path}/#{Base.template_directory}/* #{Base.template_p
160
176
 
161
177
  def create_poolparty_manifest
162
178
  <<-EOS
179
+ echo "Creating the manifest"
163
180
  cp #{Base.remote_storage_path}/poolparty.pp /etc/puppet/manifests/classes/poolparty.pp
164
181
  #{copy_ssh_app}
165
182
  EOS
166
183
  end
167
184
 
168
185
  def clean_master_certs
169
- returning String.new do |s|
170
- s << "puppetca --clean master.compute-1.internal 2>&1 > /dev/null;"
186
+ str = returning Array.new do |s|
187
+ s << "puppetca --clean master.compute-1.internal 2>&1 > /dev/null"
171
188
  s << "puppetca --clean master.ec2.internal 2>&1 > /dev/null"
172
- s << "/usr/bin/puppetcleaner"
173
- end
189
+ end.join(";")
190
+ "if [ -f '/usr/bin/puppetcleaner' ]; then /usr/bin/env puppetcleaner; else #{str}; fi"
174
191
  end
175
192
 
176
193
  def restart_puppetd
194
+ terminate_string = "ps aux | grep puppetmaster | awk '{print $2}' | xargs kill #{unix_hide_string}; puppetmasterd --verbose"
177
195
  <<-EOS
178
- . /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master #{unix_hide_string}
196
+ echo "Running puppet manifest"
197
+ /bin/sh /usr/bin/puppetrerun
179
198
  EOS
180
199
  end
181
200
  end
@@ -15,6 +15,12 @@ module PoolParty
15
15
  start_puppet
16
16
  ]
17
17
  end
18
+
19
+ def setup_poolparty
20
+ <<-EOE
21
+ echo "#{open(File.join(template_directory, "puppetrun")).read}" > /usr/bin/puppetrun
22
+ EOE
23
+ end
18
24
 
19
25
  def setup_puppet
20
26
  <<-EOE
@@ -34,7 +40,7 @@ module PoolParty
34
40
  def run_once_and_clean
35
41
  <<-EOS
36
42
  rm -rf /etc/puppet/ssl
37
- . /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master #{unix_hide_string} &
43
+ /bin/sh /usr/bin/puppetrerun
38
44
  rm -rf /etc/puppet/ssl
39
45
  EOS
40
46
  end
@@ -43,7 +49,7 @@ rm -rf /etc/puppet/ssl
43
49
  # puppetd --listen --fqdn #{@instance.name}
44
50
  def start_puppet
45
51
  <<-EOS
46
- . /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master #{unix_hide_string} &
52
+ /bin/sh /usr/bin/puppetrerun
47
53
  EOS
48
54
  end
49
55
 
@@ -1,6 +1,6 @@
1
1
  module PoolParty
2
2
  module CloudDsl
3
-
3
+
4
4
  def mount_ebs_volume_at(id="", loc="/data")
5
5
  ebs_volume_id id
6
6
  ebs_volume_mount_point loc
@@ -3,6 +3,11 @@ require "ftools"
3
3
  module PoolParty
4
4
  module CloudResourcer
5
5
 
6
+ def plugin_directory(*args)
7
+ args = ["/plugins"] if args.empty?
8
+ args.each {|arg| Dir["#{arg}/*/*.rb"].each {|f| require f rescue "" }}
9
+ end
10
+
6
11
  # Store block
7
12
  def store_block(&block)
8
13
  @store_block ||= block
@@ -61,9 +61,10 @@ module PoolParty
61
61
  def make_template_directory(dir=nil)
62
62
  path = dir ? ::File.join(Base.tmp_path, Base.template_directory, ::File.basename(dir)) : ::File.join(Base.tmp_path, Base.template_directory)
63
63
  begin
64
- FileUtils.mkdir_p path unless ::File.directory?(path)
64
+ make_base_directory
65
+ FileUtils.mkdir path unless ::File.directory?(path)
65
66
  rescue Errno::EEXIST
66
- FileUtils.rm path
67
+ FileUtils.rm path if ::File.exists?(path)
67
68
  make_template_directory(dir)
68
69
  end
69
70
  path
@@ -23,7 +23,8 @@ module PoolParty
23
23
  args.each do |arg|
24
24
  (available_monitors << "#{arg}".downcase.to_sym unless available_monitors.include?("#{arg}".downcase.to_sym))
25
25
 
26
- InstanceMethods.module_eval "def #{arg}; @#{arg} ||= messenger_send!(\"get_current_load #{arg}\").to_f rescue -1.0; end"
26
+ InstanceMethods.module_eval "def #{arg}; @#{arg} ||= get_live_#{arg}; end"
27
+ InstanceMethods.module_eval "def get_live_#{arg}; messenger_send!(\"get_current_load #{arg}\").to_f rescue -1.0; end"
27
28
  end
28
29
  end
29
30
 
@@ -49,13 +49,14 @@ begin
49
49
  :name => @name,
50
50
  :hostname => h[:ip],
51
51
  :ip => h[:ip].convert_from_ec2_to_ip,
52
- :launching_time => (h[:launching_time].parse_datetime)
52
+ :index => i,
53
+ :launching_time => (h[:launching_time])
53
54
  })
54
- end
55
+ end.sort_by {|a| a[:index] }
55
56
  end
56
57
  # Get the s3 description for the response in a hash format
57
58
  def get_instances_description
58
- EC2ResponseObject.get_descriptions(ec2.describe_instances).sort_by {|a| a[:launching_time] }
59
+ EC2ResponseObject.get_descriptions(ec2.describe_instances)
59
60
  end
60
61
 
61
62
  def after_launch_master(instance=nil)
@@ -158,7 +159,7 @@ begin
158
159
  :name => resp.instanceId,
159
160
  :ip => resp.dnsName || "not-assigned",
160
161
  :status => resp.instanceState.name,
161
- :launching_time => resp.launchTime,
162
+ :launching_time => resp.launchTime.parse_datetime,
162
163
  :keypair => resp.keyName
163
164
  }
164
165
  rescue Exception => e
@@ -69,13 +69,13 @@ module PoolParty
69
69
  end
70
70
  # Commands for the servers
71
71
  def self.puppet_runner_command
72
- ". /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master 2>&1"
72
+ ". /etc/profile && puppetrunner"
73
73
  end
74
74
  def self.puppet_master_rerun_command
75
- "#{puppet_runner_command}"
75
+ ". /etc/profile && puppetrerun"
76
76
  end
77
77
  def self.puppet_rerun_commad
78
- "/usr/bin/puppetrerun 2>&1 > /dev/null"
78
+ puppet_runner_command
79
79
  end
80
80
  end
81
81
 
@@ -31,6 +31,15 @@ module PoolParty
31
31
  def rsync_command
32
32
  "rsync -azP --exclude cache -e '#{ssh_string}'"
33
33
  end
34
+ def remote_ssh_array
35
+ ["-o StrictHostKeyChecking=no", "-l '#{Base.user}'", '-i "'+remote_keypair_path+'"']
36
+ end
37
+ def remote_ssh_string
38
+ (["ssh"] << remote_ssh_array).join(" ")
39
+ end
40
+ def remote_rsync_command
41
+ "rsync -azP --exclude cache -e '#{remote_ssh_string}'"
42
+ end
34
43
  # Open the cached local copy of the instances list and
35
44
  # create a new RemoteInstance from each line
36
45
  def list_from_local
@@ -79,20 +79,30 @@ module PoolParty
79
79
  key = keyp ? keyp : keypair
80
80
  unless @describe_instances
81
81
  tmpInstanceList = describe_instances.select {|a| key ? a[:keypair] == key : true }
82
- has_master = tmpInstanceList.collect {|a| a[:name] }.include?("master")
82
+ has_master = !tmpInstanceList.select {|a| a[:name] == "master" }.empty?
83
83
  if has_master
84
84
  @describe_instances = tmpInstanceList
85
- else
85
+ else
86
86
  @id = 0
87
- @describe_instances = tmpInstanceList.sort_by {|a| a[:status] }.map do |inst|
87
+ running = select_from_instances_on_status(/running/, tmpInstanceList)
88
+ pending = select_from_instances_on_status(/pending/, tmpInstanceList)
89
+ terminated = select_from_instances_on_status(/shutting/, tmpInstanceList)
90
+
91
+ running = running.map do |inst|
88
92
  inst[:name] = (@id == 0 ? "master" : "node#{@id}")
89
93
  @id += 1
90
94
  inst
91
- end
95
+ end.sort_by {|a| a[:index] }
96
+
97
+ @describe_instances = [running, pending, terminated].flatten
92
98
  end
93
99
  end
94
100
  @describe_instances
95
101
  end
102
+ # Select the instances based on their status
103
+ def select_from_instances_on_status(status=/running/, list=[])
104
+ list.select {|a| a[:status] =~ status}
105
+ end
96
106
  # Instances
97
107
  # Get the master from the cloud
98
108
  def master
@@ -4,26 +4,35 @@ module PoolParty
4
4
  virtual_resource(:deploydirectory) do
5
5
 
6
6
  def loaded(opts={}, parent=self)
7
- package_directory
8
- execute_on_master do
9
- unpack_directory
10
- end
11
- has_rsync_mirror(:dir => cwd)
7
+ package_directory
8
+ unpack_directory
9
+ sync_directories
12
10
  end
13
11
 
14
12
  def package_directory
15
13
  path = ::File.join( Base.tmp_path, "#{::File.basename(from_dir)}.tar.gz" )
16
14
  # cd /Users/auser/Sites/work/citrusbyte/internal/gems/pool-party/poolparty/spec/poolparty/plugins/ && tar -czf plugins.tar.gz . && mv plugins.tar.gz /tmp/poolparty && cd /tmp/poolparty
17
- cmd = "cd #{::File.expand_path(from_dir)} && tar -czf #{name.dir_safe}.tar.gz . && mv #{name.dir_safe}.tar.gz #{Base.tmp_path}"
15
+ archive_name = "#{name.dir_safe}.tar.gz"
16
+ cmd = "cd #{::File.expand_path(from_dir)} && tar -czf #{archive_name} . && mv #{archive_name} #{Base.tmp_path}"
18
17
  `#{cmd}` unless testing
19
18
  end
20
19
 
21
- def unpack_directory
22
- has_exec({:name => "deploy-directory-#{name}", :requires => get_directory("#{cwd}"), :cwd => cwd}) do
23
- command "cd #{parent.cwd}; tar -zxf #{Base.remote_storage_path}/#{parent.name.dir_safe}.tar.gz && rm #{Base.tmp_path}/#{parent.name.dir_safe}.tar.gz"
20
+ def unpack_directory
21
+ execute_on_master do
22
+ has_exec({:name => "deploy-directory-#{name}", :requires => get_directory("#{cwd}"), :cwd => cwd}) do
23
+ # && rm #{Base.tmp_path}/#{parent.name.dir_safe}.tar.gz
24
+ command "cd #{parent.cwd}; tar -zxf #{Base.remote_storage_path}/#{parent.name.dir_safe}.tar.gz; rm #{Base.remote_storage_path}/#{parent.name.dir_safe}.tar.gz"
25
+ onlyif "test -f #{Base.remote_storage_path}/#{parent.name.dir_safe}.tar.gz"
26
+ end
24
27
  end
25
28
  end
26
29
 
30
+ def sync_directories
31
+ # execute_on_master do
32
+ has_rsyncmirror(:dir => cwd, :name => "deploydirectory-#{name}")
33
+ # end
34
+ end
35
+
27
36
  def from(dir)
28
37
  from_dir (dir.include?(" ") ? dir.gsub(/[ ]/, '') : dir)
29
38
  end
@@ -26,11 +26,12 @@ module PoolParty
26
26
  EOE
27
27
  end
28
28
 
29
- def delete_lines_from(file="", pattern=//)
29
+ def delete_lines_from(file="", pattern=//, opts={})
30
30
  call_function <<-EOE
31
31
  delete_lines {
32
32
  '#{file}' :
33
33
  file => '#{file}',
34
+ #{opts.flush_out("\t", ",")}
34
35
  pattern => '#{pattern}'
35
36
  }
36
37
  EOE
@@ -1,14 +1,11 @@
1
1
  module PoolParty
2
- class Git
2
+ class Rsyncmirror
3
3
 
4
4
  virtual_resource(:rsyncmirror) do
5
5
 
6
6
  def loaded(opts={}, parent=self)
7
- has_rsync_mirror(opts, parent)
8
- end
9
-
10
- def has_rsync_mirror(opts={}, parent=self)
11
- has_exec(:command => "rsync -aRqv --no-implied-dirs --delete --delete-excluded '#{Base.user}@master:#{opts[:dir]}' '#{opts[:dir]}'", :name => "rsync-#{name}")
7
+ @parent = parent
8
+ has_exec(opts.merge({:command => "#{cloud.remote_rsync_command} --no-implied-dirs --delete-excluded #{Base.user}@master:#{dir}/ #{dir}/".safe_quote, :name => "rsync-#{name}"}))
12
9
  end
13
10
 
14
11
  # Since git is not a native type, we have to say which core resource
@@ -45,11 +45,18 @@ module PoolParty
45
45
 
46
46
  def initialize(name, parent, &block)
47
47
  @name = name
48
- # store_block(&block)
48
+
49
+ plugin_directory "#{::Dir.pwd}/plugins"
50
+
49
51
  set_parent(parent) if parent
50
52
  self.instance_eval &block if block
53
+
54
+ setup_defaults
55
+ end
56
+
57
+ def setup_defaults
51
58
  # this can be overridden in the spec, but ec2 is the default
52
- self.using :ec2
59
+ self.using :ec2
53
60
  end
54
61
 
55
62
  # Keypairs
@@ -34,13 +34,14 @@ module PoolParty
34
34
  })
35
35
 
36
36
  def initialize(name,&block)
37
+ setup_defaults
38
+
37
39
  @name = name
38
40
  instance_eval &block if block
39
41
  end
40
42
 
41
- def plugin_directory(*args)
42
- args = ["/plugins"] if args.empty?
43
- args.each {|arg| Dir["#{arg}/*/*.rb"].each {|f| require f rescue "" }}
43
+ def setup_defaults
44
+ plugin_directory "#{::Dir.pwd}/plugins"
44
45
  end
45
46
 
46
47
  # This is where the entire process starts
@@ -18,7 +18,7 @@ module PoolParty
18
18
  end
19
19
 
20
20
  def add_resource(type, opts={}, parent=self, &block)
21
- if in_resources?(type, opts[:name])
21
+ if in_resources?(type, opts[:name])
22
22
  get_resource(type, opts[:name], parent)
23
23
  else
24
24
  returning "PoolParty::Resources::#{type.to_s.camelize}".classify.constantize.new(opts, parent, &block) do |o|
@@ -150,6 +150,14 @@ module PoolParty
150
150
  self.class.custom_functions << str
151
151
  end
152
152
 
153
+ def cloud
154
+ @p = parent
155
+ while !@p.is_a?(PoolParty::Cloud)
156
+ @p = @p.parent
157
+ end
158
+ @p
159
+ end
160
+
153
161
  def self.custom_functions_to_string(pre="")
154
162
  returning Array.new do |output|
155
163
  PoolParty::Resources.available_custom_resources.each do |resource|
@@ -2,16 +2,16 @@ module PoolParty
2
2
  module Resources
3
3
 
4
4
  def execute_on_master(parent=self, &block)
5
- execute_if("$hostname", "==", "master", parent, &block)
5
+ execute_if("$hostname", "==", "master", {}, parent, &block)
6
6
  end
7
7
 
8
8
  def execute_on_node(parent=self, &block)
9
- execute_if("$hostname", "!=", "master", parent, &block)
9
+ execute_if("$hostname", "!=", "master", {:notequal => true}, parent, &block)
10
10
  end
11
11
 
12
- def execute_if(attr_s="$hostname", comparison="==", str="", parent=self, &block)
12
+ def execute_if(attr_s="$hostname", comparison="==", str="", cust_opts={}, parent=self, &block)
13
13
  # parent = parent.is_a?(PoolParty::Cloud::Cloud) ? parent : parent.parent
14
- opts = {:attribute => attr_s, :equal => str, :comparison => comparison}
14
+ opts = {:attribute => attr_s, :equal => str, :comparison => comparison}.merge(cust_opts)
15
15
  options = parent.respond_to?(:options) ? parent.options.merge!(opts) : opts
16
16
  # @c = PoolParty::Resources::Conditional.new(options, parent, &block)
17
17
  parent.add_resource(:conditional, options, parent, &block)
@@ -24,6 +24,7 @@ module PoolParty
24
24
  name "#{opts[:name] ? opts[:name] : opts[:attribute]} #{opts[:comparison]} #{opts[:equal]}"
25
25
  attribute opts[:attribute]
26
26
  equal opts[:equal]
27
+ notequal opts.has_key?(:notequal) ? opts[:notequal] : false
27
28
  super
28
29
  end
29
30
 
@@ -34,7 +35,7 @@ module PoolParty
34
35
  end
35
36
 
36
37
  def disallowed_options
37
- [:comparison]
38
+ [:comparison, :notequal]
38
39
  end
39
40
 
40
41
  def printable?
@@ -49,8 +50,13 @@ module PoolParty
49
50
  returning Array.new do |output|
50
51
  output << "# #{name.sanitize}"
51
52
  output << "case #{attribute} {"
52
- output << "#{equal} : { #{resources_string_from_resources(resources)} }"
53
- output << "default : {}"
53
+ if notequal
54
+ output << "#{equal} : {}"
55
+ output << "default : { #{resources_string_from_resources(resources)} }"
56
+ else
57
+ output << "#{equal} : { #{resources_string_from_resources(resources)} }"
58
+ output << "default : {}"
59
+ end
54
60
  output << "}"
55
61
  end.join("\n")
56
62
  end
@@ -28,7 +28,7 @@ defaults
28
28
  stats uri /poolparty
29
29
  stats realm Statistics\ for\ PoolParty
30
30
 
31
- listen <%= name_haproxy %>
31
+ listen poolparty
32
32
  bind 0.0.0.0:<%= ports_haproxy.join(",0.0.0.0:") %>
33
33
  cookie POOLPARTYPARTY
34
34
  <%- node_ips_haproxy.chomp.split(/\t/).each_with_index do |ip, index| -%>
@@ -2,4 +2,19 @@
2
2
 
3
3
  . /etc/profile
4
4
  # rm -rf /etc/puppet/ssl
5
- /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master 2>&1 > /dev/null
5
+ if [ `/usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master` ];
6
+ then
7
+ echo '';
8
+ else
9
+ ps aux | grep puppetmaster | awk '{print $2}' | xargs kill
10
+ /etc/init.d/puppetmaster stop
11
+ rm -rf /etc/puppet/ssl
12
+ /etc/init.d/puppetmaster start
13
+ if [ `/usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master` ];
14
+ then
15
+ echo '';
16
+ else
17
+ # Try again
18
+ /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master
19
+ fi
20
+ fi
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+
3
+ . /etc/profile
4
+ # rm -rf /etc/puppet/ssl
5
+ if [ `hostname` -eq "master"];
6
+ then
7
+ /bin/sh puppetrerun
8
+ else
9
+ if [ `/usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master` ];
10
+ then
11
+ echo '';
12
+ else
13
+ /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master
14
+ fi
15
+ fi
@@ -2,7 +2,7 @@ module PoolParty
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 58
5
+ TINY = 59
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -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.58
4
+ version: 0.2.59
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-11-13 00:00:00 -08:00
12
+ date: 2008-11-14 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -381,6 +381,7 @@ files:
381
381
  - lib/poolparty/templates/puppet.conf
382
382
  - lib/poolparty/templates/puppetcleaner
383
383
  - lib/poolparty/templates/puppetrerun
384
+ - lib/poolparty/templates/puppetrunner
384
385
  - lib/poolparty/templates/yaws.conf
385
386
  - lib/poolparty/version.rb
386
387
  - lib/poolpartycl.rb
@@ -27,7 +27,7 @@ describe "Master provisioner" do
27
27
  @master.should_receive(:setup_fileserver)
28
28
  end
29
29
  it "should call create_local_node" do
30
- @master.should_receive(:create_local_node)
30
+ @master.should_receive(:create_local_node).twice
31
31
  end
32
32
  it "should call the custom_install_tasks" do
33
33
  @master.should_receive(:custom_install_tasks)
@@ -70,7 +70,7 @@ describe "Remote Instance" do
70
70
  @ri.respond_to?(:puppet_runner_command).should == true
71
71
  end
72
72
  it "should return the puppet_runner_command with puppetd" do
73
- @ri.puppet_runner_command.should =~ /puppetd/
73
+ @ri.puppet_runner_command.should =~ /puppetrun/
74
74
  end
75
75
  end
76
76
  end
@@ -54,7 +54,7 @@ describe "RemoterBase" do
54
54
  @tr.list_of_instances("fake_keypair").map {|a| a[:name] }.should == ["master", "node1", "node2", "node3"]
55
55
  end
56
56
  it "should be able to grab all the blist keypairs" do
57
- @tr.list_of_instances("blist").map {|a| a[:name] }.should == ["master"]
57
+ @tr.list_of_instances("blist").map {|a| a[:name] }.should == ["node4"]
58
58
  end
59
59
  end
60
60
  describe "get by name" do
@@ -11,7 +11,11 @@ describe "Remote Instance" do
11
11
  end
12
12
  describe "wrapped" do
13
13
  before(:each) do
14
- @tc = TestClass.new
14
+ @tc = TestClass.new
15
+ @cloud = MyOpenStruct.new(:keypair => "keys", :remote_keypair_path => "/keypair_path", :name => "cloudcloud")
16
+ @cloud.stub!(:is_a?).with(PoolParty::Cloud::Cloud).and_return true
17
+ @tc.stub!(:parent).and_return @cloud
18
+
15
19
  @options = {:name => "deploydirectory", :from => ::File.dirname(__FILE__), :to => "/var/www/deploydirectory", :testing => false}
16
20
  end
17
21
  it "should be a string" do
@@ -39,6 +43,9 @@ describe "Remote Instance" do
39
43
  it "should not have the to in the to_string" do
40
44
  @tc.resource(:deploydirectory).first.to_string.should_not =~ /to /
41
45
  end
46
+ it "should have onlyif in the to_string" do
47
+ @tc.resource(:deploydirectory).first.to_string.should =~ /onlyif/
48
+ end
42
49
  end
43
50
  end
44
51
  end
@@ -284,7 +284,7 @@ describe "Cloud" do
284
284
  File.open("test_manifest.pp", "w+") {|f| f << @manifest}
285
285
  end
286
286
  it "should include the hosts for all the listed local instances" do
287
- @manifest.should =~ /host \{\n\t\t"gen_master":/
287
+ @manifest.should =~ /master :/
288
288
  end
289
289
  end
290
290
  describe "building with an existing manifest" do
@@ -36,7 +36,7 @@ describe "Pool" do
36
36
  plugin_directory "yaway"
37
37
  end
38
38
  end
39
- it "should call Dir when the plugin directory is set" do
39
+ it "should call Dir when the plugin directory is set" do
40
40
  Dir.should_receive(:[]).with("yaway/*/*.rb").once.and_return []
41
41
  end
42
42
  end
@@ -9,7 +9,7 @@ describe "Conditional" do
9
9
  describe "wrapped" do
10
10
  before(:each) do
11
11
  @cloud = cloud :conditional_cloud_spec do
12
- execute_if("$hostname", "==", "'master'", self) do
12
+ execute_if("$hostname", "==", "'master'", {}, self) do
13
13
  has_file({:name => "/etc/apache2/puppetmaster2.conf"})
14
14
  end
15
15
  end
@@ -30,6 +30,18 @@ describe "Conditional" do
30
30
  it "should have the parent as the cloud" do
31
31
  @cond.parent.should == @cloud
32
32
  end
33
+ describe "helpers" do
34
+ it "should have execute_on_master with the string $hostname == 'master'" do
35
+ str = execute_on_master do
36
+ has_file(:name => "/etc/vars")
37
+ end.to_string.should =~ /\$hostname==master/
38
+ end
39
+ it "should have execute_on_node with the string $hostname != 'master'" do
40
+ str = execute_on_node do
41
+ has_file(:name => "/etc/vars")
42
+ end.to_string.should =~ /\$hostname!=master/
43
+ end
44
+ end
33
45
  describe "to_string" do
34
46
  before(:each) do
35
47
  @string = @cond.to_string
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.58
4
+ version: 0.2.59
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-11-13 00:00:00 -08:00
12
+ date: 2008-11-14 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -381,6 +381,7 @@ files:
381
381
  - lib/poolparty/templates/puppet.conf
382
382
  - lib/poolparty/templates/puppetcleaner
383
383
  - lib/poolparty/templates/puppetrerun
384
+ - lib/poolparty/templates/puppetrunner
384
385
  - lib/poolparty/templates/yaws.conf
385
386
  - lib/poolparty/version.rb
386
387
  - lib/poolpartycl.rb