taketo 0.1.3 → 0.2.0.alpha
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/Gemfile +1 -0
- data/Gemfile.lock +8 -0
- data/README.md +16 -1
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/bin/taketo +17 -89
- data/lib/taketo/actions/base_action.rb +29 -0
- data/lib/taketo/actions/generate_ssh_config.rb +22 -0
- data/lib/taketo/actions/group_action.rb +15 -0
- data/lib/taketo/actions/list.rb +22 -0
- data/lib/taketo/actions/login.rb +40 -0
- data/lib/taketo/actions/matches.rb +28 -0
- data/lib/taketo/actions/node_action.rb +15 -0
- data/lib/taketo/actions/server_action.rb +14 -0
- data/lib/taketo/actions/view.rb +24 -0
- data/lib/taketo/actions.rb +21 -0
- data/lib/taketo/associated_nodes.rb +4 -0
- data/lib/taketo/commands.rb +2 -1
- data/lib/taketo/config_validator.rb +4 -0
- data/lib/taketo/config_visitor.rb +3 -1
- data/lib/taketo/constructs/config.rb +2 -1
- data/lib/taketo/constructs/environment.rb +9 -0
- data/lib/taketo/constructs/group.rb +20 -0
- data/lib/taketo/constructs/project.rb +2 -1
- data/lib/taketo/constructs/server.rb +1 -1
- data/lib/taketo/constructs.rb +1 -0
- data/lib/taketo/constructs_factory.rb +4 -0
- data/lib/taketo/destination_matcher.rb +4 -4
- data/lib/taketo/dsl.rb +18 -17
- data/lib/taketo/group_list_visitor.rb +11 -0
- data/lib/taketo/group_resolver.rb +12 -0
- data/lib/taketo/{destination_resolver.rb → node_resolver.rb} +5 -27
- data/lib/taketo/server_resolver.rb +29 -0
- data/spec/acceptance/command_spec.rb +2 -1
- data/spec/acceptance/completion_spec.rb +26 -9
- data/spec/acceptance/config_dsl_spec.rb +74 -13
- data/spec/acceptance/config_validation_spec.rb +20 -5
- data/spec/acceptance/connect_to_server_spec.rb +6 -3
- data/spec/acceptance/error_handling_spec.rb +2 -2
- data/spec/acceptance/generate_ssh_config_spec.rb +1 -1
- data/spec/acceptance/help_spec.rb +4 -2
- data/spec/acceptance/location_spec.rb +2 -1
- data/spec/acceptance_spec_helper.rb +1 -1
- data/spec/lib/taketo/actions_spec.rb +17 -0
- data/spec/lib/taketo/associated_nodes_spec.rb +34 -0
- data/spec/lib/taketo/config_validator_spec.rb +1 -1
- data/spec/lib/taketo/constructs/config_spec.rb +4 -1
- data/spec/lib/taketo/constructs/environment_spec.rb +6 -1
- data/spec/lib/taketo/constructs/group_spec.rb +30 -0
- data/spec/lib/taketo/constructs/project_spec.rb +2 -0
- data/spec/lib/taketo/constructs/server_spec.rb +6 -2
- data/spec/lib/taketo/constructs_factory_spec.rb +5 -0
- data/spec/lib/taketo/dsl_spec.rb +86 -74
- data/spec/lib/taketo/group_list_visitor_spec.rb +20 -0
- data/spec/lib/taketo/group_resolver_spec.rb +59 -0
- data/spec/lib/taketo/{destination_resolver_spec.rb → server_resolver_spec.rb} +3 -29
- data/spec/support/helpers/construct_spec_helper.rb +9 -0
- data/spec/support/helpers/dsl_spec_helper.rb +31 -9
- data/spec/support/matchers/enclose_scope_matcher.rb +15 -7
- metadata +41 -20
data/lib/taketo/dsl.rb
CHANGED
@@ -6,27 +6,31 @@ module Taketo
|
|
6
6
|
class ConfigError < StandardError; end
|
7
7
|
|
8
8
|
class << self
|
9
|
-
def define_scope(scope, *
|
10
|
-
options =
|
11
|
-
parent_scopes =
|
9
|
+
def define_scope(scope, *parent_scopes_and_options, &scope_setup_block)
|
10
|
+
options = parent_scopes_and_options.last.is_a?(Hash) ? parent_scopes_and_options.pop : {}
|
11
|
+
parent_scopes = parent_scopes_and_options
|
12
12
|
|
13
|
-
define_method scope do |*args, &
|
13
|
+
define_method scope do |*args, &scope_block|
|
14
14
|
ensure_nesting_allowed!(scope, parent_scopes)
|
15
15
|
name = args.shift || options[:default_name] or raise(ArgumentError, "Name not specified")
|
16
16
|
|
17
17
|
scope_object = current_scope_object.find(scope, name) { @factory.create(scope, name) }
|
18
18
|
|
19
19
|
in_scope(scope, scope_object) do
|
20
|
-
instance_exec(current_scope_object, &
|
21
|
-
|
20
|
+
instance_exec(current_scope_object, &scope_setup_block) if scope_setup_block
|
21
|
+
scope_block.call
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
define_method("#{scope}_scope?") do
|
26
|
+
current_scope == scope
|
27
|
+
end
|
24
28
|
end
|
25
29
|
|
26
30
|
def define_method_in_scope(name, *parent_scopes, &block)
|
27
|
-
define_method name do |*args, &
|
31
|
+
define_method name do |*args, &argument_block|
|
28
32
|
ensure_nesting_allowed!(name, parent_scopes)
|
29
|
-
args.push
|
33
|
+
args.push argument_block if argument_block
|
30
34
|
instance_exec(*args, &block)
|
31
35
|
end
|
32
36
|
end
|
@@ -56,8 +60,9 @@ module Taketo
|
|
56
60
|
|
57
61
|
define_scope :project, :config
|
58
62
|
define_scope :environment, :project
|
63
|
+
define_scope :group, :environment, :project, :config
|
59
64
|
|
60
|
-
define_scope :server, :environment, :project, :config, :default_name => :default do |s|
|
65
|
+
define_scope :server, :environment, :project, :config, :group, :default_name => :default do |s|
|
61
66
|
instance_eval(&s.default_server_config)
|
62
67
|
end
|
63
68
|
|
@@ -75,12 +80,12 @@ module Taketo
|
|
75
80
|
define_method_in_scope(:execute, :command) { |command| current_scope_object.command = command }
|
76
81
|
define_method_in_scope(:desc, :command) { |description| current_scope_object.description = description }
|
77
82
|
|
78
|
-
define_method_in_scope(:default_server_config, :config, :project, :environment) do |
|
79
|
-
current_scope_object.default_server_config =
|
83
|
+
define_method_in_scope(:default_server_config, :config, :project, :environment, :group) do |block|
|
84
|
+
current_scope_object.default_server_config = block
|
80
85
|
end
|
81
86
|
|
82
|
-
define_method_in_scope(:shared_server_config, :config) do |name,
|
83
|
-
@shared_server_configs.store(name.to_sym,
|
87
|
+
define_method_in_scope(:shared_server_config, :config) do |name, block|
|
88
|
+
@shared_server_configs.store(name.to_sym, block)
|
84
89
|
end
|
85
90
|
|
86
91
|
define_method_in_scope(:include_shared_server_config, :server) do |*args|
|
@@ -101,10 +106,6 @@ module Taketo
|
|
101
106
|
current_scope == scope
|
102
107
|
end
|
103
108
|
|
104
|
-
[:config, :project, :environment, :server, :command].each do |scope|
|
105
|
-
define_method("#{scope}_scope?") { current_scope == scope }
|
106
|
-
end
|
107
|
-
|
108
109
|
def in_scope(scope, new_scope_object)
|
109
110
|
parent_scope_object, @current_scope_object = @current_scope_object, new_scope_object
|
110
111
|
@scope.push(scope)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'taketo/node_resolver'
|
2
|
+
|
3
|
+
module Taketo
|
4
|
+
|
5
|
+
class GroupResolver < NodeResolver
|
6
|
+
def nodes
|
7
|
+
super.select { |n| [Taketo::Constructs::Config, Taketo::Constructs::Project, Taketo::Constructs::Environment, Taketo::Constructs::Group].include?(n.class) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
@@ -5,7 +5,7 @@ module Taketo
|
|
5
5
|
class AmbiguousDestinationError < StandardError; end
|
6
6
|
class NonExistentDestinationError < StandardError; end
|
7
7
|
|
8
|
-
class
|
8
|
+
class NodeResolver
|
9
9
|
def initialize(config, path)
|
10
10
|
@config = config
|
11
11
|
if String(path).empty? && !String(config.default_destination).empty?
|
@@ -15,34 +15,11 @@ module Taketo
|
|
15
15
|
@traverser = ConfigTraverser.new(@config)
|
16
16
|
end
|
17
17
|
|
18
|
-
def servers
|
19
|
-
@servers ||= begin
|
20
|
-
collector = SimpleCollector(Taketo::Constructs::Server).new
|
21
|
-
@traverser.visit_depth_first(collector)
|
22
|
-
collector.result
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
18
|
def resolve
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def resolve_by_global_alias
|
31
|
-
unless @path.to_s.empty?
|
32
|
-
servers.select(&:global_alias).detect { |s| s.global_alias == @path.to_s }
|
33
|
-
end
|
19
|
+
resolve_by_path
|
34
20
|
end
|
35
21
|
|
36
22
|
def resolve_by_path
|
37
|
-
matching_servers = servers.select { |s| s.path =~ /^#@path/ }
|
38
|
-
disambiguate(matching_servers)
|
39
|
-
end
|
40
|
-
|
41
|
-
def get_node
|
42
|
-
resolve_by_global_alias || get_node_by_path
|
43
|
-
end
|
44
|
-
|
45
|
-
def get_node_by_path
|
46
23
|
matching_nodes = nodes.select { |n| n.path == @path }
|
47
24
|
disambiguate(matching_nodes)
|
48
25
|
end
|
@@ -51,14 +28,14 @@ module Taketo
|
|
51
28
|
@nodes ||= begin
|
52
29
|
collector = SimpleCollector(Taketo::Constructs::BaseConstruct).new
|
53
30
|
@traverser.visit_depth_first(collector)
|
54
|
-
collector.result
|
31
|
+
collector.result.reject { |n| Taketo::Constructs::Command === n }
|
55
32
|
end
|
56
33
|
end
|
57
34
|
|
58
35
|
def disambiguate(results)
|
59
36
|
case results.length
|
60
37
|
when 0
|
61
|
-
raise NonExistentDestinationError, "Can't find
|
38
|
+
raise NonExistentDestinationError, "Can't find such destination: #@path"
|
62
39
|
when 1
|
63
40
|
results.first
|
64
41
|
else
|
@@ -70,3 +47,4 @@ module Taketo
|
|
70
47
|
end
|
71
48
|
end
|
72
49
|
|
50
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'taketo/node_resolver'
|
2
|
+
require 'taketo/constructs/server'
|
3
|
+
|
4
|
+
module Taketo
|
5
|
+
|
6
|
+
class ServerResolver < NodeResolver
|
7
|
+
def nodes
|
8
|
+
super.select { |n| Taketo::Constructs::Server === n }
|
9
|
+
end
|
10
|
+
alias :servers :nodes
|
11
|
+
|
12
|
+
def resolve
|
13
|
+
resolve_by_global_alias || resolve_by_path
|
14
|
+
end
|
15
|
+
|
16
|
+
def resolve_by_global_alias
|
17
|
+
unless @path.to_s.empty?
|
18
|
+
servers.select(&:global_alias).detect { |s| s.global_alias == @path.to_s }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def resolve_by_path
|
23
|
+
matching_servers = servers.select { |s| s.path =~ /^#@path/ }
|
24
|
+
disambiguate(matching_servers)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
@@ -13,8 +13,9 @@ feature "Run explicit command on remote host" do
|
|
13
13
|
CONFIG
|
14
14
|
|
15
15
|
run "taketo --dry-run --command 'TERM=xterm-256color bash'"
|
16
|
-
exit_status.should be_success
|
17
16
|
stdout.should == %Q{ssh -t 1.2.3.4 "RAILS_ENV=staging TERM=xterm-256color bash"}
|
17
|
+
stderr.should be_empty
|
18
|
+
exit_status.should be_success
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
@@ -1,22 +1,39 @@
|
|
1
1
|
require 'acceptance_spec_helper'
|
2
2
|
|
3
3
|
feature "Aids completion with matches" do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
background { config_exists <<-CONFIG }
|
5
|
+
project :foo do
|
6
|
+
environment :test do
|
7
7
|
server :s1 do
|
8
8
|
host '1.2.3.4'
|
9
9
|
end
|
10
10
|
end
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
server :s10 do
|
14
|
+
host '2.3.4.5'
|
15
|
+
end
|
16
|
+
CONFIG
|
17
|
+
|
18
|
+
scenario "Show servers by default" do
|
19
|
+
run "taketo --matches"
|
20
|
+
stdout.split.should =~ %w(foo:test:s1 s10)
|
21
|
+
stderr.should be_empty
|
22
|
+
exit_status.should be_success
|
23
|
+
end
|
24
|
+
|
25
|
+
scenario "Show scopes for --list" do
|
26
|
+
run "taketo --list --matches"
|
27
|
+
stdout.split.should =~ %w(foo foo:test)
|
28
|
+
stderr.should be_empty
|
29
|
+
exit_status.should be_success
|
30
|
+
end
|
16
31
|
|
17
|
-
|
32
|
+
scenario "Show all for --view" do
|
33
|
+
run "taketo --view --matches"
|
34
|
+
stdout.split.should =~ %w(foo foo:test foo:test:s1 s10)
|
35
|
+
stderr.should be_empty
|
18
36
|
exit_status.should be_success
|
19
|
-
stdout.should =~ %r{(foo:s1 s10|s10 foo:s1)}
|
20
37
|
end
|
21
38
|
end
|
22
39
|
|
@@ -21,8 +21,9 @@ feature "Config DSL" do
|
|
21
21
|
CONFIG
|
22
22
|
|
23
23
|
run "taketo slots:staging --dry-run"
|
24
|
-
exit_status.should be_success
|
25
24
|
stdout.should =~ %r{ssh -t 1.2.3.4 "(RAILS_ENV=staging FOO=bar|FOO=bar RAILS_ENV=staging) bash"}
|
25
|
+
stderr.should be_empty
|
26
|
+
exit_status.should be_success
|
26
27
|
end
|
27
28
|
|
28
29
|
scenario "Command" do
|
@@ -41,8 +42,9 @@ feature "Config DSL" do
|
|
41
42
|
CONFIG
|
42
43
|
|
43
44
|
run "taketo slots:staging --dry-run --command console"
|
44
|
-
exit_status.should be_success
|
45
45
|
stdout.should == %Q{ssh -t 1.2.3.4 "cd /var/apps/slots; RAILS_ENV=staging rails c"}
|
46
|
+
stderr.should be_empty
|
47
|
+
exit_status.should be_success
|
46
48
|
end
|
47
49
|
|
48
50
|
context "Default command" do
|
@@ -70,14 +72,16 @@ feature "Config DSL" do
|
|
70
72
|
|
71
73
|
scenario "Explicit default command" do
|
72
74
|
run "taketo slots:staging:s1 --dry-run"
|
73
|
-
exit_status.should be_success
|
74
75
|
stdout.should == %q{ssh -t 1.2.3.4 "RAILS_ENV=staging rails c"}
|
76
|
+
stderr.should be_empty
|
77
|
+
exit_status.should be_success
|
75
78
|
end
|
76
79
|
|
77
80
|
scenario "Default command defined in config" do
|
78
81
|
run "taketo slots:staging:s2 --dry-run"
|
79
|
-
exit_status.should be_success
|
80
82
|
stdout.should == %q{ssh -t 2.3.4.5 "RAILS_ENV=staging tmux attach || tmux new-session"}
|
83
|
+
stderr.should be_empty
|
84
|
+
exit_status.should be_success
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
@@ -94,8 +98,9 @@ feature "Config DSL" do
|
|
94
98
|
CONFIG
|
95
99
|
|
96
100
|
run "taketo --dry-run"
|
97
|
-
exit_status.should be_success
|
98
101
|
stdout.should == %q{ssh -t 1.2.3.4 "cd /var/foo; RAILS_ENV=staging bash"}
|
102
|
+
stderr.should be_empty
|
103
|
+
exit_status.should be_success
|
99
104
|
end
|
100
105
|
|
101
106
|
context "Per-Scope default server config" do
|
@@ -127,13 +132,16 @@ feature "Config DSL" do
|
|
127
132
|
|
128
133
|
scenario "Global default server config" do
|
129
134
|
run "taketo shoes --dry-run"
|
130
|
-
exit_status.should be_success
|
131
135
|
stdout.should =~ /ssh -t 2\.3\.4\.5 "(RAILS_ENV=production FOO=bar|FOO=bar RAILS_ENV=production) bash"/
|
136
|
+
stderr.should be_empty
|
137
|
+
exit_status.should be_success
|
132
138
|
end
|
133
139
|
|
134
140
|
scenario "Project default server config" do
|
135
141
|
run "taketo slots --dry-run"
|
136
142
|
stdout.should =~ /ssh -t 1\.2\.3\.4 "cd .mnt.apps; (RAILS_ENV=staging FOO=bar|FOO=bar RAILS_ENV=staging) bash"/
|
143
|
+
stderr.should be_empty
|
144
|
+
exit_status.should be_success
|
137
145
|
end
|
138
146
|
end
|
139
147
|
|
@@ -156,8 +164,9 @@ feature "Config DSL" do
|
|
156
164
|
CONFIG
|
157
165
|
|
158
166
|
run "taketo slots:staging:s1 --dry-run"
|
159
|
-
exit_status.should be_success
|
160
167
|
stdout.should == %q{ssh -t -p 9999 1.2.3.4 "cd /var/qux; RAILS_ENV=staging bash"}
|
168
|
+
stderr.should be_empty
|
169
|
+
exit_status.should be_success
|
161
170
|
end
|
162
171
|
|
163
172
|
scenario "Shared server config with arguments" do
|
@@ -181,8 +190,9 @@ feature "Config DSL" do
|
|
181
190
|
CONFIG
|
182
191
|
|
183
192
|
run "taketo slots:staging:s1 --dry-run"
|
184
|
-
exit_status.should be_success
|
185
193
|
stdout.should == %q{ssh -t -p 9999 1.2.3.4 "cd /var/qux; RAILS_ENV=staging bash"}
|
194
|
+
stderr.should be_empty
|
195
|
+
exit_status.should be_success
|
186
196
|
end
|
187
197
|
end
|
188
198
|
|
@@ -200,8 +210,9 @@ feature "Config DSL" do
|
|
200
210
|
CONFIG
|
201
211
|
|
202
212
|
run "taketo --dry-run"
|
203
|
-
exit_status.should be_success
|
204
213
|
stdout.should =~ %r{ssh -t 1.2.3.4 "cd /var/apps/slots; (RAILS_ENV=staging FOO=the\\ value|FOO=the\\ value RAILS_ENV=staging) bash"}
|
214
|
+
stderr.should be_empty
|
215
|
+
exit_status.should be_success
|
205
216
|
end
|
206
217
|
|
207
218
|
scenario "Unique server alias" do
|
@@ -221,8 +232,9 @@ feature "Config DSL" do
|
|
221
232
|
CONFIG
|
222
233
|
|
223
234
|
run "taketo ss2 --dry-run"
|
224
|
-
exit_status.should be_success
|
225
235
|
stdout.should == %q{ssh -t 2.3.4.5 "RAILS_ENV=staging bash"}
|
236
|
+
stderr.should be_empty
|
237
|
+
exit_status.should be_success
|
226
238
|
end
|
227
239
|
|
228
240
|
scenario "Default destination" do
|
@@ -241,8 +253,9 @@ feature "Config DSL" do
|
|
241
253
|
CONFIG
|
242
254
|
|
243
255
|
run "taketo --dry-run"
|
244
|
-
exit_status.should be_success
|
245
256
|
stdout.should == %Q{ssh -t 2.3.4.5 "RAILS_ENV=staging bash"}
|
257
|
+
stderr.should be_empty
|
258
|
+
exit_status.should be_success
|
246
259
|
end
|
247
260
|
|
248
261
|
scenario "ssh identity file" do
|
@@ -258,8 +271,9 @@ feature "Config DSL" do
|
|
258
271
|
CONFIG
|
259
272
|
|
260
273
|
run "taketo --dry-run"
|
261
|
-
exit_status.should be_success
|
262
274
|
stdout.should == %q{ssh -t -i /home/gor/.ssh/foo\ bar 2.3.4.5 "RAILS_ENV=staging bash"}
|
275
|
+
stderr.should be_empty
|
276
|
+
exit_status.should be_success
|
263
277
|
end
|
264
278
|
|
265
279
|
scenario "server outside project" do
|
@@ -270,8 +284,55 @@ feature "Config DSL" do
|
|
270
284
|
CONFIG
|
271
285
|
|
272
286
|
run "taketo my_server --dry-run"
|
273
|
-
exit_status.should be_success
|
274
287
|
stdout.should == %q{ssh -t 1.2.3.4 "bash"}
|
288
|
+
stderr.should be_empty
|
289
|
+
exit_status.should be_success
|
275
290
|
end
|
276
291
|
|
292
|
+
scenario "group at project level" do
|
293
|
+
create_config <<-CONFIG
|
294
|
+
project :slots do
|
295
|
+
group :frontends do
|
296
|
+
server :s1 do
|
297
|
+
host '1.2.3.4'
|
298
|
+
end
|
299
|
+
|
300
|
+
server :s2 do
|
301
|
+
host '2.3.4.5'
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
server :s3 do
|
306
|
+
host '3.4.5.6'
|
307
|
+
end
|
308
|
+
end
|
309
|
+
CONFIG
|
310
|
+
|
311
|
+
run "taketo --list slots:frontends"
|
312
|
+
stdout.should == "slots:frontends:s1\nslots:frontends:s2"
|
313
|
+
stderr.should be_empty
|
314
|
+
exit_status.should be_success
|
315
|
+
end
|
316
|
+
|
317
|
+
scenario "groups at config level" do
|
318
|
+
create_config <<-CONFIG
|
319
|
+
group :beer do
|
320
|
+
server do
|
321
|
+
host '1.2.3.4'
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
project :bars do
|
326
|
+
server do
|
327
|
+
host '3.4.5.6'
|
328
|
+
end
|
329
|
+
end
|
330
|
+
CONFIG
|
331
|
+
|
332
|
+
run "taketo --list beer"
|
333
|
+
stdout.should == "beer:default"
|
334
|
+
stderr.should be_empty
|
335
|
+
exit_status.should be_success
|
336
|
+
end
|
277
337
|
end
|
338
|
+
|
@@ -6,8 +6,8 @@ feature "Config validation" do
|
|
6
6
|
CONFIG
|
7
7
|
|
8
8
|
run "taketo"
|
9
|
-
exit_status.should_not be_success
|
10
9
|
stderr.should include("There are no servers. Add some to your config (~/.taketo.rc.rb by default)")
|
10
|
+
exit_status.should_not be_success
|
11
11
|
end
|
12
12
|
|
13
13
|
scenario "Project has no servers" do
|
@@ -25,8 +25,23 @@ feature "Config validation" do
|
|
25
25
|
CONFIG
|
26
26
|
|
27
27
|
run "taketo"
|
28
|
-
exit_status.should_not be_success
|
29
28
|
stderr.should include("Project foo: no servers")
|
29
|
+
exit_status.should_not be_success
|
30
|
+
end
|
31
|
+
|
32
|
+
scenario "Group has no servers" do
|
33
|
+
create_config <<-CONFIG
|
34
|
+
server do
|
35
|
+
host '1.2.3.4'
|
36
|
+
end
|
37
|
+
|
38
|
+
group :testgroup do
|
39
|
+
end
|
40
|
+
CONFIG
|
41
|
+
|
42
|
+
run "taketo"
|
43
|
+
stderr.should include("Group testgroup: no servers")
|
44
|
+
exit_status.should_not be_success
|
30
45
|
end
|
31
46
|
|
32
47
|
scenario "Server has no host defined" do
|
@@ -40,8 +55,8 @@ feature "Config validation" do
|
|
40
55
|
CONFIG
|
41
56
|
|
42
57
|
run "taketo"
|
43
|
-
exit_status.should_not be_success
|
44
58
|
stderr.should include("Server foo:bar:default: host is not defined")
|
59
|
+
exit_status.should_not be_success
|
45
60
|
end
|
46
61
|
|
47
62
|
scenario "Duplicate global server alias" do
|
@@ -62,8 +77,8 @@ feature "Config validation" do
|
|
62
77
|
CONFIG
|
63
78
|
|
64
79
|
run "taketo"
|
65
|
-
exit_status.should_not be_success
|
66
80
|
stderr.should include("Server foo:bar:s2: global alias 'a1' has already been taken by server foo:bar:s1")
|
81
|
+
exit_status.should_not be_success
|
67
82
|
end
|
68
83
|
|
69
84
|
scenario "Command without definition" do
|
@@ -81,8 +96,8 @@ feature "Config validation" do
|
|
81
96
|
CONFIG
|
82
97
|
|
83
98
|
run "taketo"
|
84
|
-
exit_status.should_not be_success
|
85
99
|
stderr.should include("Don't know what to execute on command qux")
|
100
|
+
exit_status.should_not be_success
|
86
101
|
end
|
87
102
|
end
|
88
103
|
|
@@ -19,8 +19,9 @@ feature "connect to server" do
|
|
19
19
|
CONFIG
|
20
20
|
|
21
21
|
run "taketo slots:staging:s1 --dry-run"
|
22
|
-
exit_status.should be_success
|
23
22
|
stdout.should == %Q{ssh -t deployer@1.2.3.4 "cd /var/apps/slots; RAILS_ENV=staging bash"}
|
23
|
+
stderr.should be_empty
|
24
|
+
exit_status.should be_success
|
24
25
|
end
|
25
26
|
|
26
27
|
scenario "ssh to the only server" do
|
@@ -36,8 +37,9 @@ feature "connect to server" do
|
|
36
37
|
CONFIG
|
37
38
|
|
38
39
|
run "taketo --dry-run"
|
39
|
-
exit_status.should be_success
|
40
40
|
stdout.should == %Q{ssh -t 1.2.3.4 "cd /var/apps/slots; RAILS_ENV=staging bash"}
|
41
|
+
stderr.should be_empty
|
42
|
+
exit_status.should be_success
|
41
43
|
end
|
42
44
|
|
43
45
|
scenario "ssh without password" do
|
@@ -53,8 +55,9 @@ feature "connect to server" do
|
|
53
55
|
CONFIG
|
54
56
|
|
55
57
|
run "taketo --dry-run"
|
56
|
-
exit_status.should be_success
|
57
58
|
stdout.should == %q{ssh -t -i /home/gor/.ssh/foo\ bar 2.3.4.5 "RAILS_ENV=staging bash"}
|
59
|
+
stderr.should be_empty
|
60
|
+
exit_status.should be_success
|
58
61
|
end
|
59
62
|
end
|
60
63
|
|
@@ -18,14 +18,14 @@ feature "Resolve host error handling" do
|
|
18
18
|
|
19
19
|
scenario "Non-existent location" do
|
20
20
|
run "taketo slots:staging:qqq --dry-run"
|
21
|
+
stderr.should include("Can't find such destination: slots:staging:qqq")
|
21
22
|
exit_status.should_not be_success
|
22
|
-
stderr.should include("Can't find server for path slots:staging:qqq")
|
23
23
|
end
|
24
24
|
|
25
25
|
scenario "Ambiguous location" do
|
26
26
|
run "taketo slots:staging --dry-run"
|
27
|
-
exit_status.should_not be_success
|
28
27
|
stderr.should include("There are multiple possible destinations: slots:staging:s1, slots:staging:s2")
|
28
|
+
exit_status.should_not be_success
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -25,7 +25,6 @@ feature "Generate SSH config" do
|
|
25
25
|
|
26
26
|
scenario "Generate ssh config" do
|
27
27
|
run "taketo --generate-ssh-config"
|
28
|
-
exit_status.should be_success
|
29
28
|
stdout.should == <<-SSH_CONFIG.chomp
|
30
29
|
Host bar.foo.com
|
31
30
|
Hostname bar.foo.com
|
@@ -39,6 +38,7 @@ Hostname 2.3.4.5
|
|
39
38
|
Host 2.3.4.5
|
40
39
|
Hostname 2.3.4.5
|
41
40
|
SSH_CONFIG
|
41
|
+
exit_status.should be_success
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -2,6 +2,8 @@ require 'acceptance_spec_helper'
|
|
2
2
|
|
3
3
|
feature "Global server alias" do
|
4
4
|
background { config_exists <<-CONFIG }
|
5
|
+
default_destination 'foo:bar'
|
6
|
+
|
5
7
|
project :foo do
|
6
8
|
environment :bar do
|
7
9
|
server do
|
@@ -32,7 +34,6 @@ feature "Global server alias" do
|
|
32
34
|
|
33
35
|
scenario "Unique server alias" do
|
34
36
|
run "taketo --view"
|
35
|
-
exit_status.should be_success
|
36
37
|
stdout.should == <<-CONFIG_OUTLINE.chomp
|
37
38
|
|
38
39
|
Project: foo
|
@@ -55,11 +56,11 @@ Project: baz
|
|
55
56
|
console
|
56
57
|
killall - Kill ALL humans
|
57
58
|
CONFIG_OUTLINE
|
59
|
+
exit_status.should be_success
|
58
60
|
end
|
59
61
|
|
60
62
|
scenario "View particular server config" do
|
61
63
|
run "taketo foo:bar:default --view"
|
62
|
-
exit_status.should be_success
|
63
64
|
stdout.should == <<-CONFIG_OUTLINE.chomp
|
64
65
|
Server: default
|
65
66
|
Host: 1.2.3.4
|
@@ -69,6 +70,7 @@ Server: default
|
|
69
70
|
Default command: bash
|
70
71
|
Environment: RAILS_ENV=bar
|
71
72
|
CONFIG_OUTLINE
|
73
|
+
exit_status.should be_success
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
@@ -14,8 +14,9 @@ feature "Location on remote host" do
|
|
14
14
|
CONFIG
|
15
15
|
|
16
16
|
run "taketo slots:staging --dry-run --directory /var/www"
|
17
|
-
exit_status.should be_success
|
18
17
|
stdout.should == %q{ssh -t 1.2.3.4 "cd /var/www; RAILS_ENV=staging bash"}
|
18
|
+
stderr.should be_empty
|
19
|
+
exit_status.should be_success
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'taketo/actions'
|
3
|
+
|
4
|
+
include Taketo
|
5
|
+
|
6
|
+
describe "Actions" do
|
7
|
+
describe ".action_by_name" do
|
8
|
+
it "returns class by name" do
|
9
|
+
Actions[:matches].should == Actions::Matches
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns LoginAction if action was not found" do
|
13
|
+
Actions[:never_existed_here].should == Actions::Login
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|