rubber 2.0.5 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +2 -2
- data/CHANGELOG +50 -0
- data/lib/rubber/commands/cron.rb +9 -11
- data/lib/rubber/commands/util.rb +1 -0
- data/lib/rubber/dns.rb +29 -4
- data/lib/rubber/dns/aws.rb +181 -0
- data/lib/rubber/dns/nettica.rb +74 -36
- data/lib/rubber/dns/zerigo.rb +110 -4
- data/lib/rubber/instance.rb +1 -1
- data/lib/rubber/recipes/rubber/instances.rb +13 -5
- data/lib/rubber/recipes/rubber/security_groups.rb +1 -1
- data/lib/rubber/recipes/rubber/setup.rb +80 -64
- data/lib/rubber/util.rb +7 -0
- data/lib/rubber/version.rb +1 -1
- data/templates/base/config/rubber/deploy-setup.rb +12 -0
- data/templates/base/config/rubber/rubber-dns.yml +17 -21
- data/templates/base/config/rubber/rubber.yml +2 -2
- data/templates/collectd/config/rubber/role/passenger/passenger-status-sudoers.conf +1 -1
- data/templates/elasticsearch/config/rubber/rubber-elasticsearch.yml +1 -1
- data/templates/graphite/config/rubber/role/graphite_web/dashboard.html +5 -3
- data/templates/jenkins/config/environments/jenkins.rb +1 -1
- data/templates/jenkins/config/rubber/rubber-jenkins.yml +1 -1
- data/templates/passenger/config/rubber/deploy-passenger.rb +0 -8
- data/templates/postgresql/config/rubber/rubber-postgresql.yml +2 -2
- data/templates/resque/config/initializers/resque.rb +2 -2
- data/templates/resque/config/resque.yml +4 -0
- data/templates/resque/config/rubber/common/resque.yml +1 -1
- data/templates/resque_scheduler/config/rubber/common/resque_schedule.yml +9 -0
- data/templates/resque_scheduler/config/rubber/deploy-resque_scheduler.rb +38 -0
- data/templates/resque_scheduler/config/rubber/role/resque_scheduler/resque-scheduler-upstart.conf +20 -0
- data/templates/resque_scheduler/config/rubber/rubber-resque_scheduler.yml +7 -0
- data/templates/resque_scheduler/lib/tasks/resque-scheduler.rake +28 -0
- data/templates/resque_scheduler/templates.rb +1 -0
- data/templates/resque_scheduler/templates.yml +3 -0
- data/templates/torquebox/config/rubber/rubber-torquebox.yml +1 -1
- data/templates/zookeeper/config/rubber/role/zookeeper/myid.conf +5 -4
- data/templates/zookeeper/config/rubber/role/zookeeper/zoo.cfg +6 -1
- data/test/command_test.rb +0 -55
- data/test/commands/cron_test.rb +83 -0
- data/test/dns/aws_test.rb +192 -0
- data/test/dns/zerigo_test.rb +180 -0
- data/test/instance_test.rb +17 -2
- data/test/test_helper.rb +37 -2
- metadata +20 -8
- data/lib/rubber/dns/fog.rb +0 -219
- data/test/dns/fog_test.rb +0 -169
@@ -75,11 +75,11 @@ cloud_providers:
|
|
75
75
|
|
76
76
|
# REQUIRED: the ami and instance type for creating instances
|
77
77
|
# The Ubuntu images at http://alestic.com/ work well
|
78
|
-
# Ubuntu 12.04 Precise instance-store 64-bit: ami-
|
78
|
+
# Ubuntu 12.04 Precise instance-store 64-bit: ami-eafa5883
|
79
79
|
#
|
80
80
|
# m1.small or m1.large or m1.xlarge
|
81
81
|
image_type: m1.small
|
82
|
-
image_id: ami-
|
82
|
+
image_id: ami-eafa5883
|
83
83
|
|
84
84
|
# OPTIONAL: EC2 spot instance request support.
|
85
85
|
#
|
@@ -2,7 +2,7 @@
|
|
2
2
|
@path = '/etc/sudoers'
|
3
3
|
@additive = ["# passenger-status start", "# passenger-status end"]
|
4
4
|
%>
|
5
|
-
Defaults env_keep
|
5
|
+
Defaults env_keep += GEM_PATH
|
6
6
|
|
7
7
|
nobody ALL=(ALL) NOPASSWD: <%= rubber_env.rvm_gem_home %>/bin/passenger-status
|
8
8
|
nobody ALL=(ALL) NOPASSWD: <%= rubber_env.rvm_gem_home %>/bin/passenger-memory-stats
|
@@ -212,10 +212,12 @@ Simple graphite dashboard cycler for use on a large display - e.g. googletv/chro
|
|
212
212
|
var defn = e[1];
|
213
213
|
var params = $.extend(true, {}, defaultParams); // deep copy
|
214
214
|
params = $.extend(true, params, defn); // deep copy
|
215
|
-
params["target"] = params["target"][0];
|
216
|
-
|
217
|
-
var url = ROOT_URL + "/render?" + $.param(params);
|
218
215
|
|
216
|
+
// graphite only works with target=abc&target=xyz not with
|
217
|
+
// standard form of target[]=abc&target[]=xyz
|
218
|
+
var encoded_params = $.param(params).replace(/target%5B%5D=/g, "target=");
|
219
|
+
var url = ROOT_URL + "/render?" + encoded_params;
|
220
|
+
|
219
221
|
return url;
|
220
222
|
});
|
221
223
|
return urls;
|
@@ -21,14 +21,6 @@ namespace :rubber do
|
|
21
21
|
ENDSCRIPT
|
22
22
|
end
|
23
23
|
|
24
|
-
# passenger does things differently for rack apps, so if this is a rails app, remove config.ru
|
25
|
-
# to stop passenger from treating this like a rack app
|
26
|
-
after "deploy:update_code", "rubber:passenger:remove_config_ru" if Rubber::Util.is_rails?
|
27
|
-
|
28
|
-
task :remove_config_ru, :roles => :passenger do
|
29
|
-
rsudo "rm -f #{releases_path}/*/config.ru"
|
30
|
-
end
|
31
|
-
|
32
24
|
# passenger depends on apache for start/stop/restart, just need these defined
|
33
25
|
# as apache hooks into standard deploy lifecycle
|
34
26
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# REQUIRED: The credentials for creating/accessing your app's database
|
2
2
|
#
|
3
|
-
db_user: "#{app_name[0,16]}"
|
3
|
+
db_user: "#{app_name[0,16].downcase}"
|
4
4
|
db_pass:
|
5
|
-
db_name: "#{app_name}_#{Rubber.env}"
|
5
|
+
db_name: "#{app_name.downcase}_#{Rubber.env}"
|
6
6
|
|
7
7
|
db_replication_user: replication
|
8
8
|
db_replication_pass:
|
@@ -1,10 +1,10 @@
|
|
1
1
|
|
2
2
|
redis_host = 'localhost:6379'
|
3
3
|
|
4
|
-
resque_yml = Rubber.root + '/config/resque.yml'
|
4
|
+
resque_yml = Rubber.root.to_s + '/config/resque.yml'
|
5
5
|
if File.exist? resque_yml
|
6
6
|
resque_config = YAML.load_file(resque_yml)
|
7
|
-
redis_host = resque_config[
|
7
|
+
redis_host = resque_config[Rubber.env]
|
8
8
|
end
|
9
9
|
|
10
10
|
Resque.redis = redis_host
|
@@ -0,0 +1,38 @@
|
|
1
|
+
namespace :rubber do
|
2
|
+
|
3
|
+
namespace :resque_scheduler do
|
4
|
+
|
5
|
+
rubber.allow_optional_tasks(self)
|
6
|
+
|
7
|
+
before "deploy:stop", "rubber:resque_scheduler:stop"
|
8
|
+
after "deploy:start", "rubber:resque_scheduler:start"
|
9
|
+
after "deploy:restart", "rubber:resque_scheduler:restart"
|
10
|
+
|
11
|
+
desc "Stops the resque_scheduler"
|
12
|
+
task :stop, :roles => :resque_scheduler do
|
13
|
+
rsudo "service resque-scheduler stop || true"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Starts the resque_scheduler"
|
17
|
+
task :start, :roles => :resque_scheduler do
|
18
|
+
rsudo "service resque-scheduler start"
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Restarts the resque_scheduler"
|
22
|
+
task :restart, :roles => :resque_scheduler do
|
23
|
+
stop
|
24
|
+
start
|
25
|
+
end
|
26
|
+
|
27
|
+
# pauses deploy until daemon is up so monit doesn't try and start it
|
28
|
+
before "rubber:monit:start", "rubber:resque_scheduler:wait_start"
|
29
|
+
task :wait_start, :roles => :resque_scheduler do
|
30
|
+
logger.info "Waiting for scheduler daemon pid file to show up"
|
31
|
+
|
32
|
+
run "while ! test -f #{rubber_env.resque_scheduler_pid_file}; do sleep 1; done"
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/templates/resque_scheduler/config/rubber/role/resque_scheduler/resque-scheduler-upstart.conf
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
<%
|
2
|
+
@path = "/etc/init/resque-scheduler.conf"
|
3
|
+
@backup = false
|
4
|
+
%>
|
5
|
+
description "resque scheduler daemon"
|
6
|
+
|
7
|
+
start on runlevel [2345]
|
8
|
+
stop on runlevel [016]
|
9
|
+
|
10
|
+
script
|
11
|
+
exec sudo -u <%= rubber_env.app_user %> /bin/bash -l -c 'cd <%= Rubber.root %> && exec bundle exec rake resque:scheduler >> log/resque-scheduler_upstart.log 2>&1'
|
12
|
+
end script
|
13
|
+
|
14
|
+
post-start script
|
15
|
+
status resque-scheduler | head -n1 | awk '{print $NF}' > <%= rubber_env.resque_scheduler_pid_file %>
|
16
|
+
end script
|
17
|
+
|
18
|
+
post-stop script
|
19
|
+
rm -f <%= rubber_env.resque_scheduler_pid_file %>
|
20
|
+
end script
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Resque tasks
|
2
|
+
require 'resque/tasks'
|
3
|
+
require 'resque_scheduler/tasks'
|
4
|
+
|
5
|
+
namespace :resque do
|
6
|
+
|
7
|
+
task :setup do
|
8
|
+
# If you want to be able to dynamically change the schedule,
|
9
|
+
# uncomment this line. A dynamic schedule can be updated via the
|
10
|
+
# Resque::Scheduler.set_schedule (and remove_schedule) methods.
|
11
|
+
# When dynamic is set to true, the scheduler process looks for
|
12
|
+
# schedule changes and applies them on the fly.
|
13
|
+
# Note: This feature is only available in >=2.0.0.
|
14
|
+
#Resque::Scheduler.dynamic = true
|
15
|
+
|
16
|
+
# The schedule doesn't need to be stored in a YAML, it just needs to
|
17
|
+
# be a hash. YAML is usually the easiest.
|
18
|
+
# Resque.schedule = YAML.load_file('your_resque_schedule.yml')
|
19
|
+
|
20
|
+
# If your schedule already has +queue+ set for each job, you don't
|
21
|
+
# need to require your jobs. This can be an advantage since it's
|
22
|
+
# less code that resque-scheduler needs to know about. But in a small
|
23
|
+
# project, it's usually easier to just include you job classes here.
|
24
|
+
# So, something like this:
|
25
|
+
# require 'jobs'
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
append_to_file 'Gemfile', "gem 'resque-scheduler', :require => ['resque_scheduler', 'resque_scheduler/server']\n" if Rubber::Util::is_bundler?
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
2
|
-
@path = "#{rubber_env.
|
3
|
-
|
4
|
-
|
1
|
+
<%-
|
2
|
+
@path = "#{rubber_env.zookeeper_data_dir}/myid"
|
3
|
+
require 'zlib'
|
4
|
+
-%>
|
5
|
+
<%= Zlib.crc32(rubber_env.host) %>
|
@@ -1,7 +1,10 @@
|
|
1
1
|
<%
|
2
2
|
@path = "#{rubber_env.zookeeper_install_dir}/conf/zoo.cfg"
|
3
3
|
@post = "mkdir -p #{rubber_env.zookeeper_data_dir}"
|
4
|
+
require 'zlib'
|
4
5
|
%>
|
6
|
+
# Docs at http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_advancedConfiguration
|
7
|
+
|
5
8
|
# The number of milliseconds of each tick
|
6
9
|
tickTime=2000
|
7
10
|
# The number of ticks that the initial
|
@@ -14,13 +17,15 @@ syncLimit=5
|
|
14
17
|
dataDir=<%= rubber_env.zookeeper_data_dir %>
|
15
18
|
# the port at which the clients will connect
|
16
19
|
clientPort=<%= rubber_env.zookeeper_client_port %>
|
20
|
+
# limit to # of connections from a client (IP), default 10, 0 for unlimited
|
21
|
+
maxClientCnxns=0
|
17
22
|
|
18
23
|
<%
|
19
24
|
zookeeper_hosts = rubber_instances.for_role("zookeeper")
|
20
25
|
if zookeeper_hosts.size > 1
|
21
26
|
zookeeper_hosts.each do |ic|
|
22
27
|
%>
|
23
|
-
server.<%= ic.name
|
28
|
+
server.<%= Zlib.crc32(ic.name) %>=<%= ic.name %>:2888:3888
|
24
29
|
<%
|
25
30
|
end
|
26
31
|
end
|
data/test/command_test.rb
CHANGED
@@ -3,14 +3,9 @@ require File.expand_path(File.join(__FILE__, '..', 'test_helper'))
|
|
3
3
|
class CommandTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
def setup
|
6
|
-
system("rm -f #{Rubber.root}/log/*.log")
|
7
6
|
ENV['RUBBER_ROOT'] = Rubber.root
|
8
7
|
end
|
9
8
|
|
10
|
-
def teardown
|
11
|
-
system("rm -f #{Rubber.root}/log/*.log")
|
12
|
-
end
|
13
|
-
|
14
9
|
def test_rubber_help
|
15
10
|
out = `rubber`
|
16
11
|
assert out =~ /Subcommands:\n(.*)\nOptions:/m
|
@@ -31,55 +26,5 @@ class CommandTest < Test::Unit::TestCase
|
|
31
26
|
end
|
32
27
|
|
33
28
|
end
|
34
|
-
|
35
|
-
def test_rubber_cron_basic
|
36
|
-
date = Time.now.tv_sec.to_s
|
37
|
-
out = `rubber cron echo #{date}`
|
38
|
-
|
39
|
-
assert_equal 0, $?
|
40
|
-
assert_equal "", out
|
41
|
-
|
42
|
-
logs = Dir["#{Rubber.root}/log/*.log"]
|
43
|
-
assert_equal 1, logs.size
|
44
|
-
assert_equal date, File.read(logs.first).strip
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_rubber_cron_logfile
|
48
|
-
date = Time.now.tv_sec.to_s
|
49
|
-
out = `rubber cron -l #{Rubber.root}/log/foo.log -- echo #{date}`
|
50
|
-
logs = Dir["#{Rubber.root}/log/*.log"]
|
51
|
-
assert_equal 1, logs.size
|
52
|
-
assert_equal "#{Rubber.root}/log/foo.log", logs.first
|
53
|
-
assert_equal date, File.read(logs.first).strip
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_rubber_cron_task_logfile
|
57
|
-
date = Time.now.tv_sec.to_s
|
58
|
-
out = `rubber cron --task -- cron -o -- echo #{date}`
|
59
|
-
logs = Dir["#{Rubber.root}/log/cron-task*.log"]
|
60
|
-
assert_equal 1, logs.size
|
61
|
-
assert_equal date, File.read(logs.first).strip
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_rubber_cron_directory_changed
|
65
|
-
out = `rubber cron -o -r /tmp -- pwd`
|
66
|
-
assert_match /(\/private)?\/tmp/, out, "Unexpected output:\n#{out}"
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_rubber_cron_output_empty
|
70
|
-
out = `rubber cron -- ls -la`
|
71
|
-
assert_equal "", out, "Unexpected output:\n#{out}"
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_rubber_cron_output_echoed
|
75
|
-
out = `rubber cron -o -- ls -la`
|
76
|
-
assert_not_equal "", out, "Unexpected output:\n#{out}"
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_rubber_cron_output_on_error
|
80
|
-
out = `rubber cron -- ls -la jkbhbj`
|
81
|
-
assert_not_equal 0, $?
|
82
|
-
assert_not_equal "", out, "Unexpected output:\n#{out}"
|
83
|
-
end
|
84
29
|
|
85
30
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require File.expand_path(File.join(__FILE__, '../..', 'test_helper'))
|
2
|
+
|
3
|
+
class CronTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
system("rm -f #{Rubber.root}/log/*.log")
|
7
|
+
ENV['RUBBER_ROOT'] = Rubber.root
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
system("rm -f #{Rubber.root}/log/*.log")
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_rubber_cron_basic
|
15
|
+
date = Time.now.tv_sec.to_s
|
16
|
+
out = `rubber cron echo #{date}`
|
17
|
+
|
18
|
+
assert_equal 0, $?
|
19
|
+
assert_equal "", out
|
20
|
+
|
21
|
+
logs = Dir["#{Rubber.root}/log/*.log"]
|
22
|
+
assert_equal 1, logs.size
|
23
|
+
assert_equal "#{Rubber.root}/log/cron-sh-echo.log", logs.first
|
24
|
+
assert_match /rubber:cron running \["echo", "#{date}"\] at/, File.read(logs.first).strip
|
25
|
+
assert_match /\n#{date}$/, File.read(logs.first).strip
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_rubber_cron_log_append
|
29
|
+
date = Time.now.tv_sec.to_s
|
30
|
+
|
31
|
+
out = `rubber cron echo #{date}`
|
32
|
+
assert_equal 0, $?
|
33
|
+
assert_equal "", out
|
34
|
+
|
35
|
+
out = `rubber cron echo #{date}`
|
36
|
+
assert_equal 0, $?
|
37
|
+
assert_equal "", out
|
38
|
+
|
39
|
+
logs = Dir["#{Rubber.root}/log/*.log"]
|
40
|
+
assert_equal 1, logs.size
|
41
|
+
running_lines = File.read(logs.first).lines.to_a.grep(/rubber:cron running/)
|
42
|
+
assert_equal 2, running_lines.size
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_rubber_cron_logfile
|
46
|
+
date = Time.now.tv_sec.to_s
|
47
|
+
out = `rubber cron -l #{Rubber.root}/log/foo.log -- echo #{date}`
|
48
|
+
logs = Dir["#{Rubber.root}/log/*.log"]
|
49
|
+
assert_equal 1, logs.size
|
50
|
+
assert_equal "#{Rubber.root}/log/foo.log", logs.first
|
51
|
+
assert_match /\n#{date}$/, File.read(logs.first).strip
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_rubber_cron_task_logfile
|
55
|
+
date = Time.now.tv_sec.to_s
|
56
|
+
out = `rubber cron --task -- cron -o -- echo #{date}`
|
57
|
+
logs = Dir["#{Rubber.root}/log/cron-task*.log"]
|
58
|
+
assert_equal 1, logs.size
|
59
|
+
assert_match /\n#{date}$/, File.read(logs.first).strip
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_rubber_cron_directory_changed
|
63
|
+
out = `rubber cron -o -r /tmp -- pwd`
|
64
|
+
assert_match /(\/private)?\/tmp/, out, "Unexpected output:\n#{out}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_rubber_cron_output_empty
|
68
|
+
out = `rubber cron -- ls -la`
|
69
|
+
assert_equal "", out, "Unexpected output:\n#{out}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_rubber_cron_output_echoed
|
73
|
+
out = `rubber cron -o -- ls -la`
|
74
|
+
assert_not_equal "", out, "Unexpected output:\n#{out}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_rubber_cron_output_on_error
|
78
|
+
out = `rubber cron -- ls -la jkbhbj`
|
79
|
+
assert_not_equal 0, $?
|
80
|
+
assert_not_equal "", out, "Unexpected output:\n#{out}"
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|