tdd_deploy 0.1.2 → 0.1.3
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/lib/tdd_deploy/assertions.rb +31 -10
- data/lib/tdd_deploy/base.rb +19 -31
- data/lib/tdd_deploy/configurator.rb +20 -5
- data/lib/tdd_deploy/copy_methods.rb +1 -2
- data/lib/tdd_deploy/deploy_test_methods.rb +13 -0
- data/lib/tdd_deploy/environ.rb +18 -2
- data/lib/tdd_deploy/host_tests/host_connection.rb +3 -0
- data/lib/tdd_deploy/host_tests/remote_ip_tables.rb +1 -1
- data/lib/tdd_deploy/host_tests/remote_monit.rb +3 -0
- data/lib/tdd_deploy/host_tests/remote_nginx.rb +3 -0
- data/lib/tdd_deploy/host_tests/remote_postfix.rb +4 -0
- data/lib/tdd_deploy/host_tests/remote_postgresql.rb +3 -0
- data/lib/tdd_deploy/railengine.rb +3 -0
- data/lib/tdd_deploy/run_methods.rb +12 -0
- data/lib/tdd_deploy/server.rb +41 -32
- data/lib/tdd_deploy/site_tests/site_layout.rb +10 -9
- data/lib/tdd_deploy/version.rb +1 -1
- data/lib/tdd_deploy.rb +24 -0
- data/tests/test_copy_methods.rb +1 -0
- metadata +11 -11
@@ -1,18 +1,19 @@
|
|
1
1
|
module TddDeploy
|
2
|
-
module Assertions
|
3
|
-
GREEN = '#080'
|
4
|
-
RED = '#800'
|
5
|
-
GROUP_ELT_TAG = 'ul'
|
6
|
-
HEADER_ELT_TAG = 'h2'
|
7
|
-
RESULT_ELT_TAG = 'li'
|
8
2
|
# TddDeploy re-implements popular assertions so that they can be used
|
9
3
|
# in multi-host testing.
|
10
4
|
#
|
11
|
-
# These assertions differ from usual TDD assertions in
|
12
|
-
#
|
5
|
+
# These assertions differ from usual TDD assertions in two ways:
|
6
|
+
# * all assertions are 'keyed' - all the test results are grouped by
|
7
|
+
# keys.
|
8
|
+
# * that they do not stop tests after failing. Rather they continue and
|
9
|
+
# accumulate failure counts and messages
|
13
10
|
# which can be displayed using *announce_formatted_test_results()*.
|
14
11
|
#
|
15
12
|
# all assertions return boolean *true* or *false*
|
13
|
+
module Assertions
|
14
|
+
GROUP_ELT_TAG = 'ul'
|
15
|
+
HEADER_ELT_TAG = 'h2'
|
16
|
+
RESULT_ELT_TAG = 'li'
|
16
17
|
|
17
18
|
# == Stats
|
18
19
|
#
|
@@ -30,7 +31,7 @@ module TddDeploy
|
|
30
31
|
# Assertions all return true or false. The last parameter is always the assertions
|
31
32
|
# message and is optional.
|
32
33
|
#
|
33
|
-
# assert(prediccate, msg) returns true if prediccate is true, else adds *msg*
|
34
|
+
# assert(key, prediccate, msg) returns true if prediccate is true, else adds *msg*
|
34
35
|
# to failure messages and returns false
|
35
36
|
def assert key, predicate, msg
|
36
37
|
assert_primative key, predicate, msg
|
@@ -53,6 +54,7 @@ module TddDeploy
|
|
53
54
|
assert_primative key, !value.nil?, msg
|
54
55
|
end
|
55
56
|
|
57
|
+
# calls the block and passes only if 'block' raises 'exception'
|
56
58
|
def assert_raises key, exception = Exception, msg, &block
|
57
59
|
begin
|
58
60
|
block.call
|
@@ -63,6 +65,7 @@ module TddDeploy
|
|
63
65
|
fail key, msg
|
64
66
|
end
|
65
67
|
|
68
|
+
# refute assertions are simple negations of the corresponding assert
|
66
69
|
def refute key, predicate, msg
|
67
70
|
assert_primative key, !predicate, msg
|
68
71
|
end
|
@@ -70,11 +73,17 @@ module TddDeploy
|
|
70
73
|
def refute_equal key, expect, value, msg
|
71
74
|
assert_primative key, expect != value, msg
|
72
75
|
end
|
76
|
+
|
77
|
+
def refute_nil key, predicate, msg
|
78
|
+
assert_primative key, !predicate, msg
|
79
|
+
end
|
73
80
|
|
81
|
+
# pass is used to insert a passing message for cases where an assertion is unnecessary
|
74
82
|
def pass key, msg
|
75
83
|
assert_primative key, true, msg
|
76
84
|
end
|
77
85
|
|
86
|
+
# fail, like 'pass', is used to insert a failure message where an assertion is unnecessary
|
78
87
|
def fail key, msg
|
79
88
|
assert_primative key, false, msg
|
80
89
|
end
|
@@ -92,6 +101,7 @@ module TddDeploy
|
|
92
101
|
str
|
93
102
|
end
|
94
103
|
|
104
|
+
private
|
95
105
|
def formatted_test_results_for_key key
|
96
106
|
str = "<#{GROUP_ELT_TAG} class=\"test-result-group\" id=\"test-result-group-#{key}\">\n<#{HEADER_ELT_TAG} class=\"test-result-header\" id=\"test-result-header-#{key}\">Results for '#{key}'</#{HEADER_ELT_TAG}>\n"
|
97
107
|
if failure_count(key) == 0
|
@@ -105,12 +115,14 @@ module TddDeploy
|
|
105
115
|
str + "</#{GROUP_ELT_TAG}>\n"
|
106
116
|
end
|
107
117
|
|
118
|
+
public
|
119
|
+
|
108
120
|
# test_results returns the test_results hash
|
109
121
|
def test_results
|
110
122
|
Stats.test_results
|
111
123
|
end
|
112
124
|
|
113
|
-
# reset_tests
|
125
|
+
# reset_tests clears all test results
|
114
126
|
def reset_tests
|
115
127
|
Stats.test_results = {}
|
116
128
|
end
|
@@ -124,6 +136,7 @@ module TddDeploy
|
|
124
136
|
Stats.test_results = tmp
|
125
137
|
end
|
126
138
|
|
139
|
+
# total_failures: total number of failures accross all keys
|
127
140
|
def total_failures
|
128
141
|
count = 0
|
129
142
|
Stats.test_results.values.each do |messages|
|
@@ -132,24 +145,32 @@ module TddDeploy
|
|
132
145
|
count
|
133
146
|
end
|
134
147
|
|
148
|
+
# total_tests: total number of tests accross all keys
|
135
149
|
def total_tests
|
136
150
|
Stats.test_results.values.reduce(0) { |memo, obj| memo += obj.length }
|
137
151
|
end
|
138
152
|
|
153
|
+
# number of failures recorded under 'key'
|
139
154
|
def failure_count(key)
|
140
155
|
return nil unless Stats.test_results[key]
|
141
156
|
failure_messages(key).length
|
142
157
|
end
|
143
158
|
|
159
|
+
# number of tests recorded under 'key'
|
144
160
|
def test_count(key)
|
145
161
|
return nil unless Stats.test_results[key]
|
146
162
|
Stats.test_results[key].length
|
147
163
|
end
|
148
164
|
|
165
|
+
# all tests messages saved under 'key', returns an array of 2-element arrays.
|
166
|
+
# first element is 'true' or 'false' - indicates passed or failed
|
167
|
+
# second element is the success message
|
149
168
|
def test_messages(key)
|
150
169
|
Stats.test_results[key]
|
151
170
|
end
|
152
171
|
|
172
|
+
# returns all failure messages in same format as 'test_messages(key)'.
|
173
|
+
# this is simply: Stats.test_results[key].select { |tmp| !tmp[0] }
|
153
174
|
def failure_messages(key)
|
154
175
|
Stats.test_results[key].select { |tmp| !tmp[0] }
|
155
176
|
end
|
data/lib/tdd_deploy/base.rb
CHANGED
@@ -1,44 +1,32 @@
|
|
1
1
|
require 'tdd_deploy/assertions'
|
2
2
|
require 'tdd_deploy/environ'
|
3
3
|
require 'tdd_deploy/run_methods'
|
4
|
+
require 'tdd_deploy/copy_methods'
|
4
5
|
require 'tdd_deploy/deploy_test_methods'
|
5
|
-
# = TddDeploy
|
6
|
-
#
|
7
|
-
# TddDeploy provides methods for testing the provisioning of remote hosts
|
8
|
-
# and Rails instances running as virtual hosts
|
9
|
-
#
|
10
|
-
# Tests are simple to write.
|
11
|
-
#
|
12
|
-
# Step 1: require 'tdd_deploy' and then subclass TddDeploy::Base
|
13
|
-
# Step 2: write tests using the methods: *run_on_all_hosts* and *run_on_all_hosts_as*
|
14
|
-
# Step 3: run tests and fix installation until all tests pass
|
15
|
-
#
|
16
|
-
# These tests do not guarantee that anything will work. They only test to see if the files
|
17
|
-
# are installed and that communication works to all hosts the site runs on.
|
18
|
-
#
|
19
|
-
# == TddDeploy::Base
|
20
|
-
#
|
21
|
-
# TddDeploy::Base is a class which includes all the TddDeploy modules
|
22
|
-
# and initializes the environment.
|
23
|
-
#
|
24
|
-
# it is meant to be subclassed for individual host and site tests.
|
25
|
-
#
|
26
|
-
# class HostFacilityTest < TddDeploy::Base
|
27
|
-
# def test_for_file
|
28
|
-
# deploy_test_on_hosts_as user_id, match_string_or_regx, err_msg { command }
|
29
|
-
# end
|
30
|
-
# etc
|
31
|
-
# end
|
32
|
-
#
|
33
|
-
# NOTE: Derived classes which provide an **initialize** method should call super
|
34
|
-
# to ensure that the environment is set. See TddDeploy::Base to see what the
|
35
|
-
# parent initializer does.
|
36
6
|
|
37
7
|
module TddDeploy
|
8
|
+
# == TddDeploy::Base
|
9
|
+
#
|
10
|
+
# TddDeploy::Base is a class which includes all the TddDeploy modules
|
11
|
+
# and initializes the environment.
|
12
|
+
#
|
13
|
+
# it is meant to be subclassed for individual host and site tests.
|
14
|
+
#
|
15
|
+
# class HostFacilityTest < TddDeploy::Base
|
16
|
+
# def test_for_file
|
17
|
+
# deploy_test_on_hosts_as user_id, match_string_or_regx, err_msg { command }
|
18
|
+
# end
|
19
|
+
# etc
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# NOTE: Derived classes which provide an **initialize** method should call super
|
23
|
+
# to ensure that the environment is set. See TddDeploy::Base to see what the
|
24
|
+
# parent initializer does.
|
38
25
|
class Base
|
39
26
|
include TddDeploy::Assertions
|
40
27
|
include TddDeploy::Environ
|
41
28
|
include TddDeploy::RunMethods
|
29
|
+
include TddDeploy::CopyMethods
|
42
30
|
include TddDeploy::DeployTestMethods
|
43
31
|
|
44
32
|
# args are ignored, unless the args.last is a Hash. If it is passed to *set_env*.
|
@@ -7,14 +7,29 @@ require 'tdd_deploy/base'
|
|
7
7
|
module TddDeploy
|
8
8
|
# == TddDeployConfigurator
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# NOTE: you generally do NOT use the TddDeploy::Configurator class directly. You will
|
11
|
+
# seed your configuration files using the supplied 'rake' task; edit, modify, delete,
|
12
|
+
# spindle, fold and mutilate as you please; and then, click the 'Run configurator'
|
13
|
+
# link in the server page.
|
14
|
+
#
|
15
|
+
# TddDeploy::Configurator is used to create site/host specific configuration files for
|
11
16
|
# sites. The files are defined by templates in subdirectories of the 'site-erb' directory.
|
17
|
+
#
|
18
|
+
# templates are installed in your app's 'lib/tdd_deploy/site-erb' directory. There are
|
19
|
+
# three subdirectories - one for each server class: balance_hosts, db_hosts, and web_hosts.
|
20
|
+
#
|
21
|
+
# Templates actually reside in subdirectories which correspond to installation directories
|
22
|
+
# on the deployment hosts. Thus, templates for the 'config' directory for the 'balance_hosts'
|
23
|
+
# are in 'lib/tdd_deploy/site-erb/balance_hosts/config'
|
24
|
+
#
|
25
|
+
# I put other config files and executables in the directory 'site'. At present these are
|
26
|
+
# include files for 'nginx' and 'monit'.
|
27
|
+
#
|
12
28
|
# At present there are templates in 'site-erb/config' and 'site-erb/site'. Rendered files
|
13
|
-
# are written to corresponding subdirectories of
|
14
|
-
#
|
29
|
+
# are written to corresponding subdirectories of 'tdd_deploy_configs'
|
30
|
+
# in your application.
|
15
31
|
#
|
16
|
-
#
|
17
|
-
# set to 0755
|
32
|
+
# It's your problem to deal with file permission issues.
|
18
33
|
class Configurator < TddDeploy::Base
|
19
34
|
# install - reads all the templates in gem-home/site-erb, renders them using the
|
20
35
|
# current environment context, and writes the renderings to the appropriate
|
@@ -2,6 +2,19 @@ require 'tdd_deploy/assertions'
|
|
2
2
|
require 'tdd_deploy/run_methods'
|
3
3
|
|
4
4
|
module TddDeploy
|
5
|
+
# == TddDeploy::DeployTestMethods
|
6
|
+
#
|
7
|
+
# this module supplies the basic methods used to validate host installation structure.
|
8
|
+
#
|
9
|
+
# all methods expect the first two arguments to be 'userid' and 'host' or 'host-list'.
|
10
|
+
# the 'userid' is a userid which exists on the specified host.
|
11
|
+
# 'host' is a single host
|
12
|
+
# 'host-list' can be a single host (as a string) or an array of host names
|
13
|
+
# 'success_message' is what you will see in the report. I like positive messages, hence the name
|
14
|
+
#
|
15
|
+
# the most frequently used are 'deploy_test_process_running_on_hosts_as' and 'deploy_test_file_exists_on_hosts_as'.
|
16
|
+
#
|
17
|
+
# 'deploy_test_on_hosts_as' and 'deploy_test_in_ssh_session_as' are more primative and flexible.
|
5
18
|
module DeployTestMethods
|
6
19
|
include TddDeploy::Assertions
|
7
20
|
include TddDeploy::RunMethods
|
data/lib/tdd_deploy/environ.rb
CHANGED
@@ -15,10 +15,13 @@ module TddDeploy
|
|
15
15
|
#
|
16
16
|
# Environment variables:
|
17
17
|
#
|
18
|
+
# All environment variables can be read or set via accessors - which are created
|
19
|
+
# dynamically. They do _not_ show up in the Yard doc.
|
20
|
+
#
|
18
21
|
# === Integer variables
|
19
22
|
# * 'ssh_timeout' - timeout in seconds used to terminate remote commands fired off by ssh
|
20
23
|
# * 'site_base_port' - Base port for site servers. For example, if a pack of mongrels or thin
|
21
|
-
#
|
24
|
+
#servers provide the rails end of the web site, they listen on 'site_base_port', +1, etd
|
22
25
|
# * 'site_num_servers' - number of mongrels or thins to spin up
|
23
26
|
#
|
24
27
|
# === String variables
|
@@ -26,15 +29,22 @@ module TddDeploy
|
|
26
29
|
# * 'local_admin' - user name of on local hosts which can ssh into remote hosts via public key authentication
|
27
30
|
# * 'local_admin_email' - email of local admin who should receive monitoring emails
|
28
31
|
# * 'site' - name of site This should satisfy /[a-z][a-z0-9_]*.
|
32
|
+
# * 'site_path' - the absolute path to DocumentRoot for the site
|
33
|
+
# * 'site_url' - the url for the site (w/o scheme - as in 'www.foo.com')
|
34
|
+
# * 'site_aliases' - aliases for the site. The delimiters will depend on your web server
|
29
35
|
# * 'site_user' - name of site user. TddDeploy assumes that each site will have a unique user on the remote host.
|
30
36
|
# this makes it easy to tell nginx and monit where to find configuration files for each site [both
|
31
37
|
# know how to included globbed paths]
|
32
38
|
#
|
33
39
|
# === List Variables
|
34
|
-
# * 'hosts' - list of all hosts - defaults to balance_hosts + db_hosts + web_hosts
|
35
40
|
# * 'balance_hosts' - load balancing servers [may be empty, in which case 'hosts' is used]
|
36
41
|
# * 'db_hosts' - hosts which run the database server [may be empty, in which case 'hosts' is used]
|
37
42
|
# * 'web_hosts' - hosts which run the web server [may be empty, in which case 'hosts' is used]
|
43
|
+
#
|
44
|
+
# === Pseudo Variable
|
45
|
+
# * 'hosts' - list of all hosts - always returns balance_hosts + db_hosts + web_hosts.
|
46
|
+
#may be assigned to if all three host lists are identical, otherwise raises an exception.
|
47
|
+
# 'tdd_deploy_context' hides it from view unless it can be assigned
|
38
48
|
|
39
49
|
module Environ
|
40
50
|
|
@@ -110,10 +120,12 @@ module TddDeploy
|
|
110
120
|
'web_hosts' => 'arch',
|
111
121
|
}
|
112
122
|
|
123
|
+
# Hash mapping environment variable to type
|
113
124
|
def env_types
|
114
125
|
DataCache.env_types
|
115
126
|
end
|
116
127
|
|
128
|
+
# Hash of default values - which are hokey
|
117
129
|
def env_defaults
|
118
130
|
DataCache.env_defaults
|
119
131
|
end
|
@@ -145,6 +157,7 @@ module TddDeploy
|
|
145
157
|
end
|
146
158
|
end
|
147
159
|
|
160
|
+
# clears the environment hash. Really - it's useless until re-initialized
|
148
161
|
def clear_env
|
149
162
|
DataCache.env_hash = {}
|
150
163
|
end
|
@@ -202,6 +215,7 @@ module TddDeploy
|
|
202
215
|
nil
|
203
216
|
end
|
204
217
|
|
218
|
+
# bursts comma/space separated string into a sorted, unique array
|
205
219
|
def str_to_list str
|
206
220
|
case
|
207
221
|
when str.is_a?(String) then str.split(/[\s,]+/).uniq.sort
|
@@ -211,11 +225,13 @@ module TddDeploy
|
|
211
225
|
end
|
212
226
|
end
|
213
227
|
|
228
|
+
# packs an array into a comma separated string
|
214
229
|
def list_to_str key
|
215
230
|
tmp = self.env_hash[key]
|
216
231
|
tmp.is_a?(Array) ? tmp.join(',') : tmp.to_s
|
217
232
|
end
|
218
233
|
|
234
|
+
public
|
219
235
|
# saves the current environment in the current working directory in the file
|
220
236
|
# 'site_host_setup.env' [aka TddDeploy::Environ::ENV_FNAME]
|
221
237
|
def save_env
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'tdd_deploy/base'
|
2
2
|
|
3
3
|
module TddDeploy
|
4
|
+
# == TddDeploy::HostConnection
|
5
|
+
#
|
6
|
+
# tests that hosts are pingable and that the current user can log in as both 'host_admin' and 'root'
|
4
7
|
class HostConnection < TddDeploy::Base
|
5
8
|
# ping - pings all hosts
|
6
9
|
def ping
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'tdd_deploy/base'
|
2
2
|
|
3
3
|
module TddDeploy
|
4
|
-
#
|
4
|
+
# == TddDeploy::RemoteIpTables
|
5
5
|
#
|
6
6
|
# checks to see if iptables is working by attempting to connect to each host on a collection
|
7
7
|
# of 'interesting' ports. the ports probed are: 20, 23, 25, 53, 5432, 2812
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'tdd_deploy/base'
|
2
2
|
|
3
3
|
module TddDeploy
|
4
|
+
# == TddDeploy::RemoteMonit
|
5
|
+
#
|
6
|
+
# verifies monit executable is present and running on all hosts
|
4
7
|
class RemoteMonit < TddDeploy::Base
|
5
8
|
def test_monit_installed
|
6
9
|
deploy_test_file_exists_on_hosts_as self.host_admin, self.hosts, '/usr/bin/monit', 'monit should be installed'
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'tdd_deploy/base'
|
2
2
|
|
3
3
|
module TddDeploy
|
4
|
+
# == TddDeploy::RemoteNginx
|
5
|
+
#
|
6
|
+
# verifies Nginx executable is both present and running on web_hosts + balance_hosts
|
4
7
|
class RemoteNginx < TddDeploy::Base
|
5
8
|
def test_nginx_installed
|
6
9
|
deploy_test_file_exists_on_hosts_as self.host_admin, self.web_hosts + self.balance_hosts, '/usr/sbin/nginx', "nginx should be installed"
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'tdd_deploy/base'
|
2
2
|
|
3
3
|
module TddDeploy
|
4
|
+
# == TddDeploy::RemotePostfix
|
5
|
+
#
|
6
|
+
# verifies that postfix executable is installed, running and will accept mail to local_admin_mail
|
7
|
+
# on all hosts
|
4
8
|
class RemotePostfix < TddDeploy::Base
|
5
9
|
def test_postfix_installed
|
6
10
|
deploy_test_file_exists_on_hosts_as 'root', self.hosts, '/usr/sbin/postfix', "postfix should be installed"
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'tdd_deploy/base'
|
2
2
|
|
3
3
|
module TddDeploy
|
4
|
+
# == TddDeploy::RemotePostgresql
|
5
|
+
#
|
6
|
+
# verifies that the postgresql exectuable is both installed and running on db_hosts
|
4
7
|
class RemotePostgresql < TddDeploy::Base
|
5
8
|
def test_postgresql_installed
|
6
9
|
deploy_test_file_exists_on_hosts_as 'root', self.db_hosts, "/usr/bin/postgres", 'postgres should be installed'
|
@@ -1,4 +1,16 @@
|
|
1
1
|
module TddDeploy
|
2
|
+
# == TddDeploy::RunMethods
|
3
|
+
#
|
4
|
+
# supplies methods for running local and remote processes.
|
5
|
+
#
|
6
|
+
# remotely run processes require a userid and either a host or host-list.
|
7
|
+
# * 'userid' - is a remote userid which the local user can ssh into using public key
|
8
|
+
# * 'host' - a single host name
|
9
|
+
# * 'host_list' - single host name as string or Array of host names
|
10
|
+
# * 'cmd' - command as a string
|
11
|
+
# * 'block' - command as the result of a block. Use one or the other, but not both
|
12
|
+
#
|
13
|
+
# run_locally and ping_host are both run locally and don't need userid or host
|
2
14
|
module RunMethods
|
3
15
|
require 'net/ssh'
|
4
16
|
require 'net/ping'
|
data/lib/tdd_deploy/server.rb
CHANGED
@@ -5,6 +5,10 @@ require 'uri'
|
|
5
5
|
require 'tdd_deploy'
|
6
6
|
|
7
7
|
module TddDeploy
|
8
|
+
# == TddDeploy::Server
|
9
|
+
#
|
10
|
+
# implements a simple 'rack' server. Methods are either used internally or called
|
11
|
+
# from the web page during page reloads.
|
8
12
|
class Server < TddDeploy::Base
|
9
13
|
LIB_DIR = File.expand_path('../..', __FILE__)
|
10
14
|
HOST_TESTS_DIR = File.join(Dir.pwd, 'lib', 'tdd_deploy', 'host_tests')
|
@@ -14,6 +18,8 @@ module TddDeploy
|
|
14
18
|
|
15
19
|
attr_accessor :test_classes, :query_hash, :failed_tests
|
16
20
|
|
21
|
+
# accepts env_hash arguments. It's just as easy to instantiate and then change
|
22
|
+
# the variables using self.set_env
|
17
23
|
def initialize *args
|
18
24
|
@already_defined = TddDeploy.constants
|
19
25
|
load_all_tests
|
@@ -24,6 +30,34 @@ module TddDeploy
|
|
24
30
|
super
|
25
31
|
end
|
26
32
|
|
33
|
+
# rack interface. takes an env Hash and returns [code, headers, body]
|
34
|
+
def call(env)
|
35
|
+
self.query_hash = parse_query_string(env['QUERY_STRING'])
|
36
|
+
|
37
|
+
if query_hash['run_configurator']
|
38
|
+
require 'tdd_deploy/configurator'
|
39
|
+
configurator = TddDeploy::Configurator.new
|
40
|
+
configurator.make_configuration_files
|
41
|
+
end
|
42
|
+
|
43
|
+
if query_hash['failed-tests']
|
44
|
+
remove_failed_tests
|
45
|
+
run_selected_tests(query_hash['failed-tests'])
|
46
|
+
else
|
47
|
+
run_all_tests
|
48
|
+
end
|
49
|
+
|
50
|
+
query_string = new_query_string
|
51
|
+
body = [
|
52
|
+
render_results,
|
53
|
+
# "#{env.inspect}"
|
54
|
+
]
|
55
|
+
return [200, {'Content-Length' => body.join('').length.to_s, 'Content-Type' => 'text/html'}, body]
|
56
|
+
end
|
57
|
+
|
58
|
+
# loads all files in 'lib/tdd_deploy/host_tests | site_tests | local_tests.
|
59
|
+
# both host_tests and site_tests are clobbered by the rake install task.
|
60
|
+
# local_tests is safe.
|
27
61
|
def load_all_tests
|
28
62
|
[TddDeploy::Server::HOST_TESTS_DIR, TddDeploy::Server::SITE_TESTS_DIR,
|
29
63
|
TddDeploy::Server::LOCAL_TESTS_DIR].each do |dir|
|
@@ -49,25 +83,20 @@ module TddDeploy
|
|
49
83
|
end
|
50
84
|
end
|
51
85
|
|
52
|
-
|
86
|
+
# Re-reads the environment and then runs all known tests.
|
87
|
+
def run_all_tests
|
53
88
|
read_env
|
54
89
|
reset_tests
|
55
90
|
|
56
|
-
test_classes = if test_group && defined?(@test_classes_hash)
|
57
|
-
failed_test_keys = test_group.split(',')
|
58
|
-
@test_classes_hash.select { |k, v| failed_test_keys.include? k }.values
|
59
|
-
else
|
60
|
-
self.test_classes
|
61
|
-
end
|
62
|
-
|
63
91
|
ret = true
|
64
92
|
@failed_tests = []
|
65
|
-
test_classes.each do |klass|
|
93
|
+
self.test_classes.each do |klass|
|
66
94
|
ret &= run_all_tests_in_class(klass)
|
67
95
|
end
|
68
96
|
ret
|
69
97
|
end
|
70
98
|
|
99
|
+
# Re-reads the environment and then runs tests from 'test_list'
|
71
100
|
def run_selected_tests(test_list)
|
72
101
|
read_env
|
73
102
|
ret = true
|
@@ -78,6 +107,9 @@ module TddDeploy
|
|
78
107
|
ret
|
79
108
|
end
|
80
109
|
|
110
|
+
private
|
111
|
+
|
112
|
+
# not presently used
|
81
113
|
def run_all_tests_in_class klass
|
82
114
|
read_env
|
83
115
|
obj = klass.new
|
@@ -116,29 +148,6 @@ module TddDeploy
|
|
116
148
|
str = "failed-tests=" + URI.escape(@failed_tests.join(',')) unless @failed_tests.nil? || @failed_tests.empty?
|
117
149
|
end
|
118
150
|
|
119
|
-
def call(env)
|
120
|
-
self.query_hash = parse_query_string(env['QUERY_STRING'])
|
121
|
-
|
122
|
-
if query_hash['run_configurator']
|
123
|
-
require 'tdd_deploy/configurator'
|
124
|
-
configurator = TddDeploy::Configurator.new
|
125
|
-
configurator.make_configuration_files
|
126
|
-
end
|
127
|
-
|
128
|
-
if query_hash['failed-tests']
|
129
|
-
remove_failed_tests
|
130
|
-
run_selected_tests(query_hash['failed-tests'])
|
131
|
-
else
|
132
|
-
run_all_tests
|
133
|
-
end
|
134
|
-
|
135
|
-
query_string = new_query_string
|
136
|
-
body = [
|
137
|
-
render_results,
|
138
|
-
# "#{env.inspect}"
|
139
|
-
]
|
140
|
-
return [200, {'Content-Length' => body.join('').length.to_s, 'Content-Type' => 'text/html'}, body]
|
141
|
-
end
|
142
151
|
end
|
143
152
|
end
|
144
153
|
|
@@ -3,17 +3,18 @@ require 'tdd_deploy/base'
|
|
3
3
|
module TddDeploy
|
4
4
|
# == TddDeploy::SiteLayout
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
6
|
+
# tests for the existence of several directories on all hosts as *site_user* in
|
7
|
+
# the *site_user* home directory.
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# The sub directories tested for are:
|
10
10
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
11
|
+
# * 'site_path' - DocumentRoot
|
12
|
+
# * 'site_path'/../releases - a standard directory used by Capistrano
|
13
|
+
# * 'site_path'/site/nginx.conf - an nginx configuratino fragment which tells nginx to proxy the site's *thin* servers
|
14
|
+
# * 'site_path'/site/monitrc - a monit configuration fragment which tells monit how to monitor the site's *thin* servers.
|
15
|
+
# * 'site_path'/config/thin.conf - config file for 'thin' server
|
16
|
+
# * 'site_path'/config/one_thin_server.conf - config file for monit to use to restart a single server instance
|
17
|
+
# * 'site_path'/site/one_thin_server - shell script to start a single server instance
|
17
18
|
class SiteLayout < TddDeploy::Base
|
18
19
|
def test_site_subdir
|
19
20
|
deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{self.site_path}"
|
data/lib/tdd_deploy/version.rb
CHANGED
data/lib/tdd_deploy.rb
CHANGED
@@ -10,3 +10,27 @@ require 'tdd_deploy/version'
|
|
10
10
|
if defined? Rails
|
11
11
|
require 'tdd_deploy/railengine'
|
12
12
|
end
|
13
|
+
|
14
|
+
# = TddDeploy
|
15
|
+
#
|
16
|
+
# TddDeploy provides methods for testing the provisioning of remote hosts
|
17
|
+
# and Rails instances running as virtual hosts
|
18
|
+
#
|
19
|
+
# Tests are simple to write.
|
20
|
+
#
|
21
|
+
# Step 1: require 'tdd_deploy' and then subclass TddDeploy::Base
|
22
|
+
# Step 2: write tests using the methods: *run_on_all_hosts* and *run_on_all_hosts_as*
|
23
|
+
# Step 3: run tests and fix installation until all tests pass
|
24
|
+
#
|
25
|
+
# These tests do not guarantee that anything will work. They only test to see if the files
|
26
|
+
# are installed and that communication works to all hosts the site runs on.
|
27
|
+
#
|
28
|
+
# see the tdd_deploy gem Readme file for more information.
|
29
|
+
#
|
30
|
+
# see HostSetup.md and SiteSetup.md for info on setting up Arch linux servers and Rails
|
31
|
+
# apps running on them. Both of these documents are out of sync with respect to the rest
|
32
|
+
# of tdd_deploy: make the 'obvious' translation between shell script variables and
|
33
|
+
# tdd_deploy environment keys.
|
34
|
+
|
35
|
+
module TddDeploy
|
36
|
+
end
|
data/tests/test_copy_methods.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tdd_deploy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-08-16 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
16
|
-
requirement: &
|
16
|
+
requirement: &2153409860 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2153409860
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: net-ping
|
27
|
-
requirement: &
|
27
|
+
requirement: &2153409060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2153409060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: net-ssh
|
38
|
-
requirement: &
|
38
|
+
requirement: &2153397720 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2153397720
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ZenTest
|
49
|
-
requirement: &
|
49
|
+
requirement: &2153397080 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 4.5.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2153397080
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: autotest-growl
|
60
|
-
requirement: &
|
60
|
+
requirement: &2153396520 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2153396520
|
69
69
|
description: Test driven support for host provisioning & Capistrano deployment - for
|
70
70
|
those who don't want to bother learning too much
|
71
71
|
email: ! ' mike@clove.com '
|