auser-poolparty 0.2.39 → 0.2.40

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 (56) hide show
  1. data/Manifest.txt +117 -0
  2. data/bin/cloud-configure +3 -3
  3. data/bin/cloud-expand +10 -6
  4. data/bin/cloud-handle-load +32 -0
  5. data/bin/cloud-maintain +3 -9
  6. data/bin/cloud-provision +1 -1
  7. data/bin/cloud-start +2 -1
  8. data/bin/server-show-stats +1 -0
  9. data/lib/erlang/cloudpanel/EMakefile +1 -0
  10. data/lib/erlang/cloudpanel/Makefile +3 -0
  11. data/lib/erlang/cloudpanel/cloudpanel.rb +15 -0
  12. data/lib/erlang/cloudpanel/doc/cloudpanel_web.html +1 -1
  13. data/lib/erlang/cloudpanel/doc/string.html +222 -0
  14. data/lib/erlang/cloudpanel/priv/www/index.html +2 -1
  15. data/lib/erlang/cloudpanel/priv/www/javascripts/site.js +2 -0
  16. data/lib/erlang/cloudpanel/priv/www/pages/index.html +1 -0
  17. data/lib/erlang/cloudpanel/priv/www/pages/tail.html +1 -0
  18. data/lib/erlang/cloudpanel/priv/www/partials/error.html +3 -0
  19. data/lib/erlang/cloudpanel/priv/www/partials/footer.html +6 -0
  20. data/lib/erlang/cloudpanel/priv/www/partials/header.html +13 -0
  21. data/lib/erlang/cloudpanel/priv/www/partials/menu.html +13 -0
  22. data/lib/erlang/cloudpanel/src/cloudpanel.hrl +1 -0
  23. data/lib/erlang/cloudpanel/src/cloudpanel_web.erl +18 -24
  24. data/lib/erlang/cloudpanel/src/string.erl +387 -0
  25. data/lib/erlang/cloudpanel/src/tail_log.erl +66 -0
  26. data/lib/erlang/cloudpanel/src/tailor.erl +31 -0
  27. data/lib/erlang/cloudpanel/src/utils.erl +9 -0
  28. data/lib/erlang/cloudpanel/src/views.erl +44 -0
  29. data/lib/erlang/cloudpanel/yaws.conf +20 -0
  30. data/lib/erlang/messenger/useful_snippets +1 -1
  31. data/lib/poolparty/aska/aska.rb +29 -4
  32. data/lib/poolparty/base_packages/poolparty.rb +14 -6
  33. data/lib/poolparty/config/postlaunchmessage.txt +5 -0
  34. data/lib/poolparty/exceptions/LoadRulesException.rb +7 -0
  35. data/lib/poolparty/helpers/provisioner_base.rb +24 -8
  36. data/lib/poolparty/helpers/provisioners/master.rb +8 -2
  37. data/lib/poolparty/helpers/provisioners/slave.rb +4 -3
  38. data/lib/poolparty/modules/method_missing_sugar.rb +1 -1
  39. data/lib/poolparty/monitors/base_monitor.rb +1 -1
  40. data/lib/poolparty/net/remoter.rb +8 -5
  41. data/lib/poolparty/plugins/git.rb +1 -1
  42. data/lib/poolparty/pool/base.rb +6 -3
  43. data/lib/poolparty/pool/cloud.rb +4 -2
  44. data/lib/poolparty/pool/loggable.rb +2 -5
  45. data/lib/poolparty/templates/yaws.conf +19 -0
  46. data/lib/poolparty/version.rb +1 -1
  47. data/lib/poolparty.rb +2 -2
  48. data/poolparty.gemspec +121 -2
  49. data/spec/poolparty/aska/aska_spec.rb +33 -0
  50. data/spec/poolparty/core/hash_spec.rb +3 -3
  51. data/spec/poolparty/net/remote_spec.rb +4 -3
  52. data/spec/poolparty/net/remoter_spec.rb +1 -0
  53. data/spec/poolparty/pool/base_spec.rb +11 -2
  54. data/spec/poolparty/pool/cloud_spec.rb +2 -2
  55. data/website/index.html +1 -1
  56. metadata +121 -2
@@ -12,6 +12,7 @@ module PoolParty
12
12
  has_package(:name => "erlang")
13
13
  has_package(:name => "erlang-dev")
14
14
  has_package(:name => "erlang-src")
15
+ # has_package(:name => "yaws")
15
16
 
