auser-poolparty 0.2.39 → 0.2.40

Sign up to get free protection for your applications and to get access to all the features.
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