dk-abdeploy 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
1
  module Dk; end
2
2
  module Dk::ABDeploy
3
- VERSION = "0.0.1"
3
+ VERSION = "0.1.0"
4
4
  end
@@ -0,0 +1,27 @@
1
+ require 'much-plugin'
2
+ require 'dk/task'
3
+ require 'dk-abdeploy/validate'
4
+
5
+ class Dk::ABDeploy::Validate
6
+
7
+ module TestHelpers
8
+ include MuchPlugin
9
+
10
+ plugin_included do
11
+
12
+ # this just adds an extra setup block just for dk-abdeploy tests
13
+ setup do
14
+ @root = @dk_abdeploy_root
15
+ @repo = @dk_abdeploy_repo
16
+ @shared = @dk_abdeploy_shared
17
+ @current = @dk_abdeploy_current
18
+ @releases = @dk_abdeploy_releases
19
+ @release_a = @dk_abdeploy_release_a
20
+ @release_b = @dk_abdeploy_release_b
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,97 @@
1
+ require 'assert'
2
+ require 'dk-abdeploy/cleanup'
3
+
4
+ require 'dk/task'
5
+ require 'dk/task_run'
6
+ require 'dk-abdeploy'
7
+ require 'dk-abdeploy/update'
8
+ require 'test/support/validate'
9
+
10
+ class Dk::ABDeploy::Cleanup
11
+
12
+ class UnitTests < Assert::Context
13
+ desc "Dk::ABDeploy::Cleanup"
14
+ setup do
15
+ @task_class = Dk::ABDeploy::Cleanup
16
+ end
17
+ subject{ @task_class }
18
+
19
+ should "be a Dk task" do
20
+ assert_includes Dk::Task, subject
21
+ end
22
+
23
+ should "know its description" do
24
+ exp = "(dk-abdeploy) update the non-deploy release's source post-update"
25
+ assert_equal exp, subject.description
26
+ end
27
+
28
+ should "run the Validate task as a before callback" do
29
+ assert_equal [Dk::ABDeploy::Validate], subject.before_callback_task_classes
30
+ end
31
+
32
+ end
33
+
34
+ class InitTests < UnitTests
35
+ include Dk::ABDeploy::Update::TestHelpers
36
+
37
+ desc "when init"
38
+ setup do
39
+ @params.merge!({
40
+ Dk::ABDeploy::REF_PARAM_NAME => Factory.hex,
41
+ })
42
+ @runner = test_runner(@task_class, :params => @params)
43
+ @task = @runner.task
44
+ end
45
+ subject{ @task }
46
+
47
+ should "know its ssh hosts" do
48
+ assert_equal Dk::ABDeploy::SSH_HOSTS_GROUP_NAME, subject.dk_dsl_ssh_hosts
49
+ end
50
+
51
+ end
52
+
53
+ class RunTests < InitTests
54
+ desc "and run"
55
+ setup do
56
+ @runner.run
57
+ end
58
+ subject{ @runner }
59
+
60
+ should "run the Validate callback and 1 ssh cmd" do
61
+ assert_equal 2, subject.runs.size
62
+ end
63
+
64
+ should "run an ssh cmd to reset the current release git repo" do
65
+ _, git_reset_ssh = subject.runs
66
+
67
+ repo_dir = @params[Dk::ABDeploy::CURRENT_RELEASE_DIR_PARAM_NAME]
68
+ ref = @params[Dk::ABDeploy::REF_PARAM_NAME]
69
+ exp = Dk::ABDeploy::Update.git_reset_cmd_str(repo_dir, ref)
70
+ assert_equal exp, git_reset_ssh.cmd_str
71
+ end
72
+
73
+ should "complain if the current release dir or ref params aren't set" do
74
+ value = [nil, ''].sample
75
+
76
+ runner = test_runner(@task_class, :params => {
77
+ Dk::ABDeploy::REF_PARAM_NAME => value,
78
+ Dk::ABDeploy::CURRENT_RELEASE_DIR_PARAM_NAME => value
79
+ })
80
+ assert_raises(ArgumentError){ runner.run }
81
+
82
+ runner = test_runner(@task_class, :params => {
83
+ Dk::ABDeploy::REF_PARAM_NAME => Factory.string,
84
+ Dk::ABDeploy::CURRENT_RELEASE_DIR_PARAM_NAME => value
85
+ })
86
+ assert_raises(ArgumentError){ runner.run }
87
+
88
+ runner = test_runner(@task_class, :params => {
89
+ Dk::ABDeploy::REF_PARAM_NAME => value,
90
+ Dk::ABDeploy::CURRENT_RELEASE_DIR_PARAM_NAME => Factory.string
91
+ })
92
+ assert_raises(ArgumentError){ runner.run }
93
+ end
94
+
95
+ end
96
+
97
+ end
@@ -0,0 +1,42 @@
1
+ require 'assert'
2
+ require 'dk-abdeploy'
3
+
4
+ module Dk::ABDeploy
5
+
6
+ class UnitTests < Assert::Context
7
+ desc "Dk::ABDeploy"
8
+ setup do
9
+ @deploy_module = Dk::ABDeploy
10
+ end
11
+ subject{ @deploy_module }
12
+
13
+ should "know its dir/link names" do
14
+ assert_equal 'shared', subject::SHARED_DIR_NAME
15
+ assert_equal 'releases', subject::RELEASES_DIR_NAME
16
+ assert_equal 'A', subject::RELEASE_A_DIR_NAME
17
+ assert_equal 'B', subject::RELEASE_B_DIR_NAME
18
+ assert_equal 'current', subject::CURRENT_LINK_NAME
19
+ end
20
+
21
+ should "know its param names" do
22
+ s = subject
23
+ assert_equal 'dk_abdeploy_root', s::ROOT_PARAM_NAME
24
+ assert_equal 'dk_abdeploy_shared_dir', s::SHARED_DIR_PARAM_NAME
25
+ assert_equal 'dk_abdeploy_current_dir', s::CURRENT_DIR_PARAM_NAME
26
+ assert_equal 'dk_abdeploy_releases_dir', s::RELEASES_DIR_PARAM_NAME
27
+ assert_equal 'dk_abdeploy_release_a_dir', s::RELEASE_A_DIR_PARAM_NAME
28
+ assert_equal 'dk_abdeploy_release_b_dir', s::RELEASE_B_DIR_PARAM_NAME
29
+ assert_equal 'dk_abdeploy_current_release_dir', s::CURRENT_RELEASE_DIR_PARAM_NAME
30
+ assert_equal 'dk_abdeploy_deploy_release_dir', s::DEPLOY_RELEASE_DIR_PARAM_NAME
31
+ assert_equal 'dk_abdeploy_repo', s::REPO_PARAM_NAME
32
+ assert_equal 'dk_abdeploy_ref', s::REF_PARAM_NAME
33
+ assert_equal 'dk_abdeploy_primary_ssh_host', s::PRIMARY_SSH_HOST_PARAM_NAME
34
+ end
35
+
36
+ should "know its ssh hosts group name" do
37
+ assert_equal 'dk_abdeploy_servers', subject::SSH_HOSTS_GROUP_NAME
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,84 @@
1
+ require 'assert'
2
+ require 'dk-abdeploy/link'
3
+
4
+ require 'dk/task'
5
+ require 'dk/task_run'
6
+ require 'dk-abdeploy'
7
+ require 'test/support/validate'
8
+
9
+ class Dk::ABDeploy::Link
10
+
11
+ class UnitTests < Assert::Context
12
+ desc "Dk::ABDeploy::Link"
13
+ setup do
14
+ @task_class = Dk::ABDeploy::Link
15
+ end
16
+ subject{ @task_class }
17
+
18
+ should "be a Dk task" do
19
+ assert_includes Dk::Task, subject
20
+ end
21
+
22
+ should "know its description" do
23
+ exp = "(dk-abdeploy) link the deploy release dir as the current dir"
24
+ assert_equal exp, subject.description
25
+ end
26
+
27
+ should "run the Validate task as a before callback" do
28
+ assert_equal [Dk::ABDeploy::Validate], subject.before_callback_task_classes
29
+ end
30
+
31
+ end
32
+
33
+ class InitTests < UnitTests
34
+ include Dk::ABDeploy::Validate::TestHelpers
35
+
36
+ desc "when init"
37
+ setup do
38
+ release_dirs = [
39
+ @params[Dk::ABDeploy::RELEASE_A_DIR_PARAM_NAME],
40
+ @params[Dk::ABDeploy::RELEASE_B_DIR_PARAM_NAME]
41
+ ]
42
+ @params[Dk::ABDeploy::DEPLOY_RELEASE_DIR_PARAM_NAME] = release_dirs.sample
43
+
44
+ @runner = test_runner(@task_class, :params => @params)
45
+ @task = @runner.task
46
+ end
47
+ subject{ @task }
48
+
49
+ should "know its ssh hosts" do
50
+ assert_equal Dk::ABDeploy::SSH_HOSTS_GROUP_NAME, subject.dk_dsl_ssh_hosts
51
+ end
52
+
53
+ end
54
+
55
+ class RunTests < InitTests
56
+ desc "and run"
57
+ setup do
58
+ @runner.run
59
+ end
60
+ subject{ @runner }
61
+
62
+ should "run the Validate task callback and 1 ssh cmd" do
63
+ assert_equal 2, subject.runs.size
64
+ end
65
+
66
+ should "run an ssh cmds to link the deploy release dir as the current dir" do
67
+ _, link_ssh = subject.runs
68
+ curr_dir = @params[Dk::ABDeploy::CURRENT_DIR_PARAM_NAME]
69
+ release_dir = @params[Dk::ABDeploy::DEPLOY_RELEASE_DIR_PARAM_NAME]
70
+
71
+ exp = "rm -f #{curr_dir} && ln -s #{release_dir} #{curr_dir}"
72
+ assert_equal exp, link_ssh.cmd_str
73
+ end
74
+
75
+ should "complain if the deploy release dir param isn't set" do
76
+ runner = test_runner(@task_class, :params => {
77
+ Dk::ABDeploy::DEPLOY_RELEASE_DIR_PARAM_NAME => [nil, ''].sample
78
+ })
79
+ assert_raises(ArgumentError){ runner.run }
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,84 @@
1
+ require 'assert'
2
+ require 'dk-abdeploy/setup'
3
+
4
+ require 'dk/task'
5
+ require 'dk/task_run'
6
+ require 'dk-abdeploy'
7
+ require 'test/support/validate'
8
+
9
+ class Dk::ABDeploy::Setup
10
+
11
+ class UnitTests < Assert::Context
12
+ desc "Dk::ABDeploy::Setup"
13
+ setup do
14
+ @task_class = Dk::ABDeploy::Setup
15
+ end
16
+ subject{ @task_class }
17
+
18
+ should "be a Dk task" do
19
+ assert_includes Dk::Task, subject
20
+ end
21
+
22
+ should "know its description" do
23
+ exp = "(dk-abdeploy) create the dirs and clone the repos for the A/B deploy scheme"
24
+ assert_equal exp, subject.description
25
+ end
26
+
27
+ should "run the Validate task as a before callback" do
28
+ assert_equal [Dk::ABDeploy::Validate], subject.before_callback_task_classes
29
+ end
30
+
31
+ end
32
+
33
+ class InitTests < UnitTests
34
+ include Dk::ABDeploy::Validate::TestHelpers
35
+
36
+ desc "when init"
37
+ setup do
38
+ @runner = test_runner(@task_class, :params => @params)
39
+ @task = @runner.task
40
+ end
41
+ subject{ @task }
42
+
43
+ should "know its ssh hosts" do
44
+ assert_equal Dk::ABDeploy::SSH_HOSTS_GROUP_NAME, subject.dk_dsl_ssh_hosts
45
+ end
46
+
47
+ end
48
+
49
+ class RunTests < InitTests
50
+ desc "and run"
51
+ setup do
52
+ @runner.run
53
+ end
54
+ subject{ @runner }
55
+
56
+ should "run the Validate task callback and 3 ssh cmds" do
57
+ assert_equal 4, subject.runs.size
58
+ end
59
+
60
+ should "run ssh cmds to make the dirs and clone the A/B repos" do
61
+ _, mkdir_ssh, clone_a_ssh, clone_b_ssh = subject.runs
62
+
63
+ exp = "mkdir -p #{@root} #{@shared} #{@releases} #{@release_a} #{@release_b}"
64
+ assert_equal exp, mkdir_ssh.cmd_str
65
+
66
+ exp = clone_cmd_str(@repo, @release_a)
67
+ assert_equal exp, clone_a_ssh.cmd_str
68
+
69
+ exp = clone_cmd_str(@repo, @release_b)
70
+ assert_equal exp, clone_b_ssh.cmd_str
71
+ end
72
+
73
+ private
74
+
75
+ def clone_cmd_str(repo, release_dir)
76
+ "if [ -d #{release_dir}/.git ]; " \
77
+ "then echo 'repo already cloned'; " \
78
+ "else git clone -q #{repo} #{release_dir}; " \
79
+ "fi"
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,230 @@
1
+ require 'assert'
2
+ require 'dk-abdeploy/update'
3
+
4
+ require 'dk/task'
5
+ require 'dk/task_run'
6
+ require 'dk-abdeploy'
7
+ require 'test/support/validate'
8
+
9
+ class Dk::ABDeploy::Update
10
+
11
+ class UnitTests < Assert::Context
12
+ desc "Dk::ABDeploy::Update"
13
+ setup do
14
+ @task_class = Dk::ABDeploy::Update
15
+ end
16
+ subject{ @task_class }
17
+
18
+ should have_imeths :readlink_cmd_str, :git_reset_cmd_str
19
+
20
+ should "be a Dk task" do
21
+ assert_includes Dk::Task, subject
22
+ end
23
+
24
+ should "know its description" do
25
+ exp = "(dk-abdeploy) update the non-current release's source"
26
+ assert_equal exp, subject.description
27
+ end
28
+
29
+ should "run the Validate task as a before callback" do
30
+ assert_equal [Dk::ABDeploy::Validate], subject.before_callback_task_classes
31
+ end
32
+
33
+ should "build readlink cmd strs" do
34
+ link = Factory.path
35
+
36
+ exp = "readlink #{link}"
37
+ assert_equal exp, subject.readlink_cmd_str(link)
38
+ end
39
+
40
+ should "build git reset cmd strs" do
41
+ repo_dir = Factory.path
42
+ ref = Factory.string
43
+
44
+ exp = "cd #{repo_dir} && " \
45
+ "git fetch -q origin && " \
46
+ "git reset -q --hard #{ref} && " \
47
+ "git clean -q -d -x -f"
48
+ assert_equal exp, subject.git_reset_cmd_str(repo_dir, ref)
49
+ end
50
+
51
+ end
52
+
53
+ class InitTests < UnitTests
54
+ include Dk::ABDeploy::Validate::TestHelpers
55
+
56
+ desc "when init"
57
+ setup do
58
+ @params.merge!({
59
+ Dk::ABDeploy::REF_PARAM_NAME => Factory.hex,
60
+ Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME => "#{Factory.string}.example.com"
61
+ })
62
+ @runner = test_runner(@task_class, :params => @params)
63
+ @task = @runner.task
64
+ end
65
+ subject{ @task }
66
+
67
+ should "know its ssh hosts" do
68
+ assert_equal Dk::ABDeploy::SSH_HOSTS_GROUP_NAME, subject.dk_dsl_ssh_hosts
69
+ end
70
+
71
+ end
72
+
73
+ class RunTests < InitTests
74
+ desc "and run"
75
+ setup do
76
+ @curr_link = @params[Dk::ABDeploy::CURRENT_DIR_PARAM_NAME]
77
+ @rl_cmd_str = @task_class.readlink_cmd_str(@curr_link)
78
+
79
+ @runner.run
80
+ end
81
+ subject{ @runner }
82
+
83
+ should "run the Validate task callback, 1 cmd and 1 ssh cmd" do
84
+ assert_equal 3, subject.runs.size
85
+ end
86
+
87
+ should "run a readlink ssh to set or default the current release dir param" do
88
+ _, rl_ssh, _ = subject.runs
89
+
90
+ exp = @task_class.readlink_cmd_str(@params[Dk::ABDeploy::CURRENT_DIR_PARAM_NAME])
91
+ assert_equal exp, rl_ssh.cmd_str
92
+ exp = [@params[Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME]]
93
+ assert_equal exp, rl_ssh.cmd_opts[:hosts]
94
+ end
95
+
96
+ should "set the current release dir param or default it to the B dir if none" do
97
+ curr_release_dir = Factory.path
98
+ runner = test_runner(@task_class, :params => @params)
99
+ runner.stub_ssh(@rl_cmd_str, {
100
+ :opts => {
101
+ :hosts => @params[Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME]
102
+ }
103
+ }){ |spy| spy.stdout = curr_release_dir }
104
+ runner.run
105
+ exp = curr_release_dir
106
+ assert_equal exp, runner.params[Dk::ABDeploy::CURRENT_RELEASE_DIR_PARAM_NAME]
107
+
108
+ runner = test_runner(@task_class, :params => @params)
109
+ runner.stub_ssh(@rl_cmd_str, {
110
+ :opts => {
111
+ :hosts => @params[Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME]
112
+ }
113
+ }){ |spy| spy.stdout = '' }
114
+ runner.run
115
+ exp = @params[Dk::ABDeploy::RELEASE_B_DIR_PARAM_NAME]
116
+ assert_equal exp, runner.params[Dk::ABDeploy::CURRENT_RELEASE_DIR_PARAM_NAME]
117
+ end
118
+
119
+ should "set the deploy release dir to the A dir by default" do
120
+ exp = @params[Dk::ABDeploy::RELEASE_A_DIR_PARAM_NAME]
121
+ assert_equal exp, subject.params[Dk::ABDeploy::DEPLOY_RELEASE_DIR_PARAM_NAME]
122
+ end
123
+
124
+ should "set the deploy release dir to the non-current release dir" do
125
+ # if current is A, set deploy to B
126
+ curr_release_dir = @params[Dk::ABDeploy::RELEASE_A_DIR_PARAM_NAME]
127
+ runner = test_runner(@task_class, :params => @params)
128
+ runner.stub_ssh(@rl_cmd_str, {
129
+ :opts => {
130
+ :hosts => @params[Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME]
131
+ }
132
+ }){ |spy| spy.stdout = curr_release_dir }
133
+ runner.run
134
+
135
+ exp = @params[Dk::ABDeploy::RELEASE_B_DIR_PARAM_NAME]
136
+ assert_equal exp, runner.params[Dk::ABDeploy::DEPLOY_RELEASE_DIR_PARAM_NAME]
137
+
138
+ # if current is B, set deploy to A
139
+ curr_release_dir = @params[Dk::ABDeploy::RELEASE_B_DIR_PARAM_NAME]
140
+ runner = test_runner(@task_class, :params => @params)
141
+ runner.stub_ssh(@rl_cmd_str, {
142
+ :opts => {
143
+ :hosts => @params[Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME]
144
+ }
145
+ }){ |spy| spy.stdout = curr_release_dir }
146
+ runner.run
147
+
148
+ exp = @params[Dk::ABDeploy::RELEASE_A_DIR_PARAM_NAME]
149
+ assert_equal exp, runner.params[Dk::ABDeploy::DEPLOY_RELEASE_DIR_PARAM_NAME]
150
+ end
151
+
152
+ should "run an ssh cmd to reset the deploy release git repo" do
153
+ _, _, git_reset_ssh = subject.runs
154
+ repo_dir = @params[Dk::ABDeploy::RELEASE_A_DIR_PARAM_NAME]
155
+ ref = @params[Dk::ABDeploy::REF_PARAM_NAME]
156
+
157
+ exp = @task_class.git_reset_cmd_str(repo_dir, ref)
158
+ assert_equal exp, git_reset_ssh.cmd_str
159
+ end
160
+
161
+ should "complain if the ref/host params aren't set" do
162
+ value = [nil, ''].sample
163
+
164
+ runner = test_runner(@task_class, :params => {
165
+ Dk::ABDeploy::REF_PARAM_NAME => value,
166
+ Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME => value
167
+ })
168
+ assert_raises(ArgumentError){ runner.run }
169
+
170
+ runner = test_runner(@task_class, :params => {
171
+ Dk::ABDeploy::REF_PARAM_NAME => Factory.string,
172
+ Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME => value
173
+ })
174
+ assert_raises(ArgumentError){ runner.run }
175
+
176
+ runner = test_runner(@task_class, :params => {
177
+ Dk::ABDeploy::REF_PARAM_NAME => value,
178
+ Dk::ABDeploy::PRIMARY_SSH_HOST_PARAM_NAME => Factory.string
179
+ })
180
+ assert_raises(ArgumentError){ runner.run }
181
+ end
182
+
183
+ private
184
+
185
+ def readlink_cmd_str(task, link, ssh_opts)
186
+ ssh_cmd_str(task, "readlink #{link}", ssh_opts)
187
+ end
188
+
189
+ end
190
+
191
+ class TestHelpersTests < UnitTests
192
+ desc "TestHelpers"
193
+ setup do
194
+ @context_class = Class.new do
195
+ def self.setup_blocks; @setup_blocks ||= []; end
196
+ def self.setup(&block)
197
+ self.setup_blocks << block
198
+ end
199
+ include Dk::ABDeploy::Update::TestHelpers
200
+ attr_reader :params
201
+ def initialize
202
+ self.class.setup_blocks.each{ |b| self.instance_eval(&b) }
203
+ end
204
+ end
205
+ @context = @context_class.new
206
+ end
207
+ subject{ @context }
208
+
209
+ should "use much-plugin" do
210
+ assert_includes MuchPlugin, @context_class
211
+ end
212
+
213
+ should "setup the params the update task does" do
214
+ exp_release_dirs = [
215
+ subject.params[Dk::ABDeploy::RELEASE_A_DIR_PARAM_NAME],
216
+ subject.params[Dk::ABDeploy::RELEASE_B_DIR_PARAM_NAME]
217
+ ]
218
+
219
+ exp_release_dirs.delete(
220
+ subject.params[Dk::ABDeploy::CURRENT_RELEASE_DIR_PARAM_NAME]
221
+ )
222
+ assert_equal 1, exp_release_dirs.size
223
+
224
+ exp = exp_release_dirs.first
225
+ assert_equal exp, subject.params[Dk::ABDeploy::DEPLOY_RELEASE_DIR_PARAM_NAME]
226
+ end
227
+
228
+ end
229
+
230
+ end