16
17
  has_package(:name => "rubygems") do |g|
17
18
  # These should be installed automagically by poolparty, but just in case
@@ -24,10 +25,9 @@ module PoolParty
24
25
  g.has_gempackage(:name => "hoe", :download_url => "http://rubyforge.org/frs/download.php/45685/hoe-1.8.2.gem", :version => "1.8", :requires => get_gempackage("rubyforge"))
25
26
  g.has_gempackage(:name => "ZenTest", :download_url => "http://rubyforge.org/frs/download.php/45581/ZenTest-3.11.0.gem", :requires => [get_gempackage("hoe"), get_gempackage("rubyforge")])
26
27
 
27
- g.has_gempackage(:name => "rake", :download_url => "http://rubyforge.org/frs/download.php/43954/rake-0.8.3.gem")
28
- g.has_gempackage(:name => "xml-simple", :download_url => "http://rubyforge.org/frs/download.php/18366/xml-simple-1.0.11.gem") do |x|
29
- x.has_gempackage(:name => "grempe-amazon-ec2", :download_url => "http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem")
30
- end
28
+ has_gempackage(:name => "rake", :download_url => "http://rubyforge.org/frs/download.php/43954/rake-0.8.3.gem")
29
+ has_gempackage(:name => "xml-simple", :download_url => "http://rubyforge.org/frs/download.php/18366/xml-simple-1.0.11.gem")
30
+ has_gempackage(:name => "grempe-amazon-ec2", :download_url => "http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem", :requires => get_gempackage("xml-simple"))
31
31
 
32
32
  has_gempackage(:name => "sexp_processor", :download_url => "http://rubyforge.org/frs/download.php/45589/sexp_processor-3.0.0.gem")
33
33
  has_gempackage(:name => "ParseTree", :download_url => "http://rubyforge.org/frs/download.php/45600/ParseTree-3.0.1.gem", :requires => [get_gempackage("sexp_processor"), get_gempackage("ZenTest")])
@@ -45,10 +45,18 @@ module PoolParty
45
45
 
46
46
  end
47
47
 
48
+ # Cloud panel setup
49
+
50
+ has_directory(:name => "/var/www/cloudpanel")
51
+
52
+ # has_file(:name => "/etc/yaws/conf.d/localhost.conf") do
53
+ # template File.join(File.dirname(__FILE__), "..", "templates/yaws.conf")
54
+ # end
55
+
48
56
  # Custom run puppet to minimize footprint
49
57
  # TODO: Update the offsetted times
50
58
  execute_on_master do
51
- has_cron(:name => "puppetd runner", :user => Base.user, :minute => "*/5") do
59
+ has_cron(:name => "puppetd runner", :user => Base.user, :minute => "*/15") do
52
60
  command(PoolParty::Remote::RemoteInstance.puppet_master_rerun_command)
53
61
  end
54
62
  end
@@ -62,7 +70,7 @@ module PoolParty
62
70
  execute_on_master do
63
71
  has_cron({:name => "maintain script", :command => ". /etc/profile && which cloud-maintain | /bin/sh", :minute => "*/3"})
64
72
  # TODO: Update this so it only runs when needed
65
- has_exec(:name => "start master messenger", :command => ". /etc/profile && server-start-master", :requires => [get_gempackage("poolparty-latest"), get_exec("build_messenger")], :ifnot => "ps aux | grep beam | grep node")
73
+ has_exec(:name => "start master messenger", :command => ". /etc/profile && server-start-master", :requires => [get_gempackage("poolparty-latest"), get_exec("build_messenger")], :onlyif => "ps aux | grep beam | grep master")
66
74
 
67
75
  has_remotefile(:name => "/usr/bin/puppetcleaner") do
68
76
  mode 744
@@ -0,0 +1,5 @@
1
+ Your cloud is launching
2
+ -----------------------
3
+ Your master's ip address is: :master_ip
4
+
5
+ Depending on how your cloud is setup, this process may take a while.
@@ -0,0 +1,7 @@
1
+ class LoadRulesException < Exception
2
+ attr_reader :message
3
+
4
+ def initialize(msg="It looks like your rules are malformed")
5
+ @message = "Load Malformed rule: #{msg}"
6
+ end
7
+ end
@@ -44,6 +44,10 @@ module PoolParty
44
44
  Provisioner::Master.new(cloud).process_clean_reconfigure_for!(instance, testing)
45
45
  end
