engineyard 1.4.0 → 1.4.1
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/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
|
|