engineyard 1.4.29 → 1.7.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +139 -4
- data/bin/ey +1 -7
- data/lib/engineyard.rb +1 -22
- data/lib/engineyard/cli.rb +192 -94
- data/lib/engineyard/cli/#recipes.rb# +32 -0
- data/lib/engineyard/cli/api.rb +42 -28
- data/lib/engineyard/cli/recipes.rb +13 -6
- data/lib/engineyard/cli/ui.rb +103 -42
- data/lib/engineyard/cli/web.rb +16 -10
- data/lib/engineyard/config.rb +92 -18
- data/lib/engineyard/deploy_config.rb +66 -0
- data/lib/engineyard/deploy_config/migrate.rb +125 -0
- data/lib/engineyard/deploy_config/ref.rb +56 -0
- data/lib/engineyard/error.rb +38 -78
- data/lib/engineyard/repo.rb +75 -27
- data/lib/engineyard/serverside_runner.rb +133 -0
- data/lib/engineyard/thor.rb +110 -18
- data/lib/engineyard/version.rb +1 -1
- data/spec/engineyard/cli/api_spec.rb +10 -16
- data/spec/engineyard/cli_spec.rb +0 -11
- data/spec/engineyard/config_spec.rb +1 -8
- data/spec/engineyard/deploy_config_spec.rb +203 -0
- data/spec/engineyard/eyrc_spec.rb +2 -0
- data/spec/engineyard/repo_spec.rb +57 -34
- data/spec/ey/deploy_spec.rb +102 -52
- data/spec/ey/list_environments_spec.rb +69 -14
- data/spec/ey/login_spec.rb +11 -7
- data/spec/ey/logout_spec.rb +4 -4
- data/spec/ey/logs_spec.rb +6 -6
- data/spec/ey/recipes/apply_spec.rb +1 -1
- data/spec/ey/recipes/download_spec.rb +1 -1
- data/spec/ey/recipes/upload_spec.rb +6 -6
- data/spec/ey/rollback_spec.rb +3 -3
- data/spec/ey/ssh_spec.rb +9 -9
- data/spec/ey/status_spec.rb +2 -2
- data/spec/ey/whoami_spec.rb +9 -8
- data/spec/spec_helper.rb +18 -15
- data/spec/support/{fake_awsm.rb → git_repos.rb} +0 -14
- data/spec/support/helpers.rb +84 -28
- data/spec/support/matchers.rb +0 -16
- data/spec/support/shared_behavior.rb +83 -103
- metadata +65 -51
- data/lib/engineyard/api.rb +0 -117
- data/lib/engineyard/collection.rb +0 -7
- data/lib/engineyard/collection/abstract.rb +0 -71
- data/lib/engineyard/collection/apps.rb +0 -8
- data/lib/engineyard/collection/environments.rb +0 -8
- data/lib/engineyard/model.rb +0 -12
- data/lib/engineyard/model/account.rb +0 -8
- data/lib/engineyard/model/api_struct.rb +0 -33
- data/lib/engineyard/model/app.rb +0 -32
- data/lib/engineyard/model/deployment.rb +0 -90
- data/lib/engineyard/model/environment.rb +0 -194
- data/lib/engineyard/model/instance.rb +0 -166
- data/lib/engineyard/model/log.rb +0 -9
- data/lib/engineyard/model/user.rb +0 -6
- data/lib/engineyard/resolver.rb +0 -134
- data/lib/engineyard/rest_client_ext.rb +0 -9
- data/lib/engineyard/ruby_ext.rb +0 -9
- data/spec/engineyard/api_spec.rb +0 -39
- data/spec/engineyard/collection/apps_spec.rb +0 -16
- data/spec/engineyard/collection/environments_spec.rb +0 -16
- data/spec/engineyard/model/api_struct_spec.rb +0 -41
- data/spec/engineyard/model/environment_spec.rb +0 -198
- data/spec/engineyard/model/instance_spec.rb +0 -27
- data/spec/engineyard/resolver_spec.rb +0 -112
- data/spec/support/fake_awsm.ru +0 -245
- data/spec/support/scenarios.rb +0 -417
@@ -1,10 +1,5 @@
|
|
1
1
|
module EY
|
2
2
|
class << self
|
3
|
-
def fake_awsm
|
4
|
-
@fake_awsm ||= load_fake_awsm
|
5
|
-
end
|
6
|
-
alias_method :start_fake_awsm, :fake_awsm
|
7
|
-
|
8
3
|
def define_git_repo(name, &setup)
|
9
4
|
git_repo_setup[name] ||= setup
|
10
5
|
end
|
@@ -31,15 +26,6 @@ module EY
|
|
31
26
|
|
32
27
|
protected
|
33
28
|
|
34
|
-
def load_fake_awsm
|
35
|
-
config_ru = File.join(EY_ROOT, "spec/support/fake_awsm.ru")
|
36
|
-
unless system("ruby -c '#{config_ru}' > /dev/null")
|
37
|
-
raise SyntaxError, "There is a syntax error in fake_awsm.ru! fix it!"
|
38
|
-
end
|
39
|
-
@server = RealWeb.start_server_in_fork(config_ru)
|
40
|
-
"http://localhost:#{@server.port}"
|
41
|
-
end
|
42
|
-
|
43
29
|
def git_repo_setup
|
44
30
|
@git_repo_setup ||= {}
|
45
31
|
end
|
data/spec/support/helpers.rb
CHANGED
@@ -24,19 +24,25 @@ module SpecHelpers
|
|
24
24
|
|
25
25
|
module IntegrationHelpers
|
26
26
|
def run_ey(command_options, ey_options={})
|
27
|
+
|
27
28
|
if respond_to?(:extra_ey_options) # needed for ssh tests
|
28
29
|
ey_options.merge!(extra_ey_options)
|
30
|
+
return ey(command_to_run(command_options), ey_options)
|
29
31
|
end
|
30
32
|
|
31
|
-
|
33
|
+
if ey_options[:expect_failure]
|
34
|
+
fast_failing_ey(command_to_run(command_options))
|
35
|
+
else
|
36
|
+
fast_ey(command_to_run(command_options))
|
37
|
+
end
|
32
38
|
end
|
33
39
|
|
34
|
-
def make_scenario(
|
40
|
+
def make_scenario(opts)
|
35
41
|
# since nil will silently turn to empty string when interpolated,
|
36
42
|
# and there's a lot of string matching involved in integration
|
37
43
|
# testing, it would be nice to have early notification of typos.
|
38
44
|
scenario = Hash.new { |h,k| raise "Tried to get key #{k.inspect}, but it's missing!" }
|
39
|
-
scenario.merge!(
|
45
|
+
scenario.merge!(opts)
|
40
46
|
end
|
41
47
|
end
|
42
48
|
|
@@ -69,21 +75,37 @@ module SpecHelpers
|
|
69
75
|
ZeroExitStatus = Class.new(UnexpectedExit)
|
70
76
|
|
71
77
|
def ey_api
|
72
|
-
@api ||= EY::
|
78
|
+
@api ||= EY::CloudClient.new('asdf', EY::CLI::UI.new)
|
79
|
+
end
|
80
|
+
|
81
|
+
def ensure_eyrc
|
82
|
+
begin
|
83
|
+
unless (data = read_eyrc) and data['api_token']
|
84
|
+
raise ".eyrc has no token, specs will stall waiting for stdin authentication input"
|
85
|
+
end
|
86
|
+
rescue Errno::ENOENT => e
|
87
|
+
raise ".eyrc must be written before calling run_ey or specs will stall waiting for stdin authentication input"
|
88
|
+
end
|
73
89
|
end
|
74
90
|
|
75
|
-
def fast_ey(args)
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
91
|
+
def fast_ey(args, options = {})
|
92
|
+
|
93
|
+
ensure_eyrc
|
94
|
+
|
95
|
+
begin
|
96
|
+
err, out = StringIO.new, StringIO.new
|
97
|
+
debug = options[:debug] == false ? nil : 'true'
|
98
|
+
capture_stderr_into(err) do
|
99
|
+
capture_stdout_into(out) do
|
100
|
+
with_env('DEBUG' => debug) do
|
101
|
+
EY::CLI.start(args)
|
102
|
+
end
|
81
103
|
end
|
82
104
|
end
|
105
|
+
ensure
|
106
|
+
@err, @out = err.string, out.string
|
107
|
+
@raw_ssh_commands, @ssh_commands = extract_ssh_commands(@out)
|
83
108
|
end
|
84
|
-
ensure
|
85
|
-
@err, @out = err.string, out.string
|
86
|
-
@raw_ssh_commands, @ssh_commands = extract_ssh_commands(@out)
|
87
109
|
end
|
88
110
|
|
89
111
|
def fast_failing_ey(*args)
|
@@ -94,17 +116,8 @@ module SpecHelpers
|
|
94
116
|
# SystemExit typically indicates a bogus command, which we
|
95
117
|
# here in expected-to-fail land are entirely happy with.
|
96
118
|
nil
|
97
|
-
rescue EY::Error => e
|
98
|
-
|
99
|
-
|
100
|
-
capture_stderr_into(more_err) do
|
101
|
-
capture_stdout_into(more_out) do
|
102
|
-
EY.ui.print_exception(e)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
@err << more_err.string
|
107
|
-
@out << more_out.string
|
119
|
+
rescue EY::Error, EY::CloudClient::Error => e
|
120
|
+
nil
|
108
121
|
end
|
109
122
|
end
|
110
123
|
|
@@ -123,7 +136,12 @@ module SpecHelpers
|
|
123
136
|
end
|
124
137
|
|
125
138
|
def ey(args = [], options = {}, &block)
|
139
|
+
if respond_to?(:extra_ey_options) # needed for ssh tests
|
140
|
+
options.merge!(extra_ey_options)
|
141
|
+
end
|
142
|
+
|
126
143
|
hide_err = options.has_key?(:hide_err) ? options[:hide_err] : options[:expect_failure]
|
144
|
+
|
127
145
|
path_prepends = options[:prepend_to_path]
|
128
146
|
|
129
147
|
ey_env = {
|
@@ -154,6 +172,7 @@ module SpecHelpers
|
|
154
172
|
with_env(ey_env) do
|
155
173
|
exit_status = Open4::open4("#{eybin} #{Escape.shell_command(args)}") do |pid, stdin, stdout, stderr|
|
156
174
|
block.call(stdin) if block
|
175
|
+
stdin.close
|
157
176
|
@out = stdout.read
|
158
177
|
@err = stderr.read
|
159
178
|
end
|
@@ -172,7 +191,7 @@ module SpecHelpers
|
|
172
191
|
end
|
173
192
|
|
174
193
|
def extract_ssh_commands(output)
|
175
|
-
raw_ssh_commands = @out.split(/\n/).find_all do |line|
|
194
|
+
raw_ssh_commands = [@out,@err].join("\n").split(/\n/).find_all do |line|
|
176
195
|
line =~ /^bash -lc/ || line =~ /^ssh/
|
177
196
|
end
|
178
197
|
|
@@ -198,9 +217,46 @@ module SpecHelpers
|
|
198
217
|
[raw_ssh_commands, ssh_commands]
|
199
218
|
end
|
200
219
|
|
201
|
-
|
202
|
-
|
203
|
-
|
220
|
+
DEPRECATED_SCENARIOS = {
|
221
|
+
"empty" => "User Name",
|
222
|
+
"one app without environment" => "App Without Env",
|
223
|
+
"one app, one environment, not linked" => "Unlinked App",
|
224
|
+
"two apps" => "Two Apps",
|
225
|
+
"one app, one environment" => "Linked App",
|
226
|
+
"two accounts, two apps, two environments, ambiguous" => "Multiple Ambiguous Accounts",
|
227
|
+
"one app, one environment, no instances" => "Linked App Not Running",
|
228
|
+
"one app, one environment, app master red" => "Linked App Red Master",
|
229
|
+
"one app, many environments" => "One App Many Envs",
|
230
|
+
"one app, many similarly-named environments" => "One App Similarly Named Envs",
|
231
|
+
"two apps, same git uri" => "Two Apps Same Git URI",
|
232
|
+
}
|
233
|
+
|
234
|
+
def api_scenario(old_name)
|
235
|
+
clean_eyrc # switching scenarios, always clean up
|
236
|
+
name = DEPRECATED_SCENARIOS[old_name]
|
237
|
+
@scenario = EY::CloudClient::Test::Scenario[name]
|
238
|
+
@scenario_email = @scenario.email
|
239
|
+
@scenario_password = @scenario.password
|
240
|
+
@scenario_api_token = @scenario.api_token
|
241
|
+
@scenario
|
242
|
+
end
|
243
|
+
|
244
|
+
def login_scenario(scenario_name)
|
245
|
+
scen = api_scenario(scenario_name)
|
246
|
+
write_eyrc('api_token' => scenario_api_token)
|
247
|
+
scen
|
248
|
+
end
|
249
|
+
|
250
|
+
def scenario_email
|
251
|
+
@scenario_email
|
252
|
+
end
|
253
|
+
|
254
|
+
def scenario_password
|
255
|
+
@scenario_password
|
256
|
+
end
|
257
|
+
|
258
|
+
def scenario_api_token
|
259
|
+
@scenario_api_token
|
204
260
|
end
|
205
261
|
|
206
262
|
def read_yaml(file)
|
data/spec/support/matchers.rb
CHANGED
@@ -26,19 +26,3 @@ RSpec::Matchers.define :have_app_code do
|
|
26
26
|
"Expected #has_app_code? to be false on instance: #{instance.inspect}"
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
30
|
-
RSpec::Matchers.define :resolve_to do |expected|
|
31
|
-
match do |pair|
|
32
|
-
app, env = *pair
|
33
|
-
app.name == expected[:app_name] && env.name == expected[:environment_name]
|
34
|
-
end
|
35
|
-
|
36
|
-
failure_message_for_should do |pair|
|
37
|
-
app, env = *pair
|
38
|
-
"Expected: #{expected[:app_name]}, #{expected[:environment_name]}; Got: #{app.name}, #{env.name}"
|
39
|
-
end
|
40
|
-
|
41
|
-
failure_message_for_should_not do |pair|
|
42
|
-
"Expected to not match: #{expected[:app_name]}, #{expected[:environment_name]}"
|
43
|
-
end
|
44
|
-
end
|
@@ -9,7 +9,7 @@ shared_examples_for "it has an ambiguous git repo" do
|
|
9
9
|
use_git_repo('dup test')
|
10
10
|
|
11
11
|
before(:all) do
|
12
|
-
|
12
|
+
login_scenario "two apps, same git uri"
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -18,10 +18,9 @@ shared_examples_for "it requires an unambiguous git repo" do
|
|
18
18
|
|
19
19
|
it "lists disambiguating environments to choose from" do
|
20
20
|
run_ey({}, {:expect_failure => true})
|
21
|
-
@err.should
|
22
|
-
@err.should =~ /
|
23
|
-
@err.should =~ /
|
24
|
-
@err.should =~ /keycollector_production \(main\)/
|
21
|
+
@err.should include('Multiple environments possible, please be more specific')
|
22
|
+
@err.should =~ /giblets/
|
23
|
+
@err.should =~ /keycollector_production/
|
25
24
|
end
|
26
25
|
end
|
27
26
|
|
@@ -29,16 +28,28 @@ shared_examples_for "it takes an environment name and an app name and an account
|
|
29
28
|
include_examples "it takes an app name"
|
30
29
|
include_examples "it takes an environment name"
|
31
30
|
|
31
|
+
it "complains when you send --account without a value" do
|
32
|
+
login_scenario "empty"
|
33
|
+
fast_failing_ey command_to_run({}) << '--account'
|
34
|
+
@err.should include("No value provided for option '--account'")
|
35
|
+
fast_failing_ey command_to_run({}) << '-c'
|
36
|
+
@err.should include("No value provided for option '--account'")
|
37
|
+
end
|
38
|
+
|
32
39
|
context "when multiple accounts with collaboration" do
|
33
40
|
before :all do
|
34
|
-
|
41
|
+
login_scenario "two accounts, two apps, two environments, ambiguous"
|
35
42
|
end
|
36
43
|
|
37
44
|
it "fails when the app and environment are ambiguous across accounts" do
|
38
|
-
run_ey({:environment => "giblets", :app => "rails232app", :ref => 'master'}, {:expect_failure =>
|
39
|
-
@
|
40
|
-
|
41
|
-
|
45
|
+
run_ey({:environment => "giblets", :app => "rails232app", :ref => 'master'}, {:expect_failure => !@succeeds_on_multiple_matches})
|
46
|
+
if @succeeds_on_multiple_matches
|
47
|
+
@err.should_not match(/multiple/i)
|
48
|
+
else
|
49
|
+
@err.should match(/Multiple application environments possible/i)
|
50
|
+
@err.should match(/ey \S+ --account='account_2' --app='rails232app' --environment='giblets'/i)
|
51
|
+
@err.should match(/ey \S+ --account='main' --app='rails232app' --environment='giblets'/i)
|
52
|
+
end
|
42
53
|
end
|
43
54
|
|
44
55
|
it "runs when specifying the account disambiguates the app to deploy" do
|
@@ -56,9 +67,17 @@ end
|
|
56
67
|
shared_examples_for "it takes an environment name and an account name" do
|
57
68
|
include_examples "it takes an environment name"
|
58
69
|
|
70
|
+
it "complains when you send --account without a value" do
|
71
|
+
login_scenario "empty"
|
72
|
+
fast_failing_ey command_to_run({}) << '--account'
|
73
|
+
@err.should include("No value provided for option '--account'")
|
74
|
+
fast_failing_ey command_to_run({}) << '-c'
|
75
|
+
@err.should include("No value provided for option '--account'")
|
76
|
+
end
|
77
|
+
|
59
78
|
context "when multiple accounts with collaboration" do
|
60
79
|
before :all do
|
61
|
-
|
80
|
+
login_scenario "two accounts, two apps, two environments, ambiguous"
|
62
81
|
end
|
63
82
|
|
64
83
|
it "fails when the app and environment are ambiguous across accounts" do
|
@@ -86,9 +105,8 @@ shared_examples_for "it takes an environment name and an account name" do
|
|
86
105
|
end
|
87
106
|
|
88
107
|
it "returns the error message to the user" do
|
89
|
-
|
90
|
-
|
91
|
-
end.should raise_error(EY::Error, /400.*Important infos/)
|
108
|
+
fast_failing_ey(command_to_run({:environment => "giblets", :account => "main"}))
|
109
|
+
@err.should match(/400.*Important infos/)
|
92
110
|
end
|
93
111
|
end
|
94
112
|
|
@@ -97,8 +115,8 @@ end
|
|
97
115
|
|
98
116
|
shared_examples_for "it takes an environment name" do
|
99
117
|
it "operates on the current environment by default" do
|
100
|
-
|
101
|
-
run_ey(
|
118
|
+
login_scenario "one app, one environment"
|
119
|
+
run_ey(:environment => nil)
|
102
120
|
verify_ran(make_scenario({
|
103
121
|
:environment => 'giblets',
|
104
122
|
:application => 'rails232app',
|
@@ -108,9 +126,18 @@ shared_examples_for "it takes an environment name" do
|
|
108
126
|
end
|
109
127
|
|
110
128
|
it "complains when you specify a nonexistent environment" do
|
111
|
-
|
112
|
-
|
113
|
-
|
129
|
+
login_scenario "one app, one environment"
|
130
|
+
# This test must shell out (not sure why, plz FIXME)
|
131
|
+
ey command_to_run(:environment => 'typo-happens-here'), {:expect_failure => true}
|
132
|
+
@err.should match(/No environment found matching .*typo-happens-here/i)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "complains when you send --environment without a value" do
|
136
|
+
login_scenario "empty"
|
137
|
+
fast_failing_ey command_to_run({}) << '--environment'
|
138
|
+
@err.should include("No value provided for option '--environment'")
|
139
|
+
fast_failing_ey command_to_run({}) << '-e'
|
140
|
+
@err.should include("No value provided for option '--environment'")
|
114
141
|
end
|
115
142
|
|
116
143
|
context "outside a git repo" do
|
@@ -126,7 +153,7 @@ shared_examples_for "it takes an environment name" do
|
|
126
153
|
use_git_repo("not actually a git repo")
|
127
154
|
|
128
155
|
before :all do
|
129
|
-
|
156
|
+
login_scenario "one app, one environment"
|
130
157
|
end
|
131
158
|
|
132
159
|
it "works (and does not complain about git remotes)" do
|
@@ -137,44 +164,57 @@ shared_examples_for "it takes an environment name" do
|
|
137
164
|
|
138
165
|
context "given a piece of the environment name" do
|
139
166
|
before(:all) do
|
140
|
-
|
167
|
+
login_scenario "one app, many similarly-named environments"
|
141
168
|
end
|
142
169
|
|
143
170
|
it "complains when the substring is ambiguous" do
|
144
|
-
run_ey({:environment => 'staging'}, {:expect_failure =>
|
145
|
-
|
146
|
-
|
171
|
+
run_ey({:environment => 'staging'}, {:expect_failure => !@succeeds_on_multiple_matches})
|
172
|
+
|
173
|
+
if @succeeds_on_multiple_matches
|
174
|
+
@err.should_not match(/multiple .* possible/i)
|
147
175
|
else
|
148
|
-
@
|
176
|
+
if @takes_app_name
|
177
|
+
@err.should match(/multiple application environments possible/i)
|
178
|
+
else
|
179
|
+
@err.should match(/multiple environments possible/i)
|
180
|
+
end
|
149
181
|
end
|
150
182
|
end
|
151
183
|
|
152
184
|
it "works when the substring is unambiguous" do
|
153
|
-
|
154
|
-
run_ey({:environment => 'prod'}, {:debug => true})
|
185
|
+
login_scenario "one app, many similarly-named environments"
|
186
|
+
run_ey({:environment => 'prod', :migrate => true}, {:debug => true})
|
155
187
|
verify_ran(make_scenario({
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
188
|
+
:environment => 'railsapp_production',
|
189
|
+
:application => 'rails232app',
|
190
|
+
:master_hostname => 'app_master_hostname.compute-1.amazonaws.com',
|
191
|
+
:ssh_username => 'turkey',
|
192
|
+
}))
|
161
193
|
end
|
162
194
|
end
|
163
195
|
|
164
196
|
it "complains when it can't guess the environment and its name isn't specified" do
|
165
|
-
|
197
|
+
login_scenario "one app without environment"
|
166
198
|
run_ey({:environment => nil}, {:expect_failure => true})
|
167
|
-
@err.should match(/
|
199
|
+
@err.should match(/No environment found for applications matching remotes:/i)
|
168
200
|
end
|
169
201
|
end
|
170
202
|
|
171
203
|
shared_examples_for "it takes an app name" do
|
172
204
|
before { @takes_app_name = true }
|
173
205
|
|
206
|
+
it "complains when you send --app without a value" do
|
207
|
+
login_scenario "empty"
|
208
|
+
fast_failing_ey command_to_run({}) << '--app'
|
209
|
+
@err.should include("No value provided for option '--app'")
|
210
|
+
fast_failing_ey command_to_run({}) << '-a'
|
211
|
+
@err.should include("No value provided for option '--app'")
|
212
|
+
end
|
213
|
+
|
174
214
|
it "allows you to specify a valid app" do
|
175
|
-
|
215
|
+
login_scenario "one app, one environment"
|
176
216
|
Dir.chdir(Dir.tmpdir) do
|
177
|
-
run_ey({:environment => 'giblets', :app => 'rails232app', :ref => 'master'}, {})
|
217
|
+
run_ey({:environment => 'giblets', :app => 'rails232app', :ref => 'master', :migrate => nil}, {})
|
178
218
|
verify_ran(make_scenario({
|
179
219
|
:environment => 'giblets',
|
180
220
|
:application => 'rails232app',
|
@@ -185,9 +225,9 @@ shared_examples_for "it takes an app name" do
|
|
185
225
|
end
|
186
226
|
|
187
227
|
it "can guess the environment from the app" do
|
188
|
-
|
228
|
+
login_scenario "two apps"
|
189
229
|
Dir.chdir(Dir.tmpdir) do
|
190
|
-
run_ey({:app => 'rails232app', :ref => 'master'}, {})
|
230
|
+
run_ey({:app => 'rails232app', :ref => 'master', :migrate => true}, {})
|
191
231
|
verify_ran(make_scenario({
|
192
232
|
:environment => 'giblets',
|
193
233
|
:application => 'rails232app',
|
@@ -198,10 +238,10 @@ shared_examples_for "it takes an app name" do
|
|
198
238
|
end
|
199
239
|
|
200
240
|
it "complains when you specify a nonexistant app" do
|
201
|
-
|
241
|
+
login_scenario "one app, one environment"
|
202
242
|
run_ey({:environment => 'giblets', :app => 'P-time-SAT-solver', :ref => 'master'},
|
203
243
|
{:expect_failure => true})
|
204
|
-
@err.should =~ /
|
244
|
+
@err.should =~ /No app.*P-time-SAT-solver/i
|
205
245
|
end
|
206
246
|
|
207
247
|
end
|
@@ -209,7 +249,7 @@ end
|
|
209
249
|
shared_examples_for "it invokes engineyard-serverside" do
|
210
250
|
context "with arguments" do
|
211
251
|
before(:all) do
|
212
|
-
|
252
|
+
login_scenario "one app, one environment"
|
213
253
|
run_ey({:environment => 'giblets', :verbose => true})
|
214
254
|
end
|
215
255
|
|
@@ -239,8 +279,8 @@ shared_examples_for "it invokes engineyard-serverside" do
|
|
239
279
|
|
240
280
|
context "when no instances have names" do
|
241
281
|
before(:each) do
|
242
|
-
|
243
|
-
run_ey({:env => 'giblets', :app => 'rails232app', :ref => 'master', :verbose => true})
|
282
|
+
login_scenario "two apps"
|
283
|
+
run_ey({:env => 'giblets', :app => 'rails232app', :ref => 'master', :migrate => true, :verbose => true})
|
244
284
|
end
|
245
285
|
|
246
286
|
it "omits the --instance-names parameter" do
|
@@ -248,63 +288,3 @@ shared_examples_for "it invokes engineyard-serverside" do
|
|
248
288
|
end
|
249
289
|
end
|
250
290
|
end
|
251
|
-
|
252
|
-
shared_examples_for "model collections" do
|
253
|
-
describe "#match_one" do
|
254
|
-
it "works when given an unambiguous substring" do
|
255
|
-
@collection.match_one("prod").name.should == "app_production"
|
256
|
-
end
|
257
|
-
|
258
|
-
it "raises an error when given an ambiguous substring" do
|
259
|
-
lambda {
|
260
|
-
@collection.match_one("staging")
|
261
|
-
}.should raise_error(@collection_class.ambiguous_error)
|
262
|
-
end
|
263
|
-
|
264
|
-
it "returns an exact match if one exists" do
|
265
|
-
@collection.match_one("app_staging").name.should == "app_staging"
|
266
|
-
end
|
267
|
-
|
268
|
-
it "returns nil when it can't find anything" do
|
269
|
-
@collection.match_one("dev-and-production").should be_nil
|
270
|
-
end
|
271
|
-
end
|
272
|
-
|
273
|
-
describe "#match_one!" do
|
274
|
-
it "works when given an unambiguous substring" do
|
275
|
-
@collection.match_one!("prod").name.should == "app_production"
|
276
|
-
end
|
277
|
-
|
278
|
-
it "raises an error when given an ambiguous substring" do
|
279
|
-
lambda {
|
280
|
-
@collection.match_one!("staging")
|
281
|
-
}.should raise_error(@collection_class.ambiguous_error)
|
282
|
-
end
|
283
|
-
|
284
|
-
it "returns an exact match if one exists" do
|
285
|
-
@collection.match_one!("app_staging").name.should == "app_staging"
|
286
|
-
end
|
287
|
-
|
288
|
-
it "raises an error when given an ambiguous exact string" do
|
289
|
-
lambda {
|
290
|
-
@collection.match_one!("app_duplicate")
|
291
|
-
}.should raise_error(@collection_class.ambiguous_error)
|
292
|
-
end
|
293
|
-
|
294
|
-
it "raises an error when it can't find anything" do
|
295
|
-
lambda {
|
296
|
-
@collection.match_one!("dev-and-production")
|
297
|
-
}.should raise_error(@collection_class.invalid_error)
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
describe "#named" do
|
302
|
-
it "finds matching by name" do
|
303
|
-
@collection.named("app_staging").name.should == "app_staging"
|
304
|
-
end
|
305
|
-
|
306
|
-
it "returns nil when no name matches" do
|
307
|
-
@collection.named("something else").should be_nil
|
308
|
-
end
|
309
|
-
end
|
310
|
-
end
|