46
46
 
47
+ def self.clear_master_ssl_certs(cloud, testing=false)
48
+ Provisioner::Master.new(cloud).clear_master_ssl_certs
49
+ end
50
+
47
51
  class ProvisionerBase
48
52
 
49
53
  include Configurable
@@ -138,12 +142,24 @@ module PoolParty
138
142
  vputs "Cleaning certs from master: #{instance.name}"
139
143
  # puppetca --clean #{instance.name}.compute-1.internal; puppetca --clean #{instance.name}.ec2.internal
140
144
  # find /etc/puppet/ssl -type f -exec rm {} \;
141
- @cloud.run_command_on("rm -rf /etc/puppet/ssl", instance) unless testing || instance.master?
142
- # @cloud.run_command_on("if [ -f '/usr/bin/puppetcleaner' ]; then /usr/bin/env puppetcleaner; fi", @cloud.master) unless testing
143
- @cloud.run_command_on("puppetca --clean #{instance.name}.compute-1.internal ; puppetca --clean #{instance.name}.ec2.internal", @cloud.master) unless testing
145
+ unless testing
146
+ # @cloud.run_command_on("rm -rf /etc/puppet/ssl", instance) unless instance.master?
147
+ str = returning String.new do |s|
148
+ s << "puppetca --clean #{instance.name}.compute-1.internal 2>&1 > /dev/null;"
149
+ s << "puppetca --clean #{instance.name}.ec2.internal 2>&1 > /dev/null"
150
+ end
151
+ @cloud.run_command_on(str, @cloud.master)
152
+ end
153
+ end
154
+ def clear_master_ssl_certs
155
+ str = returning String.new do |s|
156
+ s << "puppetca --clean master.compute-1.internal 2>&1 > /dev/null;"
157
+ s << "puppetca --clean master.ec2.internal 2>&1 > /dev/null"
158
+ end
159
+ @cloud.run_command_on("if [ -f '/usr/bin/puppetcleaner' ]; then /usr/bin/env puppetcleaner; else #{str}; fi", @cloud.master)
144
160
  end
145
- def process_reconfigure!(testing=false)
146
- @cloud.run_command_on(RemoteInstance.puppet_runner_command, @instance) unless testing
161
+ def process_reconfigure!(testing=false)
162
+ @cloud.run_command_on(PoolParty::Remote::RemoteInstance.puppet_runner_command, @instance) unless testing
147
163
  end
148
164
  # Tasks that need to be performed everytime we do any
149
165
  # remote ssh'ing into any instance
@@ -282,10 +298,10 @@ echo 'Updated already'
282
298
  else
283
299
  touch /etc/apt/sources.list
284
300
  echo 'deb http://mirrors.kernel.org/ubuntu hardy main universe' >> /etc/apt/sources.list
285
- aptitude update -y <<heredoc
301
+ aptitude update -y #{unix_hide_string} <<heredoc
286
302
  Y
287
303
  heredoc
288
- aptitude autoclean #{unix_hide_string}
304
+ aptitude autoclean #{unix_hide_string}
289
305
  fi
290
306
  "
291
307
  else
@@ -298,7 +314,7 @@ fi
298
314
  end
299
315
 
300
316
  def make_logger_directory
301
- "mkdir -p /var/logs/poolparty"
317
+ "mkdir -p /var/log/poolparty"
302
318
  end
303
319
 
304
320
  def create_poolparty_manifest
@@ -34,7 +34,8 @@ module PoolParty
34
34
  create_local_node,
35
35
  move_templates,
36
36
  create_poolparty_manifest,
37
- restart_puppetd
37
+ restart_puppetd,
38
+ start_puppetmaster
38
39
  ]
39
40
  end
40
41
 
@@ -125,7 +126,12 @@ wget http://rubyforge.org/frs/download.php/43666/amazon-ec2-0.3.1.gem -O grempe-
125
126
  # rm -rf /etc/puppet/ssl
126
127
  def start_puppetmaster
127
128
  <<-EOS
128
- puppetmasterd --verbose 2>&1 > /dev/null
129
+ . /etc/profile
130
+ ps aux | grep puppetmaster | awk '{print $2}' | xargs kill
131
+ /etc/init.d/puppetmaster stop
132
+ rm -rf /etc/puppet/ssl
133
+ puppetmasterd --verbose
134
+ /etc/init.d/puppetmaster start
129
135
  EOS
130
136
  end
131
137
 
