engineyard 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/engineyard/cli.rb +4 -3
- data/lib/engineyard/cli/ui.rb +2 -2
- data/lib/engineyard/collection/abstract.rb +17 -3
- data/lib/engineyard/model/app.rb +1 -1
- data/lib/engineyard/model/environment.rb +1 -1
- data/lib/engineyard/version.rb +1 -1
- data/spec/engineyard/collection/apps_spec.rb +1 -1
- data/spec/engineyard/collection/environments_spec.rb +1 -1
- data/spec/engineyard/model/environment_spec.rb +6 -12
- data/spec/engineyard/model/instance_spec.rb +0 -5
- data/spec/engineyard/repo_spec.rb +8 -5
- data/spec/engineyard/resolver_spec.rb +4 -11
- data/spec/ey/deploy_spec.rb +2 -2
- data/spec/ey/list_environments_spec.rb +1 -1
- data/spec/ey/logs_spec.rb +1 -1
- data/spec/ey/rebuild_spec.rb +1 -1
- data/spec/ey/recipes/apply_spec.rb +2 -2
- data/spec/ey/recipes/download_spec.rb +3 -3
- data/spec/ey/recipes/upload_spec.rb +3 -3
- data/spec/ey/rollback_spec.rb +2 -2
- data/spec/ey/ssh_spec.rb +25 -27
- data/spec/ey/web/disable_spec.rb +2 -2
- data/spec/ey/web/enable_spec.rb +2 -2
- data/spec/spec_helper.rb +8 -29
- data/spec/support/fake_awsm.rb +51 -0
- data/spec/support/helpers.rb +170 -183
- data/spec/support/matchers.rb +44 -0
- data/spec/support/shared_behavior.rb +6 -34
- metadata +19 -18
- data/spec/support/git_repo.rb +0 -36
data/lib/engineyard/cli.rb
CHANGED
@@ -25,9 +25,10 @@ module EY
|
|
25
25
|
omitted. Furthermore, if a default branch is specified but a different command
|
26
26
|
is supplied the deploy will fail unless --ignore-default-branch is used.
|
27
27
|
|
28
|
-
Migrations are run
|
29
|
-
|
30
|
-
|
28
|
+
Migrations are run based on the 'Migrate?' setting you define in your dashboard
|
29
|
+
for the application. If you want to override these settings, a different
|
30
|
+
command can be specified via --migrate "ruby do_migrations.rb". Migrations
|
31
|
+
can also be skipped entirely by using --no-migrate.
|
31
32
|
DESC
|
32
33
|
method_option :ignore_default_branch, :type => :boolean,
|
33
34
|
:desc => "Force a deploy of the specified branch even if a default is set"
|
data/lib/engineyard/cli/ui.rb
CHANGED
@@ -74,8 +74,8 @@ module EY
|
|
74
74
|
|
75
75
|
def print_envs(apps, default_env_name = nil, simple = false)
|
76
76
|
if simple
|
77
|
-
envs = apps.map{ |
|
78
|
-
puts envs.flatten.map{|
|
77
|
+
envs = apps.map{ |app| app.environments.to_a }
|
78
|
+
puts envs.flatten.map{|env| env.name }.uniq
|
79
79
|
else
|
80
80
|
apps.each do |app|
|
81
81
|
puts "#{app.name} (#{app.account.name})"
|
@@ -2,14 +2,28 @@ require 'engineyard/error'
|
|
2
2
|
|
3
3
|
module EY
|
4
4
|
module Collection
|
5
|
-
class Abstract
|
5
|
+
class Abstract
|
6
6
|
COLLAB_MESSAGE = <<-MSG
|
7
7
|
\nThis error is due to having access to another account's resources via the collaboration feature.
|
8
8
|
Specify --account ACCOUNT_NAME to resolve this ambiguity.
|
9
9
|
MSG
|
10
10
|
|
11
|
+
include Enumerable
|
12
|
+
|
13
|
+
def initialize(contents)
|
14
|
+
@contents = contents ? contents.dup.flatten : []
|
15
|
+
end
|
16
|
+
|
17
|
+
def each(&block)
|
18
|
+
@contents.each(&block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_a
|
22
|
+
@contents
|
23
|
+
end
|
24
|
+
|
11
25
|
def named(name, account_name=nil)
|
12
|
-
candidates = find_all do |x|
|
26
|
+
candidates = @contents.find_all do |x|
|
13
27
|
if account_name
|
14
28
|
x.name.downcase == name.downcase && x.account.name.downcase == account_name.downcase
|
15
29
|
else
|
@@ -33,7 +47,7 @@ Specify --account ACCOUNT_NAME to resolve this ambiguity.
|
|
33
47
|
private
|
34
48
|
|
35
49
|
def find_by_unambiguous_substring(name_part)
|
36
|
-
candidates = find_all{|e| e.name.downcase[name_part.downcase] }
|
50
|
+
candidates = @contents.find_all{|e| e.name.downcase[name_part.downcase] }
|
37
51
|
if candidates.size > 1
|
38
52
|
raise ambiguous_error(name_part, candidates.map {|e| e.name})
|
39
53
|
end
|
data/lib/engineyard/model/app.rb
CHANGED
data/lib/engineyard/version.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "EY::Model::Environment#rebuild" do
|
4
|
-
given "it has an api"
|
5
|
-
|
6
4
|
it "hits the rebuild action in the API" do
|
7
5
|
env = EY::Model::Environment.from_hash({
|
8
6
|
"id" => 46534,
|
9
|
-
"api" =>
|
7
|
+
"api" => ey_api,
|
10
8
|
})
|
11
9
|
|
12
10
|
FakeWeb.register_uri(
|
@@ -22,12 +20,10 @@ describe "EY::Model::Environment#rebuild" do
|
|
22
20
|
end
|
23
21
|
|
24
22
|
describe "EY::Model::Environment#run_custom_recipes" do
|
25
|
-
given "it has an api"
|
26
|
-
|
27
23
|
it "hits the rebuild action in the API" do
|
28
24
|
env = EY::Model::Environment.from_hash({
|
29
25
|
"id" => 46534,
|
30
|
-
"api" =>
|
26
|
+
"api" => ey_api,
|
31
27
|
})
|
32
28
|
|
33
29
|
FakeWeb.register_uri(
|
@@ -51,14 +47,12 @@ describe "EY::Model::Environment.from_array" do
|
|
51
47
|
]
|
52
48
|
|
53
49
|
collection = EY::Model::Environment.from_array(api_data)
|
54
|
-
collection.should
|
50
|
+
collection.should respond_to(:each)
|
55
51
|
collection.should respond_to(:match_one)
|
56
52
|
end
|
57
53
|
end
|
58
54
|
|
59
55
|
describe "EY::Model::Environment#instances" do
|
60
|
-
given "it has an api"
|
61
|
-
|
62
56
|
it "returns instances" do
|
63
57
|
instance_data = {
|
64
58
|
"id" => "1",
|
@@ -69,7 +63,7 @@ describe "EY::Model::Environment#instances" do
|
|
69
63
|
|
70
64
|
env = EY::Model::Environment.from_hash({
|
71
65
|
"id" => 10291,
|
72
|
-
"api" =>
|
66
|
+
"api" => ey_api,
|
73
67
|
"instances" => [instance_data],
|
74
68
|
})
|
75
69
|
|
@@ -159,14 +153,14 @@ describe "EY::Model::Environment#migration_command" do
|
|
159
153
|
@app = EY::Model::App.from_hash({:name => 'fake'})
|
160
154
|
@migrate = EY::Model::Environment.from_hash({
|
161
155
|
"id" => 10291,
|
162
|
-
"api" =>
|
156
|
+
"api" => ey_api,
|
163
157
|
'name' => 'migrate',
|
164
158
|
'deployment_configurations' => {'fake' => {'migrate' => {'command' => 'fake db:migrate', 'perform' => true}}}
|
165
159
|
})
|
166
160
|
|
167
161
|
@no_migrate = EY::Model::Environment.from_hash({
|
168
162
|
"id" => 10291,
|
169
|
-
"api" =>
|
163
|
+
"api" => ey_api,
|
170
164
|
'name' => 'no_migrate',
|
171
165
|
'deployment_configurations' => {'fake' => {'migrate' => {'command' => 'fake db:migrate', 'perform' => false}}}
|
172
166
|
})
|
@@ -1,11 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "EY::Model::Instance#has_app_code?" do
|
4
|
-
|
5
|
-
def have_app_code
|
6
|
-
simple_matcher("has app code") { |given| given.has_app_code? }
|
7
|
-
end
|
8
|
-
|
9
4
|
it "is true for solos" do
|
10
5
|
EY::Model::Instance.from_hash("role" => "solo").should have_app_code
|
11
6
|
end
|
@@ -1,14 +1,17 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe EY::Repo do
|
4
|
-
before(:
|
4
|
+
before(:each) do
|
5
5
|
FakeFS.deactivate!
|
6
6
|
@path = Pathname.new("/tmp/ey-test/.git/")
|
7
7
|
@path.mkpath
|
8
8
|
@r = EY::Repo.new("/tmp/ey-test")
|
9
9
|
end
|
10
|
-
|
11
|
-
after(:each)
|
10
|
+
|
11
|
+
after(:each) do
|
12
|
+
clear_urls
|
13
|
+
FakeFS.activate!
|
14
|
+
end
|
12
15
|
|
13
16
|
def set_head(head)
|
14
17
|
@path.join("HEAD").open('w') {|f| f.write(head) }
|
@@ -51,8 +54,8 @@ describe EY::Repo do
|
|
51
54
|
other_url = "git@github.com:engineyard/engineyard.git"
|
52
55
|
set_url origin_url, "origin"
|
53
56
|
set_url other_url, "other"
|
54
|
-
@r.should
|
55
|
-
@r.should
|
57
|
+
@r.should have_remote(origin_url)
|
58
|
+
@r.should have_remote(other_url)
|
56
59
|
end
|
57
60
|
end # url
|
58
61
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe EY::Resolver do
|
4
|
-
def
|
5
|
-
return @
|
4
|
+
def mock_api
|
5
|
+
return @mock_api if @mock_api
|
6
6
|
apps = Object.new
|
7
7
|
def apps.named(name, *args)
|
8
8
|
result = EY::Model::App.from_hash(:name => name)
|
@@ -15,11 +15,11 @@ describe EY::Resolver do
|
|
15
15
|
result.stub!(:apps => [])
|
16
16
|
result
|
17
17
|
end
|
18
|
-
@
|
18
|
+
@mock_api = mock("api", :apps => apps, :environments => environments)
|
19
19
|
end
|
20
20
|
|
21
21
|
def resolver
|
22
|
-
@resolver ||= EY::Resolver.new(
|
22
|
+
@resolver ||= EY::Resolver.new(mock_api).tap do |r|
|
23
23
|
r.instance_variable_set("@app_deployments", [])
|
24
24
|
end
|
25
25
|
end
|
@@ -45,13 +45,6 @@ describe EY::Resolver do
|
|
45
45
|
r
|
46
46
|
end
|
47
47
|
|
48
|
-
def resolve_to(expected)
|
49
|
-
simple_matcher "resolve to" do |(app,environment), _|
|
50
|
-
app.name.should == expected[:app_name]
|
51
|
-
environment.name.should == expected[:environment_name]
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
48
|
describe "#fetch" do
|
56
49
|
it "raises argument error if the conditions are empty" do
|
57
50
|
lambda { resolver.app_and_environment({}) }.should raise_error(ArgumentError)
|
data/spec/ey/deploy_spec.rb
CHANGED
@@ -43,8 +43,8 @@ describe "ey deploy" do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# common behavior
|
46
|
-
|
47
|
-
|
46
|
+
include_examples "it takes an environment name and an app name and an account name"
|
47
|
+
include_examples "it invokes engineyard-serverside"
|
48
48
|
end
|
49
49
|
|
50
50
|
describe "ey deploy" do
|
@@ -55,7 +55,7 @@ end
|
|
55
55
|
|
56
56
|
describe "ey environments with an ambiguous git repo" do
|
57
57
|
given "integration"
|
58
|
-
|
58
|
+
include_examples "it has an ambiguous git repo"
|
59
59
|
|
60
60
|
it "lists environments from all apps using the git repo" do
|
61
61
|
ey %w[environments]
|
data/spec/ey/logs_spec.rb
CHANGED
data/spec/ey/rebuild_spec.rb
CHANGED
@@ -14,7 +14,7 @@ describe "ey recipes apply" do
|
|
14
14
|
@out.should =~ /Uploaded recipes started for #{scenario[:environment]}/
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
include_examples "it takes an environment name and an account name"
|
18
18
|
|
19
19
|
it "fails when given a bad option" do
|
20
20
|
ey %w[web enable --lots --of --bogus --options], :expect_failure => true
|
@@ -25,5 +25,5 @@ end
|
|
25
25
|
describe "ey recipes apply with an ambiguous git repo" do
|
26
26
|
given "integration"
|
27
27
|
def command_to_run(_) %w[recipes apply] end
|
28
|
-
|
28
|
+
include_examples "it requires an unambiguous git repo"
|
29
29
|
end
|
@@ -11,7 +11,7 @@ describe "ey recipes download" do
|
|
11
11
|
after(:each) do
|
12
12
|
# This test creates + destroys the cookbooks/ directory, thus
|
13
13
|
# rendering the git repo unsuitable for reuse.
|
14
|
-
refresh_git_repo('default')
|
14
|
+
EY.refresh_git_repo('default')
|
15
15
|
end
|
16
16
|
|
17
17
|
def command_to_run(opts)
|
@@ -26,7 +26,7 @@ describe "ey recipes download" do
|
|
26
26
|
File.read('cookbooks/README').should == "Remove this file to clone an upstream git repository of cookbooks\n"
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
include_examples "it takes an environment name and an account name"
|
30
30
|
|
31
31
|
it "fails when cookbooks/ already exists" do
|
32
32
|
api_scenario "one app, one environment"
|
@@ -39,5 +39,5 @@ end
|
|
39
39
|
describe "ey recipes download with an ambiguous git repo" do
|
40
40
|
given "integration"
|
41
41
|
def command_to_run(_) %w[recipes download] end
|
42
|
-
|
42
|
+
include_examples "it requires an unambiguous git repo"
|
43
43
|
end
|
@@ -20,7 +20,7 @@ describe "ey recipes upload" do
|
|
20
20
|
@out.should =~ %r|Recipes in cookbooks/ uploaded successfully for #{scenario[:environment]}|
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
include_examples "it takes an environment name and an account name"
|
24
24
|
end
|
25
25
|
|
26
26
|
describe "ey recipes upload -f recipes.tgz" do
|
@@ -43,7 +43,7 @@ describe "ey recipes upload -f recipes.tgz" do
|
|
43
43
|
@out.should =~ %r|Recipes file recipes.tgz uploaded successfully for #{scenario[:environment]}|
|
44
44
|
end
|
45
45
|
|
46
|
-
|
46
|
+
include_examples "it takes an environment name and an account name"
|
47
47
|
end
|
48
48
|
|
49
49
|
describe "ey recipes upload -f with a missing filenamen" do
|
@@ -66,7 +66,7 @@ end
|
|
66
66
|
describe "ey recipes upload with an ambiguous git repo" do
|
67
67
|
given "integration"
|
68
68
|
def command_to_run(_) %w[recipes upload] end
|
69
|
-
|
69
|
+
include_examples "it requires an unambiguous git repo"
|
70
70
|
end
|
71
71
|
|
72
72
|
describe "ey recipes upload from a separate cookbooks directory" do
|
data/spec/ey/rollback_spec.rb
CHANGED
@@ -18,8 +18,8 @@ describe "ey rollback" do
|
|
18
18
|
@ssh_commands.last.should match(/engineyard-serverside.*deploy rollback.*--app #{scenario[:application]}/)
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
include_examples "it takes an environment name and an app name and an account name"
|
22
|
+
include_examples "it invokes engineyard-serverside"
|
23
23
|
|
24
24
|
it "passes along the web server stack to engineyard-serverside" do
|
25
25
|
api_scenario "one app, one environment"
|
data/spec/ey/ssh_spec.rb
CHANGED
@@ -4,7 +4,6 @@ print_my_args_ssh = "#!/bin/sh\necho ssh $*"
|
|
4
4
|
|
5
5
|
shared_examples_for "running ey ssh" do
|
6
6
|
given "integration"
|
7
|
-
include Spec::Helpers::SharedIntegrationTestUtils
|
8
7
|
|
9
8
|
def extra_ey_options
|
10
9
|
ssh_cmd = <<-RUBY
|
@@ -19,7 +18,6 @@ end
|
|
19
18
|
|
20
19
|
shared_examples_for "running ey ssh for select role" do
|
21
20
|
given "integration"
|
22
|
-
include Spec::Helpers::SharedIntegrationTestUtils
|
23
21
|
|
24
22
|
def extra_ey_options
|
25
23
|
{:prepend_to_path => {'ssh' => "#!/bin/sh\necho ssh $*"}}
|
@@ -58,7 +56,7 @@ shared_examples_for "running ey ssh for select role" do
|
|
58
56
|
end
|
59
57
|
|
60
58
|
describe "ey ssh" do
|
61
|
-
|
59
|
+
include_examples "running ey ssh"
|
62
60
|
|
63
61
|
before(:all) do
|
64
62
|
api_scenario "one app, many environments"
|
@@ -72,13 +70,13 @@ describe "ey ssh" do
|
|
72
70
|
end
|
73
71
|
|
74
72
|
describe "ey ssh with an ambiguous git repo" do
|
75
|
-
|
73
|
+
include_examples "running ey ssh"
|
76
74
|
def command_to_run(_) %w[ssh ls] end
|
77
|
-
|
75
|
+
include_examples "it requires an unambiguous git repo"
|
78
76
|
end
|
79
77
|
|
80
78
|
describe "ey ssh without a command" do
|
81
|
-
|
79
|
+
include_examples "running ey ssh"
|
82
80
|
|
83
81
|
def command_to_run(opts)
|
84
82
|
cmd = ["ssh"]
|
@@ -92,11 +90,11 @@ describe "ey ssh without a command" do
|
|
92
90
|
@raw_ssh_commands.should == ["ssh #{ssh_target}"]
|
93
91
|
end
|
94
92
|
|
95
|
-
|
93
|
+
include_examples "it takes an environment name and an account name"
|
96
94
|
end
|
97
95
|
|
98
96
|
describe "ey ssh with a command" do
|
99
|
-
|
97
|
+
include_examples "running ey ssh"
|
100
98
|
|
101
99
|
def command_to_run(opts)
|
102
100
|
cmd = %w[ssh ls]
|
@@ -110,11 +108,11 @@ describe "ey ssh with a command" do
|
|
110
108
|
@raw_ssh_commands.should == ["ssh #{ssh_target} ls"]
|
111
109
|
end
|
112
110
|
|
113
|
-
|
111
|
+
include_examples "it takes an environment name and an account name"
|
114
112
|
end
|
115
113
|
|
116
114
|
describe "ey ssh with a multi-part command" do
|
117
|
-
|
115
|
+
include_examples "running ey ssh"
|
118
116
|
|
119
117
|
def command_to_run(opts)
|
120
118
|
cmd = ['ssh', 'echo "echo"']
|
@@ -128,7 +126,7 @@ describe "ey ssh with a multi-part command" do
|
|
128
126
|
@raw_ssh_commands.should == ["ssh #{ssh_target} 'echo \"echo\"'"]
|
129
127
|
end
|
130
128
|
|
131
|
-
|
129
|
+
include_examples "it takes an environment name and an account name"
|
132
130
|
end
|
133
131
|
|
134
132
|
describe "ey ssh --all" do
|
@@ -143,8 +141,8 @@ describe "ey ssh --all" do
|
|
143
141
|
db_slave_2_hostname)
|
144
142
|
end
|
145
143
|
|
146
|
-
|
147
|
-
|
144
|
+
include_examples "running ey ssh"
|
145
|
+
include_examples "running ey ssh for select role"
|
148
146
|
end
|
149
147
|
|
150
148
|
describe "ey ssh --app-servers" do
|
@@ -153,8 +151,8 @@ describe "ey ssh --app-servers" do
|
|
153
151
|
@hosts = %w(app_hostname app_master_hostname)
|
154
152
|
end
|
155
153
|
|
156
|
-
|
157
|
-
|
154
|
+
include_examples "running ey ssh"
|
155
|
+
include_examples "running ey ssh for select role"
|
158
156
|
end
|
159
157
|
|
160
158
|
describe "ey ssh --db-master" do
|
@@ -163,8 +161,8 @@ describe "ey ssh --db-master" do
|
|
163
161
|
@hosts = %w(db_master_hostname)
|
164
162
|
end
|
165
163
|
|
166
|
-
|
167
|
-
|
164
|
+
include_examples "running ey ssh"
|
165
|
+
include_examples "running ey ssh for select role"
|
168
166
|
end
|
169
167
|
|
170
168
|
describe "ey ssh --db-slaves" do
|
@@ -173,8 +171,8 @@ describe "ey ssh --db-slaves" do
|
|
173
171
|
@hosts = %w(db_slave_1_hostname db_slave_2_hostname)
|
174
172
|
end
|
175
173
|
|
176
|
-
|
177
|
-
|
174
|
+
include_examples "running ey ssh"
|
175
|
+
include_examples "running ey ssh for select role"
|
178
176
|
end
|
179
177
|
|
180
178
|
describe "ey ssh --db-servers" do
|
@@ -183,8 +181,8 @@ describe "ey ssh --db-servers" do
|
|
183
181
|
@hosts = %w(db_master_hostname db_slave_1_hostname db_slave_2_hostname)
|
184
182
|
end
|
185
183
|
|
186
|
-
|
187
|
-
|
184
|
+
include_examples "running ey ssh"
|
185
|
+
include_examples "running ey ssh for select role"
|
188
186
|
end
|
189
187
|
|
190
188
|
describe "ey ssh --utilities" do
|
@@ -193,8 +191,8 @@ describe "ey ssh --utilities" do
|
|
193
191
|
@hosts = %w(util_fluffy_hostname util_rocky_hostname)
|
194
192
|
end
|
195
193
|
|
196
|
-
|
197
|
-
|
194
|
+
include_examples "running ey ssh"
|
195
|
+
include_examples "running ey ssh for select role"
|
198
196
|
end
|
199
197
|
|
200
198
|
describe "ey ssh --utilities fluffy" do
|
@@ -203,8 +201,8 @@ describe "ey ssh --utilities fluffy" do
|
|
203
201
|
@hosts = %w(util_fluffy_hostname)
|
204
202
|
end
|
205
203
|
|
206
|
-
|
207
|
-
|
204
|
+
include_examples "running ey ssh"
|
205
|
+
include_examples "running ey ssh for select role"
|
208
206
|
end
|
209
207
|
|
210
208
|
describe "ey ssh --utilities fluffy rocky" do
|
@@ -213,7 +211,7 @@ describe "ey ssh --utilities fluffy rocky" do
|
|
213
211
|
@hosts = %w(util_fluffy_hostname util_rocky_hostname)
|
214
212
|
end
|
215
213
|
|
216
|
-
|
217
|
-
|
214
|
+
include_examples "running ey ssh"
|
215
|
+
include_examples "running ey ssh for select role"
|
218
216
|
end
|
219
217
|
|