sunshine 1.0.0.pre
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/History.txt +237 -0
- data/Manifest.txt +70 -0
- data/README.txt +277 -0
- data/Rakefile +46 -0
- data/bin/sunshine +5 -0
- data/examples/deploy.rb +61 -0
- data/examples/deploy_tasks.rake +112 -0
- data/examples/standalone_deploy.rb +31 -0
- data/lib/commands/add.rb +96 -0
- data/lib/commands/default.rb +169 -0
- data/lib/commands/list.rb +322 -0
- data/lib/commands/restart.rb +62 -0
- data/lib/commands/rm.rb +83 -0
- data/lib/commands/run.rb +151 -0
- data/lib/commands/start.rb +72 -0
- data/lib/commands/stop.rb +61 -0
- data/lib/sunshine/app.rb +876 -0
- data/lib/sunshine/binder.rb +70 -0
- data/lib/sunshine/crontab.rb +143 -0
- data/lib/sunshine/daemon.rb +380 -0
- data/lib/sunshine/daemons/ar_sendmail.rb +28 -0
- data/lib/sunshine/daemons/delayed_job.rb +30 -0
- data/lib/sunshine/daemons/nginx.rb +104 -0
- data/lib/sunshine/daemons/rainbows.rb +35 -0
- data/lib/sunshine/daemons/server.rb +66 -0
- data/lib/sunshine/daemons/unicorn.rb +26 -0
- data/lib/sunshine/dependencies.rb +103 -0
- data/lib/sunshine/dependency_lib.rb +200 -0
- data/lib/sunshine/exceptions.rb +54 -0
- data/lib/sunshine/healthcheck.rb +83 -0
- data/lib/sunshine/output.rb +131 -0
- data/lib/sunshine/package_managers/apt.rb +48 -0
- data/lib/sunshine/package_managers/dependency.rb +349 -0
- data/lib/sunshine/package_managers/gem.rb +54 -0
- data/lib/sunshine/package_managers/yum.rb +62 -0
- data/lib/sunshine/remote_shell.rb +241 -0
- data/lib/sunshine/repo.rb +128 -0
- data/lib/sunshine/repos/git_repo.rb +122 -0
- data/lib/sunshine/repos/rsync_repo.rb +29 -0
- data/lib/sunshine/repos/svn_repo.rb +78 -0
- data/lib/sunshine/server_app.rb +554 -0
- data/lib/sunshine/shell.rb +384 -0
- data/lib/sunshine.rb +391 -0
- data/templates/logrotate/logrotate.conf.erb +11 -0
- data/templates/nginx/nginx.conf.erb +109 -0
- data/templates/nginx/nginx_optimize.conf +23 -0
- data/templates/nginx/nginx_proxy.conf +13 -0
- data/templates/rainbows/rainbows.conf.erb +18 -0
- data/templates/tasks/sunshine.rake +114 -0
- data/templates/unicorn/unicorn.conf.erb +6 -0
- data/test/fixtures/app_configs/test_app.yml +11 -0
- data/test/fixtures/sunshine_test/test_upload +0 -0
- data/test/mocks/mock_object.rb +179 -0
- data/test/mocks/mock_open4.rb +117 -0
- data/test/test_helper.rb +188 -0
- data/test/unit/test_app.rb +489 -0
- data/test/unit/test_binder.rb +20 -0
- data/test/unit/test_crontab.rb +128 -0
- data/test/unit/test_git_repo.rb +26 -0
- data/test/unit/test_healthcheck.rb +70 -0
- data/test/unit/test_nginx.rb +107 -0
- data/test/unit/test_rainbows.rb +26 -0
- data/test/unit/test_remote_shell.rb +102 -0
- data/test/unit/test_repo.rb +42 -0
- data/test/unit/test_server.rb +324 -0
- data/test/unit/test_server_app.rb +425 -0
- data/test/unit/test_shell.rb +97 -0
- data/test/unit/test_sunshine.rb +157 -0
- data/test/unit/test_svn_repo.rb +55 -0
- data/test/unit/test_unicorn.rb +22 -0
- metadata +217 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestHealthcheck < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@remote_shell = mock_remote_shell
|
7
|
+
@health = Sunshine::Healthcheck.new "somepath", @remote_shell
|
8
|
+
|
9
|
+
@test_disabled = "test -f #{@health.disabled_file}"
|
10
|
+
@test_enabled = "test -f #{@health.enabled_file}"
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def test_initialize
|
15
|
+
assert_equal @remote_shell, @health.shell
|
16
|
+
assert_equal "somepath/health.enabled", @health.enabled_file
|
17
|
+
assert_equal "somepath/health.disabled", @health.disabled_file
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def test_disable
|
22
|
+
@health.disable
|
23
|
+
|
24
|
+
cmd = "touch #{@health.disabled_file} && rm -f #{@health.enabled_file}"
|
25
|
+
assert_ssh_call cmd
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def test_enable
|
30
|
+
@health.enable
|
31
|
+
|
32
|
+
cmd = "rm -f #{@health.disabled_file} && touch #{@health.enabled_file}"
|
33
|
+
assert_ssh_call cmd
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def test_remove
|
38
|
+
@health.remove
|
39
|
+
|
40
|
+
cmd = "rm -f #{@health.disabled_file} #{@health.enabled_file}"
|
41
|
+
assert_ssh_call cmd
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def test_status_down
|
46
|
+
@remote_shell.set_mock_response 1,
|
47
|
+
@test_disabled => [:err, ""],
|
48
|
+
@test_enabled => [:err, ""]
|
49
|
+
|
50
|
+
assert_equal(:down, @health.status)
|
51
|
+
|
52
|
+
assert_ssh_call @test_disabled
|
53
|
+
assert_ssh_call @test_enabled
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def test_status_ok
|
58
|
+
@remote_shell.set_mock_response 1, @test_disabled => [:err, ""]
|
59
|
+
@remote_shell.set_mock_response 0, @test_enabled => [:out, ""]
|
60
|
+
|
61
|
+
assert_equal(:enabled, @health.status)
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def test_status_disabled
|
66
|
+
@remote_shell.set_mock_response 0, @test_disabled => [:out, ""]
|
67
|
+
|
68
|
+
assert_equal(:disabled, @health.status)
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestNginx < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@app = Sunshine::App.new TEST_APP_CONFIG_FILE
|
7
|
+
@app.server_apps.first.extend MockOpen4
|
8
|
+
@app.server_apps.first.shell.extend MockOpen4
|
9
|
+
use_remote_shell @app.server_apps.first.shell
|
10
|
+
|
11
|
+
@passenger = Sunshine::Nginx.new @app
|
12
|
+
@nginx = Sunshine::Nginx.new @app, :port => 5000, :point_to => @passenger
|
13
|
+
@gemout = <<-STR
|
14
|
+
|
15
|
+
*** LOCAL GEMS ***
|
16
|
+
|
17
|
+
passenger (2.2.4)
|
18
|
+
Author: Phusion - http://www.phusion.nl/
|
19
|
+
Rubyforge: http://rubyforge.org/projects/passenger
|
20
|
+
Homepage: http://www.modrails.com/
|
21
|
+
Installed at: /Library/Ruby/Gems/1.8
|
22
|
+
|
23
|
+
Apache module for Ruby on Rails support.
|
24
|
+
STR
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def test_cmd
|
29
|
+
ds = @nginx.app.server_apps.first.shell
|
30
|
+
ds.set_mock_response 0, "gem list passenger -d" => [:out, @gemout]
|
31
|
+
|
32
|
+
@nginx.start
|
33
|
+
@nginx.stop
|
34
|
+
|
35
|
+
assert_ssh_call start_cmd(@passenger)
|
36
|
+
assert_ssh_call stop_cmd(@passenger)
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def test_custom_sudo_cmd
|
41
|
+
ds = @nginx.app.server_apps.first.shell
|
42
|
+
ds.set_mock_response 0, "gem list passenger -d" => [:out, @gemout]
|
43
|
+
|
44
|
+
@nginx.sudo = "someuser"
|
45
|
+
|
46
|
+
@nginx.start
|
47
|
+
@nginx.stop
|
48
|
+
|
49
|
+
assert_ssh_call start_cmd(@passenger), ds, :sudo => @nginx.sudo
|
50
|
+
assert_ssh_call stop_cmd(@passenger), ds, :sudo => @nginx.sudo
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def test_sudo_cmd
|
55
|
+
ds = @passenger.app.server_apps.first.shell
|
56
|
+
ds.set_mock_response 0, "gem list passenger -d" => [:out, @gemout]
|
57
|
+
|
58
|
+
@passenger.start
|
59
|
+
@passenger.stop
|
60
|
+
|
61
|
+
assert_equal true, @passenger.sudo
|
62
|
+
assert_ssh_call start_cmd(@passenger), ds, :sudo => true
|
63
|
+
assert_ssh_call stop_cmd(@passenger), ds, :sudo => true
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def test_setup_passenger
|
68
|
+
ds = @passenger.app.server_apps.first.shell
|
69
|
+
ds.set_mock_response 0, "gem list passenger -d" => [:out, @gemout]
|
70
|
+
|
71
|
+
@passenger.setup do |ds, binder|
|
72
|
+
assert binder.sudo
|
73
|
+
assert binder.use_passenger?
|
74
|
+
assert_equal "/Library/Ruby/Gems/1.8/gems/passenger-2.2.4",
|
75
|
+
binder.passenger_root
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def test_setup
|
81
|
+
ds = @nginx.app.server_apps.first.shell
|
82
|
+
ds.set_mock_response 0, "gem list passenger -d" => [:out, @gemout]
|
83
|
+
|
84
|
+
@nginx.setup do |ds, binder|
|
85
|
+
assert !binder.sudo
|
86
|
+
assert !binder.use_passenger?
|
87
|
+
assert_equal "/Library/Ruby/Gems/1.8/gems/passenger-2.2.4",
|
88
|
+
binder.passenger_root
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
## Helper methods
|
94
|
+
|
95
|
+
def start_cmd svr, sudo=false
|
96
|
+
sudo = sudo ? "sudo " : ""
|
97
|
+
"#{sudo}#{svr.bin} -c #{svr.config_file_path}"
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
def stop_cmd svr, sudo=false
|
102
|
+
sudo = sudo ? "sudo " : ""
|
103
|
+
cmd = "#{sudo }test -f #{svr.pid} && kill -QUIT $(cat #{svr.pid})"+
|
104
|
+
" || echo 'No #{svr.name} process to stop for #{svr.app.name}';"
|
105
|
+
cmd << "sleep 2 ; rm -f #{svr.pid};"
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'test/unit/test_unicorn'
|
3
|
+
|
4
|
+
class TestRainbows < TestUnicorn
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@app.each{|sa| sa.shell.extend MockOpen4}
|
9
|
+
@server = Sunshine::Rainbows.new @app
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def test_setup
|
14
|
+
@server.use_concurrency :model => :TreadSpawn, :timeout => 1
|
15
|
+
@server.setup do |ds, binder|
|
16
|
+
assert_equal @server.concurrency, binder.concurrency
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def test_use_concurrency
|
22
|
+
concurrency = {:model => :ModelName, :timeout => 1, :connections => 500}
|
23
|
+
@server.use_concurrency concurrency
|
24
|
+
assert_equal concurrency, @server.concurrency
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestRemoteShell < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
mock_remote_shell_popen4
|
7
|
+
|
8
|
+
@app = Sunshine::App.new TEST_APP_CONFIG_FILE
|
9
|
+
|
10
|
+
@host = "user@some_server.com"
|
11
|
+
|
12
|
+
@remote_shell = mock_remote_shell @host
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
@remote_shell.disconnect
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_connect
|
20
|
+
assert_ssh_call \
|
21
|
+
"echo connected; echo ready; for (( ; ; )); do sleep 10; done"
|
22
|
+
assert @remote_shell.connected?
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_disconnect
|
26
|
+
@remote_shell.disconnect
|
27
|
+
assert !@remote_shell.connected?
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_call
|
31
|
+
@remote_shell.call "echo 'line1'; echo 'line2'"
|
32
|
+
assert_ssh_call "echo 'line1'; echo 'line2'"
|
33
|
+
|
34
|
+
@remote_shell.sudo = "sudouser"
|
35
|
+
@remote_shell.call "sudocall"
|
36
|
+
assert_ssh_call "sudocall", @remote_shell, :sudo => "sudouser"
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_call_with_stderr
|
40
|
+
@remote_shell.set_mock_response 1, :err => 'this is an error'
|
41
|
+
cmd = "echo 'this is an error'"
|
42
|
+
@remote_shell.call cmd
|
43
|
+
raise "Didn't raise CmdError on stderr"
|
44
|
+
rescue Sunshine::CmdError => e
|
45
|
+
ssh_cmd = @remote_shell.send(:ssh_cmd, cmd).join(" ")
|
46
|
+
assert_equal "Execution failed with status 1: #{ssh_cmd}", e.message
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_upload
|
50
|
+
@remote_shell.upload "test/fixtures/sunshine_test", "sunshine_test"
|
51
|
+
assert_rsync "test/fixtures/sunshine_test",
|
52
|
+
"#{@remote_shell.host}:sunshine_test"
|
53
|
+
|
54
|
+
@remote_shell.sudo = "blah"
|
55
|
+
@remote_shell.upload "test/fixtures/sunshine_test", "sunshine_test"
|
56
|
+
assert_rsync "test/fixtures/sunshine_test",
|
57
|
+
"#{@remote_shell.host}:sunshine_test", @remote_shell, "blah"
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_download
|
61
|
+
@remote_shell.download "sunshine_test", "."
|
62
|
+
assert_rsync "#{@remote_shell.host}:sunshine_test", "."
|
63
|
+
|
64
|
+
@remote_shell.download "sunshine_test", ".", :sudo => "sudouser"
|
65
|
+
assert_rsync "#{@remote_shell.host}:sunshine_test", ".",
|
66
|
+
@remote_shell, "sudouser"
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_make_file
|
70
|
+
@remote_shell.make_file("some_dir/sunshine_test_file", "test data")
|
71
|
+
tmp_file = "#{Sunshine::TMP_DIR}/sunshine_test_file"
|
72
|
+
tmp_file = Regexp.escape tmp_file
|
73
|
+
assert_rsync(/^#{tmp_file}_[0-9]+/,
|
74
|
+
"#{@remote_shell.host}:some_dir/sunshine_test_file")
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_os_name
|
78
|
+
@remote_shell.os_name
|
79
|
+
assert_ssh_call "uname -s"
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_equality
|
83
|
+
ds_equal = Sunshine::RemoteShell.new @host
|
84
|
+
ds_diff1 = Sunshine::RemoteShell.new @host, :user => "blarg"
|
85
|
+
ds_diff2 = Sunshine::RemoteShell.new "some_other_host"
|
86
|
+
|
87
|
+
assert_equal ds_equal, @remote_shell
|
88
|
+
assert_equal ds_diff1, @remote_shell
|
89
|
+
assert ds_diff2 != @remote_shell
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_file?
|
93
|
+
@remote_shell.file? "some/file/path"
|
94
|
+
assert_ssh_call "test -f some/file/path"
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_symlink
|
98
|
+
@remote_shell.symlink "target_file", "sym_name"
|
99
|
+
assert_ssh_call "ln -sfT target_file sym_name"
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestRepo < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@svn_url = "https://svnurl/to/repo/tag"
|
7
|
+
@repo = Sunshine::Repo.new_of_type(:svn, @svn_url)
|
8
|
+
@repo.extend MockObject
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_new_of_type
|
12
|
+
repo = Sunshine::Repo.new_of_type :svn, @svn_url
|
13
|
+
assert_equal Sunshine::SvnRepo, repo.class
|
14
|
+
assert_equal @svn_url, repo.url
|
15
|
+
|
16
|
+
repo = Sunshine::Repo.new_of_type "", @svn_url
|
17
|
+
assert_equal Sunshine::Repo, repo.class
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def test_get_repo_info
|
22
|
+
ds = mock_remote_shell
|
23
|
+
begin
|
24
|
+
Sunshine::Repo.new(@svn_url).get_repo_info ds, "path/to/repo"
|
25
|
+
raise "Didn't raise RepoError when it should have"
|
26
|
+
rescue Sunshine::RepoError => e
|
27
|
+
msg = "The 'get_info' method must be implemented by child classes"
|
28
|
+
assert_equal msg, e.message
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def test_checkout_to
|
34
|
+
begin
|
35
|
+
Sunshine::Repo.new(@svn_url).checkout_to "somepath", mock_remote_shell
|
36
|
+
raise "Didn't raise RepoError on checkout_cmd"
|
37
|
+
rescue Sunshine::RepoError => e
|
38
|
+
msg = "The 'do_checkout' method must be implemented by child classes"
|
39
|
+
assert_equal msg, e.message
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,324 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
class TestServer < Test::Unit::TestCase
|
4
|
+
|
5
|
+
class Server < Sunshine::Server
|
6
|
+
def start_cmd
|
7
|
+
"test start cmd"
|
8
|
+
end
|
9
|
+
|
10
|
+
def stop_cmd
|
11
|
+
"test stop cmd"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def setup
|
17
|
+
mock_remote_shell_popen4
|
18
|
+
@app = Sunshine::App.new(TEST_APP_CONFIG_FILE).extend MockObject
|
19
|
+
@server_app = @app.server_apps.first.extend MockObject
|
20
|
+
@app.server_apps.first.shell.extend MockObject
|
21
|
+
|
22
|
+
@server = Server.new @app
|
23
|
+
|
24
|
+
@rainbows = Sunshine::Rainbows.new(@app).extend MockObject
|
25
|
+
use_remote_shell @server_app.shell
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def test_initialize
|
30
|
+
assert_server_init
|
31
|
+
|
32
|
+
config = {
|
33
|
+
:point_to => @server,
|
34
|
+
:pid => "path/to/pid",
|
35
|
+
:bin => "path/to/bin",
|
36
|
+
:port => 1234,
|
37
|
+
:processes => 10,
|
38
|
+
:server_name => "serv1.com",
|
39
|
+
:server_apps => ["remote_shell_test"],
|
40
|
+
:config_template => "template.erb",
|
41
|
+
:config_path => "path/to/config",
|
42
|
+
:config_file => "conf_filename.conf",
|
43
|
+
:log_path => "path/to/logs",
|
44
|
+
:sudo => "sudouser"
|
45
|
+
}
|
46
|
+
|
47
|
+
svr = Server.new @app, config
|
48
|
+
|
49
|
+
config[:target] = config[:point_to]
|
50
|
+
config[:stderr] = "#{config[:log_path]}/server_stderr.log"
|
51
|
+
config[:stdout] = "#{config[:log_path]}/server_stdout.log"
|
52
|
+
|
53
|
+
assert_server_init svr, config
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def test_setup
|
58
|
+
server = @rainbows
|
59
|
+
|
60
|
+
server.setup do |sa, binder|
|
61
|
+
assert_equal @server_app, sa
|
62
|
+
|
63
|
+
assert_equal sa.shell, binder.shell
|
64
|
+
assert_equal sa.shell.host, binder.server_name
|
65
|
+
assert_equal @rainbows.send(:pick_sudo, sa.shell), binder.sudo
|
66
|
+
end
|
67
|
+
|
68
|
+
args = ["rainbows"]
|
69
|
+
server.each_server_app do |sa|
|
70
|
+
assert sa.method_called?(:install_deps, :args => args)
|
71
|
+
end
|
72
|
+
|
73
|
+
assert server.method_called?(:upload_config_files)
|
74
|
+
|
75
|
+
assert_ssh_call "mkdir -p #{server.send(:remote_dirs).join(" ")}"
|
76
|
+
|
77
|
+
assert_rsync(/rainbows\.conf/, "some_server.com:"+
|
78
|
+
"/usr/local/my_user/other_app/current/daemons/rainbows/rainbows.conf")
|
79
|
+
|
80
|
+
assert server.has_setup?
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def test_has_setup?
|
85
|
+
server = @rainbows
|
86
|
+
assert_equal nil, server.instance_variable_get("@setup_successful")
|
87
|
+
|
88
|
+
@server_app.shell.mock :file?, :args => [server.config_file_path],
|
89
|
+
:return => false
|
90
|
+
|
91
|
+
assert_equal false, server.has_setup?
|
92
|
+
|
93
|
+
@server_app.shell.mock :file?, :args => [server.config_file_path],
|
94
|
+
:return => true
|
95
|
+
|
96
|
+
assert_equal false, server.has_setup?
|
97
|
+
assert_equal true, server.has_setup?(true)
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
def test_start
|
102
|
+
server = @rainbows
|
103
|
+
@server_app.shell.mock :file?, :args => [server.config_file_path],
|
104
|
+
:return => false
|
105
|
+
|
106
|
+
server.start do |ds|
|
107
|
+
assert_equal @server_app, ds
|
108
|
+
end
|
109
|
+
|
110
|
+
assert server.method_called?(:setup)
|
111
|
+
|
112
|
+
assert_ssh_call server.start_cmd
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
def test_start_missing_setup
|
117
|
+
server = @rainbows
|
118
|
+
@server_app.shell.mock :file?, :args => [server.config_file_path],
|
119
|
+
:return => true
|
120
|
+
|
121
|
+
server.start
|
122
|
+
|
123
|
+
assert !server.method_called?(:setup)
|
124
|
+
|
125
|
+
assert_ssh_call server.start_cmd
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
def test_stop
|
130
|
+
server = @rainbows
|
131
|
+
|
132
|
+
server.stop do |ds|
|
133
|
+
assert_equal @server_app, ds
|
134
|
+
end
|
135
|
+
|
136
|
+
assert_ssh_call server.stop_cmd
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
def test_restart
|
141
|
+
server = @rainbows
|
142
|
+
|
143
|
+
server.restart
|
144
|
+
|
145
|
+
assert_ssh_call server.restart_cmd
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
def test_restart_missing_setup
|
150
|
+
server = @rainbows
|
151
|
+
@server_app.shell.mock :file?, :args => [server.config_file_path],
|
152
|
+
:return => true
|
153
|
+
|
154
|
+
server.restart
|
155
|
+
|
156
|
+
assert !server.method_called?(:setup)
|
157
|
+
|
158
|
+
assert_ssh_call server.restart_cmd
|
159
|
+
end
|
160
|
+
|
161
|
+
|
162
|
+
def test_restart_with_cmd
|
163
|
+
server = @rainbows
|
164
|
+
server.instance_variable_set("@restart_cmd", "RESTART!!1!")
|
165
|
+
|
166
|
+
@server_app.shell.mock :file?, :args => [server.config_file_path],
|
167
|
+
:return => false
|
168
|
+
|
169
|
+
server.restart
|
170
|
+
|
171
|
+
assert server.method_called?(:setup)
|
172
|
+
assert_ssh_call server.restart_cmd
|
173
|
+
end
|
174
|
+
|
175
|
+
|
176
|
+
def test_missing_start_stop_cmd
|
177
|
+
server = Sunshine::Server.new @app
|
178
|
+
|
179
|
+
begin
|
180
|
+
server.start_cmd
|
181
|
+
raise "Should have thrown CriticalDeployError but didn't :("
|
182
|
+
rescue Sunshine::CriticalDeployError => e
|
183
|
+
assert_equal "@start_cmd undefined. Can't start server", e.message
|
184
|
+
end
|
185
|
+
|
186
|
+
begin
|
187
|
+
server.stop_cmd
|
188
|
+
raise "Should have thrown CriticalDeployError but didn't :("
|
189
|
+
rescue Sunshine::CriticalDeployError => e
|
190
|
+
assert_equal "@stop_cmd undefined. Can't stop server", e.message
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
def test_log_files
|
196
|
+
@server.log_files :test_log => "/path/test_log.log",
|
197
|
+
:another_test => "/path/another_test.log"
|
198
|
+
|
199
|
+
assert_equal "/path/test_log.log", @server.log_file(:test_log)
|
200
|
+
assert_equal "/path/another_test.log", @server.log_file(:another_test)
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
def test_upload_config_files
|
205
|
+
server = @rainbows
|
206
|
+
|
207
|
+
server.mock :config_template_files,
|
208
|
+
:return => ["rainbows.conf.erb", "test/non_erb.conf"]
|
209
|
+
|
210
|
+
@app.mock :build_erb, :return => "test_config"
|
211
|
+
|
212
|
+
server.upload_config_files @server_app.shell
|
213
|
+
|
214
|
+
args = ["#{server.config_path}/rainbows.conf", "test_config"]
|
215
|
+
assert @server_app.shell.method_called?(:make_file, :args => args)
|
216
|
+
|
217
|
+
args = ["test/non_erb.conf", "#{server.config_path}/non_erb.conf"]
|
218
|
+
assert @server_app.shell.method_called?(:upload, :args => args)
|
219
|
+
end
|
220
|
+
|
221
|
+
|
222
|
+
def test_config_template_files
|
223
|
+
files =
|
224
|
+
Dir["#{Sunshine::ROOT}/templates/rainbows/*"].select{|f| File.file?(f)}
|
225
|
+
assert_equal files, @rainbows.config_template_files
|
226
|
+
end
|
227
|
+
|
228
|
+
|
229
|
+
def test_remote_dirs
|
230
|
+
server = @rainbows
|
231
|
+
|
232
|
+
dirs = server.send :remote_dirs
|
233
|
+
|
234
|
+
assert_dir_in dirs, server.pid
|
235
|
+
assert_dir_in dirs, server.config_file_path
|
236
|
+
assert_dir_in dirs, server.log_file(:stderr)
|
237
|
+
assert_dir_in dirs, server.log_file(:stdout)
|
238
|
+
end
|
239
|
+
|
240
|
+
|
241
|
+
def test_register_after_user_script
|
242
|
+
server = @rainbows
|
243
|
+
|
244
|
+
assert @app.method_called?(:after_user_script) # called on Server#init
|
245
|
+
|
246
|
+
@app.run_post_user_lambdas
|
247
|
+
|
248
|
+
server.each_server_app do |sa|
|
249
|
+
|
250
|
+
assert sa.scripts[:start].include?(server.start_cmd)
|
251
|
+
assert sa.scripts[:stop].include?(server.stop_cmd)
|
252
|
+
assert sa.scripts[:status].include?(server.status_cmd)
|
253
|
+
assert sa.scripts[:restart].include?(server.restart_cmd)
|
254
|
+
|
255
|
+
assert_equal server.port, sa.info[:ports][server.pid]
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
|
260
|
+
def test_pick_sudo
|
261
|
+
ds = @rainbows.app.server_apps.first.shell
|
262
|
+
assert_equal nil, @rainbows.send(:pick_sudo, ds)
|
263
|
+
|
264
|
+
@rainbows.sudo = true
|
265
|
+
assert_equal true, @rainbows.send(:pick_sudo, ds)
|
266
|
+
|
267
|
+
ds.sudo = true
|
268
|
+
@rainbows.sudo = false
|
269
|
+
assert_equal true, @rainbows.send(:pick_sudo, ds)
|
270
|
+
|
271
|
+
ds.sudo = "blah"
|
272
|
+
@rainbows.sudo = true
|
273
|
+
assert_equal "blah", @rainbows.send(:pick_sudo, ds)
|
274
|
+
|
275
|
+
@rainbows.sudo = "local"
|
276
|
+
assert_equal "local", @rainbows.send(:pick_sudo, ds)
|
277
|
+
end
|
278
|
+
|
279
|
+
##
|
280
|
+
# Helper methods
|
281
|
+
|
282
|
+
def assert_dir_in arr, file
|
283
|
+
assert arr.include?(File.dirname(file))
|
284
|
+
end
|
285
|
+
|
286
|
+
|
287
|
+
def assert_server_init server=@server, user_config={}
|
288
|
+
config = {
|
289
|
+
:app => @app,
|
290
|
+
:target => @app,
|
291
|
+
:name => "server",
|
292
|
+
:pid => "#{@app.shared_path}/pids/server.pid",
|
293
|
+
:bin => "server",
|
294
|
+
:port => 80,
|
295
|
+
:processes => 1,
|
296
|
+
:server_name => nil,
|
297
|
+
:config_file => "server.conf",
|
298
|
+
:config_path => "#{@app.current_path}/daemons/server",
|
299
|
+
:config_template => "#{Sunshine::ROOT}/templates/server/*",
|
300
|
+
:stderr => "#{@app.log_path}/server_stderr.log",
|
301
|
+
:stdout => "#{@app.log_path}/server_stdout.log"
|
302
|
+
}.merge(user_config)
|
303
|
+
|
304
|
+
assert_equal config[:app], server.app
|
305
|
+
assert_equal config[:bin], server.bin
|
306
|
+
assert_equal config[:pid], server.pid
|
307
|
+
assert_equal config[:port], server.port
|
308
|
+
assert_equal config[:name], server.name
|
309
|
+
assert_equal config[:target], server.target
|
310
|
+
assert_equal config[:processes], server.processes
|
311
|
+
assert_equal config[:server_name], server.server_name
|
312
|
+
|
313
|
+
assert_equal config[:config_path], server.config_path
|
314
|
+
assert_equal config[:config_file], server.config_file
|
315
|
+
assert_equal config[:config_template], server.config_template
|
316
|
+
|
317
|
+
|
318
|
+
assert_equal config[:stderr], server.log_file(:stderr)
|
319
|
+
assert_equal config[:stdout], server.log_file(:stdout)
|
320
|
+
|
321
|
+
config_file_path = "#{config[:config_path]}/#{config[:config_file]}"
|
322
|
+
assert_equal config_file_path, server.config_file_path
|
323
|
+
end
|
324
|
+
end
|