@@ -19,14 +19,14 @@ module PoolParty
19
19
  <<-EOE
20
20
  if [ -z "$(grep -v '#' /etc/hosts | grep 'master')" ]; then echo "#{master_ip} puppet master" >> /etc/hosts; else echo "host already set"; fi
21
21
  cp #{Base.remote_storage_path}/namespaceauth.conf /etc/puppet/namespaceauth.conf
22
- echo 'DAEMON_OPTS="-w 120 --fqdn #{@instance.name} --server master"' > /etc/default/puppet
23
22
  EOE
24
23
  end
25
24
 
26
25
  def setup_configs
27
26
  <<-EOS
28
27
  echo "#{open(File.join(template_directory, "puppet.conf")).read}" > /etc/puppet/puppet.conf
29
- /usr/bin/puppetrerun
28
+ /etc/init.d/puppetmaster stop
29
+ # /usr/bin/puppetrerun
30
30
  EOS
31
31
  end
32
32
 
@@ -34,7 +34,8 @@ module PoolParty
34
34
  # puppetd --listen --fqdn #{@instance.name}
35
35
  def start_puppet
36
36
  <<-EOS
37
- . /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master 2>&1
37
+ . /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master 2>&1 > /dev/null
38
+ . /etc/profile && /usr/sbin/puppetd --onetime --no-daemonize --logdest syslog --server master 2>&1 > /dev/null &
38
39
  EOS
39
40
  end
40
41
 
@@ -42,7 +42,7 @@ module PoolParty
42
42
  if options.has_key?(m)
43
43
  options[m]
44
44
  else
45
- (parent.nil? || parent.class == self.class || !parent.respond_to?(:options) || parent.options.has_key?(m)) ? nil : parent.send(m, *args, &block)
45
+ (parent.nil? || parent.class == self.class || !parent.respond_to?(:options) || parent.options.has_key?(m) || !parent.respond_to?(m)) ? nil : parent.send(m, *args, &block)
46
46
  end
47
47
  else
48
48
  options[m] =
@@ -23,7 +23,7 @@ module PoolParty
23
23
  args.each do |arg|
24
24
  (available_monitors << "#{arg}".downcase.to_sym)
25
25
 
26
- InstanceMethods.module_eval "def #{arg}; PoolParty::Messenger.messenger_send!(\"get_load #{arg}\").to_f rescue -1; end"
26
+ InstanceMethods.module_eval "def #{arg}; @#{arg} ||= PoolParty::Messenger.messenger_send!(\"get_load #{arg}\").to_f rescue -1; end"
27
27
  end
28
28
  end
29
29
 
@@ -161,7 +161,8 @@ module PoolParty
161
161
  vputs ""
162
162
  vputs "Provisioning master..."
163
163
  hide_output { Provisioner.provision_master(self, testing) }
164
- PoolParty::Provisioner.reconfigure_master(self, !testing)
164
+ PoolParty::Provisioner.clear_master_ssl_certs(self)
165
+ PoolParty::Provisioner.reconfigure_master(self, testing)
165
166
  after_launched
166
167
  end
167
168
  end
@@ -186,16 +187,18 @@ module PoolParty
186
187
  if can_start_a_new_instance? && should_expand_cloud?(force)
187
188
  logger.debug "Expanding the cloud based on load"
188
189
  @num = 1
189
- @out = request_launch_new_instances(@num)
190
+ request_launch_new_instances(@num)
190
191
 
191
192
  reset!
192
193
  when_no_pending_instances do
194
+ reset!
193
195
  wait "20.seconds" # Give some time for ssh to startup
194
196
  @num_instances = nonmaster_nonterminated_instances.size
195
- last_instances = nonmaster_nonterminated_instances[(@num_instances - @num)..(@num_instances)]
197
+ last_instances = nonmaster_nonterminated_instances[(@num_instances - @num)...(@num_instances)]
196
198
  last_instances.each do |inst|
197
- vputs "Provisioning #{inst.name} slave"
198
- PoolParty::Provisioner.provision_slave(inst, self)
199
+ vputs "Provisioning #{inst.name}"
200
+ cmd = ". /etc/profile && cloud-provision -i #{inst.name.gsub(/node/, '')} #{unix_hide_string} &"
201
+ Kernel.system cmd
199
202
  end
200
203
  PoolParty::Provisioner.reconfigure_master(self, force)
201
204
  after_launched
