auser-poolparty 0.2.58 → 0.2.59

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 (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