dk-abdeploy 0.0.1 → 0.1.0

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.
@@ -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