@@ -11,7 +11,7 @@ module PoolParty
11
11
  has_package(:name => "git-core")
12
12
  has_directory(:name => "#{cwd}")
13
13
 
14
- has_exec({:name => "git-#{name}", :requires => get_package("git-core"), :requires => get_directory("#{cwd}")}) do
14
+ has_exec({:name => "git-#{name}", :requires => get_package("git-core"), :requires => [get_directory("#{cwd}"), get_package("git-core")]}) do
15
15
  command parent.user ? "git clone #{parent.user}@#{parent.source} #{parent.path}" : "git clone #{parent.source} #{parent.to ? parent.to : ""}"
16
16
  cwd "#{parent.cwd if parent.cwd}"
17
17
  creates "#{::File.join( (parent.cwd ? parent.cwd : cwd), ::File.basename(parent.source, ::File.extname(parent.source)) )}/.git"
@@ -41,8 +41,11 @@ module PoolParty
41
41
  def secret_access_key
42
42
  ENV["AWS_SECRET_ACCESS_ID"] ? ENV["AWS_SECRET_ACCESS_ID"] : load_keys_from_file[:secret_access_key]
43
43
  end
44
+ def read_keyfile
45
+ open(get_working_key_file_locations).read
46
+ end
44
47
  def load_keys_from_file
45
- @keys ||= get_working_key_file_locations ? YAML::load( open(get_working_key_file_locations).read ) : {}
48
+ @keys ||= get_working_key_file_locations ? YAML::load( read_keyfile ) : {}
46
49
  end
47
50
  # Store the keys in a yaml format to give the master access
48
51
  # So that the master has access to the files
@@ -80,10 +83,10 @@ module PoolParty
80
83
 
81
84
  def logger_location
82
85
  [
83
- "/var/logs/poolparty"
86
+ "/var/log/poolparty"
84
87
  ].select do |dir|
85
88
  dir if ::File.directory?(dir) && ::File.readable?(dir)
86
- end.first || ::File.join(Dir.pwd, "logs")
89
+ end.first || ::File.join(Dir.pwd, "log")
87
90
  end
88
91
 
89
92
  def pool_logger_location
@@ -30,7 +30,9 @@ module PoolParty
30
30
 
31
31
  default_options({
32
32
  :minimum_instances => 2,
33
- :maximum_instances => 4,
33
+ :maximum_instances => 5,
34
+ :contract_when => "cpu < 0.15",
35
+ :expand_when => "cpu > 0.9",
34
36
  :access_key => Base.access_key,
35
37
  :secret_access_key => Base.secret_access_key,
36
38
  :ec2_dir => ENV["EC2_HOME"],
@@ -104,7 +106,7 @@ module PoolParty
104
106
  end
105
107
 
106
108
  def copy_misc_templates
107
- ["namespaceauth.conf"].each do |f|
109
+ ["namespaceauth.conf", "yaws.conf"].each do |f|
108
110
  copy_file_to_storage_directory(::File.join(::File.dirname(__FILE__), "..", "templates", f))
109
111
  end
110
112
  end
@@ -6,13 +6,10 @@ class Loggable
6
6
  Logging.init :debug, :info, :warn, :error, :fatal
7
7
 
8
8
  self.class.loggers << file_logger
9
- file_logger.level = :warn
10
-
11
- self.class.loggers << stdout_logger
12
- stdout_logger.level = :info
9
+ file_logger.level = :info
13
10
  end
14
11
  def file_logger
15
- @file_logger ||= Logging.logger( ::File.join(Base.pool_logger_location, "pool_log.log"), logging_opts )
12
+ @file_logger ||= Logging.logger( Base.pool_logger_location, logging_opts )
16
13
  end
17
14
  def stdout_logger
18
15
  @stdout_logger ||= Logging.logger(STDOUT, logging_opts.merge({:pattern => "%m\n"}))
@@ -0,0 +1,19 @@
1
+ # Configuration file for Yaws HTTP daemon
2
+
3
+ # This config defines virtual server localhost. It is
4
+ # enabled by default. If you want to disable it, remove
5
+ # symlink from /etc/yaws/conf.d/.
6
+
7
+ # Instead you may edit this file and after that reload
8
+ # yaws configureation using invoke-rc.d yaws reload
9
+
10
+ # (If you want to use privileged port, run yaws as root,
11
+ # setting YAWS_USER in /etc/default/yaws, or use port
12
+ # redirection, e.g. via iptables.)
13
+
14
+ <server localhost>
15
+ port = 8000
16
+ listen = 0.0.0.0
17
+ docroot = /var/www/cloudpanel
18
+ # dir_listings = true
19
+ </server>
@@ -2,7 +2,7 @@ module PoolParty
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 39
5
+ TINY = 40
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/lib/poolparty.rb CHANGED
@@ -28,13 +28,13 @@ module PoolParty
28
28
  include FileWriter
29
29
 
30
30
  def logger
31
- @pool_logger ||= make_new_logger
31
+ @logger ||= make_new_logger
32
32
  end
33
33
 
34
34
  private
35
35
  #:nodoc:#
36
36
  def make_new_logger
37
- FileUtils.mkdir_p Base.pool_logger_location unless ::File.directory?(Base.pool_logger_location)
37
+ FileUtils.mkdir_p ::File.dirname(Base.pool_logger_location) unless ::File.directory?(::File.dirname(Base.pool_logger_location))
38
38
  Loggable.new
39
39
  end
40
40
  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.39
4
+ version: 0.2.40
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-02 00:00:00 -07:00
12
+ date: 2008-11-04 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -62,6 +62,7 @@ executables:
62
62
  - cloud-contract
63
63
  - cloud-ensure-provisioning
64
64
  - cloud-expand
65
+ - cloud-handle-load
65
66
  - cloud-list
66
67
  - cloud-maintain
67
68
  - cloud-osxcopy
@@ -97,6 +98,7 @@ extra_rdoc_files:
97
98
  - PostInstall.txt
98
99
  - README.txt
99
100
  - lib/erlang/messenger/lib/eunit/examples/tests.txt
101
+ - lib/poolparty/config/postlaunchmessage.txt
100
102
  - website/index.txt
101
103
  files:
102
104
  - History.txt
@@ -111,6 +113,7 @@ files:
111
113
  - bin/cloud-contract
112
114
  - bin/cloud-ensure-provisioning
113
115
  - bin/cloud-expand
116
+ - bin/cloud-handle-load
114
117
  - bin/cloud-list
115
118
  - bin/cloud-maintain
116
119
  - bin/cloud-osxcopy
@@ -146,21 +149,127 @@ files:
146
149
  - generators/poolspec/USAGE
147
150
  - generators/poolspec/poolspec_generator.rb
148
151
  - generators/poolspec/templates/pool_spec_template.erb
152
+ - lib/erlang/cloudpanel/EMakefile
149
153
  - lib/erlang/cloudpanel/Makefile
154
+ - lib/erlang/cloudpanel/cloudpanel.rb
155
+ - lib/erlang/cloudpanel/deps/mochiweb/LICENSE
156
+ - lib/erlang/cloudpanel/deps/mochiweb/Makefile
157
+ - lib/erlang/cloudpanel/deps/mochiweb/README
158
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochifmt.html
159
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochifmt_records.html
160
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochifmt_std.html
161
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochihex.html
162
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochijson.html
163
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochijson2.html
164
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochinum.html
165
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb.html
166
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_app.html
167
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_charref.html
168
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_cookies.html
169
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_echo.html
170
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_headers.html
171
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_html.html
172
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_http.html
173
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_multipart.html
174
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_request.html
175
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_response.html
176
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_skel.html
177
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_socket_server.html
178
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_sup.html
179
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/mochiweb_util.html
180
+ - lib/erlang/cloudpanel/deps/mochiweb/doc/reloader.html
181
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochifmt.beam
182
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochifmt_records.beam
183
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochifmt_std.beam
184
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochihex.beam
185
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochijson.beam
186
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochijson2.beam
187
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochinum.beam
188
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb.app
189
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb.beam
190
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_app.beam
191
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_charref.beam
192
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_cookies.beam
193
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_echo.beam
194
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_headers.beam
195
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_html.beam
196
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_http.beam
197
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_multipart.beam
198
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_request.beam
199
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_response.beam
200
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_skel.beam
201
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_socket_server.beam
202
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_sup.beam
203
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/mochiweb_util.beam
204
+ - lib/erlang/cloudpanel/deps/mochiweb/ebin/reloader.beam
205
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/Makefile
206
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/priv/www/index.html
207
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/src/Makefile
208
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/src/skel.app
209
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/src/skel.erl
210
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/src/skel.hrl
211
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/src/skel_app.erl
212
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/src/skel_deps.erl
213
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/src/skel_sup.erl
214
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/src/skel_web.erl
215
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/start-dev.sh
216
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/start.sh
217
+ - lib/erlang/cloudpanel/deps/mochiweb/priv/skel/support/include.mk
218
+ - lib/erlang/cloudpanel/deps/mochiweb/scripts/new_mochiweb.erl
219
+ - lib/erlang/cloudpanel/deps/mochiweb/src/Makefile
220
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochifmt.erl
221
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochifmt_records.erl
222
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochifmt_std.erl
223
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochihex.erl
224
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochijson.erl
225
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochijson2.erl
226
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochinum.erl
227
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb.app
228
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb.erl
229
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_app.erl
230
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_charref.erl
231
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_cookies.erl
232
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_echo.erl
233
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_headers.erl
234
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_html.erl
235
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_http.erl
236
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_multipart.erl
237
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_request.erl
238
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_response.erl
239
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_skel.erl
240
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_socket_server.erl
241
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_sup.erl
242
+ - lib/erlang/cloudpanel/deps/mochiweb/src/mochiweb_util.erl
243
+ - lib/erlang/cloudpanel/deps/mochiweb/src/reloader.erl
244
+ - lib/erlang/cloudpanel/deps/mochiweb/support/include.mk
150
245
  - lib/erlang/cloudpanel/doc/cloudpanel.html
151
246
  - lib/erlang/cloudpanel/doc/cloudpanel_app.html
152
247
  - lib/erlang/cloudpanel/doc/cloudpanel_deps.html
153
248
  - lib/erlang/cloudpanel/doc/cloudpanel_sup.html
154
249
  - lib/erlang/cloudpanel/doc/cloudpanel_web.html
250
+ - lib/erlang/cloudpanel/doc/string.html
155
251
  - lib/erlang/cloudpanel/ebin/cloudpanel.app
156
252
  - lib/erlang/cloudpanel/ebin/cloudpanel.beam
157
253
  - lib/erlang/cloudpanel/ebin/cloudpanel_app.beam
158
254
  - lib/erlang/cloudpanel/ebin/cloudpanel_deps.beam
159
255
  - lib/erlang/cloudpanel/ebin/cloudpanel_sup.beam
160
256
  - lib/erlang/cloudpanel/ebin/cloudpanel_web.beam
257
+ - lib/erlang/cloudpanel/ebin/string.beam
258
+ - lib/erlang/cloudpanel/ebin/tail_log.beam
259
+ - lib/erlang/cloudpanel/ebin/tailor.beam
260
+ - lib/erlang/cloudpanel/ebin/utils.beam
261
+ - lib/erlang/cloudpanel/ebin/views.beam
262
+ - lib/erlang/cloudpanel/ebin/web_utils.beam
161
263
  - lib/erlang/cloudpanel/priv/www/images/bg_content.gif
162
264
  - lib/erlang/cloudpanel/priv/www/index.html
163
265
  - lib/erlang/cloudpanel/priv/www/javascripts/jquery.js
266
+ - lib/erlang/cloudpanel/priv/www/javascripts/site.js
267
+ - lib/erlang/cloudpanel/priv/www/pages/index.html
268
+ - lib/erlang/cloudpanel/priv/www/pages/tail.html
269
+ - lib/erlang/cloudpanel/priv/www/partials/error.html
270
+ - lib/erlang/cloudpanel/priv/www/partials/footer.html
271
+ - lib/erlang/cloudpanel/priv/www/partials/header.html
272
+ - lib/erlang/cloudpanel/priv/www/partials/menu.html
164
273
  - lib/erlang/cloudpanel/priv/www/stylesheets/application.css
165
274
  - lib/erlang/cloudpanel/priv/www/stylesheets/classes.css
166
275
  - lib/erlang/cloudpanel/priv/www/stylesheets/colors.css
@@ -173,9 +282,15 @@ files:
173
282
  - lib/erlang/cloudpanel/src/cloudpanel_deps.erl
174
283
  - lib/erlang/cloudpanel/src/cloudpanel_sup.erl
175
284
  - lib/erlang/cloudpanel/src/cloudpanel_web.erl
285
+ - lib/erlang/cloudpanel/src/string.erl
286
+ - lib/erlang/cloudpanel/src/tail_log.erl
287
+ - lib/erlang/cloudpanel/src/tailor.erl
288
+ - lib/erlang/cloudpanel/src/utils.erl
289
+ - lib/erlang/cloudpanel/src/views.erl
176
290
  - lib/erlang/cloudpanel/start-dev.sh
177
291
  - lib/erlang/cloudpanel/start.sh
178
292
  - lib/erlang/cloudpanel/support/include.mk
293
+ - lib/erlang/cloudpanel/yaws.conf
179
294
  - lib/erlang/messenger/Emakefile
180
295
  - lib/erlang/messenger/Makefile
181
296
  - lib/erlang/messenger/README
@@ -282,6 +397,7 @@ files:
282
397
  - lib/poolparty/base_packages/poolparty.rb
283
398
  - lib/poolparty/base_packages/ruby.rb
284
399
  - lib/poolparty/config/allowed_commands.yml
400
+ - lib/poolparty/config/postlaunchmessage.txt
285
401
  - lib/poolparty/core/array.rb
286
402
  - lib/poolparty/core/class.rb
287
403
  - lib/poolparty/core/exception.rb
@@ -298,6 +414,7 @@ files:
298
414
  - lib/poolparty/core/time.rb
299
415
  - lib/poolparty/dependency_resolutions/base.rb
300
416
  - lib/poolparty/dependency_resolutions/puppet.rb
417
+ - lib/poolparty/exceptions/LoadRulesException.rb
301
418
  - lib/poolparty/exceptions/MasterException.rb
302
419
  - lib/poolparty/exceptions/RemoteException.rb
303
420
  - lib/poolparty/exceptions/ResourceException.rb
@@ -368,8 +485,10 @@ files:
368
485
  - lib/poolparty/templates/puppet.conf
369
486
  - lib/poolparty/templates/puppetcleaner
370
487
  - lib/poolparty/templates/puppetrerun
488
+ - lib/poolparty/templates/yaws.conf
371
489
  - lib/poolparty/version.rb
372
490
  - lib/poolpartycl.rb
491
+ - log/pool.logs
373
492
  - poolparty.gemspec
374
493
  - script/destroy
375
494
  - script/generate
@@ -12,6 +12,39 @@ describe "Rules" do
12
12
  before(:each) do
13
13
  @car = Car.new
14
14
  end
15
+ describe "malformed rules" do
16
+ it "should not put a malformed rule in the rules" do
17
+ lambda {
18
+ @plaster = Class.new do
19
+ include Aska
20
+ rules :names, "x runs b"
21
+ end
22
+ }.should raise_error()
23
+ end
24
+ [
25
+ "k > 10",
26
+ "x == 2",
27
+ "x >= 2",
28
+ "x <= 4",
29
+ "y < 10"
30
+ ].each do |str|
31
+ eval <<-EOE
32
+ it "should have the rule #{str} be valid" do
33
+ (str =~ /(.+)[=\\\<\>](.*)/).nil?.should == false
34
+ end
35
+ EOE
36
+ end
37
+ [
38
+ "k running 10",
39
+ "10 is larger than 2"
40
+ ].each do |str|
41
+ eval <<-EOE
42
+ it "should have the rule #{str} not be valid" do
43
+ (str =~ /(.+)[=\\\<\>](.*)/).nil?.should == true
44
+ end
45
+ EOE
46
+ end
47
+ end
15
48
  it "should be able to define rules as an array and they should be set as the rules on the class" do
16
49
  @car.rules.class.should == Hash
17
50
  end
@@ -25,13 +25,13 @@ describe "Hash" do
25
25
  @a.to_os.to_hash.should == @a
26
26
  end
27
27
  it "should not put quotes around integers" do
28
- {:a => 10, :b => "q"}.flush_out.should == ["a => 10", "b => 'q'"]
28
+ {:a => 10, :b => "q"}.flush_out.sort.should == ["a => 10", "b => 'q'"]
29
29
  end
30
30
  it "should be able to flush out into a string into an array" do
31
- @a.flush_out.should == ["a => '10'","b => '20'","c => '30'"]
31
+ @a.flush_out.sort.should == ["a => '10'","b => '20'","c => '30'"]
32
32
  end
33
33
  it "should be able to flush out with pre and posts" do
34
- @a.flush_out("hi", "ho").should == ["hia => '10'ho","hib => '20'ho","hic => '30'ho"]
34
+ @a.flush_out("hi", "ho").sort.should == ["hia => '10'ho","hib => '20'ho","hic => '30'ho"]
35
35
  end
36
36
  describe "select" do
37
37
  before(:each) do