engineyard 1.2.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,8 +30,12 @@ module EY
30
30
  @apps ||= EY::Model::App.from_array(request('/apps')["apps"], :api => self)
31
31
  end
32
32
 
33
+ def apps_for_repo(repo)
34
+ apps.find_all {|a| repo.urls.include?(a.repository_uri) }
35
+ end
36
+
33
37
  def app_for_repo(repo)
34
- candidates = apps.find_all {|a| repo.urls.include?(a.repository_uri) }
38
+ candidates = apps_for_repo(repo)
35
39
  if candidates.size > 1
36
40
  raise EY::AmbiguousGitUriError.new(repo.urls, candidates.map{|x| x.name})
37
41
  end
@@ -102,6 +102,12 @@ module EY
102
102
  end
103
103
  else
104
104
  apps = get_apps(options[:all])
105
+ if !options[:all] && apps.size > 1
106
+ message = "This git repo matches multiple Applications in AppCloud:\n"
107
+ apps.each { |app| message << "\t#{app.name}\n" }
108
+ message << "The following environments contain those applications:\n\n"
109
+ EY.ui.warn(message)
110
+ end
105
111
  EY.ui.warn(NoAppError.new(repo).message) unless apps.any? || options[:all]
106
112
  EY.ui.print_envs(apps, EY.config.default_environment, options[:simple])
107
113
  end
@@ -53,11 +53,7 @@ module EY
53
53
  if all_apps
54
54
  api.apps
55
55
  else
56
- begin
57
- [api.app_for_repo(repo)].compact
58
- rescue EY::AmbiguousGitUriError
59
- raise EY::AmbiguousEnvironmentGitUriError.new(api.environments)
60
- end
56
+ api.apps_for_repo(repo)
61
57
  end
62
58
  end
63
59
 
@@ -1,3 +1,3 @@
1
1
  module EY
2
- VERSION = '1.2.2'
2
+ VERSION = '1.2.3'
3
3
  end
@@ -42,6 +42,12 @@ end
42
42
 
43
43
  describe "ey environments with an ambiguous git repo" do
44
44
  given "integration"
45
- def command_to_run(_) "ssh environments" end
46
- it_should_behave_like "it requires an unambiguous git repo"
45
+ it_should_behave_like "it has an ambiguous git repo"
46
+
47
+ it "lists environments from all apps using the git repo" do
48
+ ey "environments"
49
+ @out.should =~ /git repo matches multiple/i
50
+ @out.should include("giblets")
51
+ @out.should include("keycollector_production")
52
+ end
47
53
  end
@@ -22,7 +22,7 @@ module Spec
22
22
  end
23
23
  end
24
24
 
25
- shared_examples_for "it requires an unambiguous git repo" do
25
+ shared_examples_for "it has an ambiguous git repo" do
26
26
  include Spec::Helpers::SharedIntegrationTestUtils
27
27
 
28
28
  define_git_repo('dup test') do
@@ -34,6 +34,10 @@ shared_examples_for "it requires an unambiguous git repo" do
34
34
  before(:all) do
35
35
  api_scenario "two apps, same git uri"
36
36
  end
37
+ end
38
+
39
+ shared_examples_for "it requires an unambiguous git repo" do
40
+ it_should_behave_like "it has an ambiguous git repo"
37
41
 
38
42
  it "lists disambiguating environments to choose from" do
39
43
  run_ey({}, {:expect_failure => true})
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engineyard
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
- - 2
10
- version: 1.2.2
9
+ - 3
10
+ version: 1.2.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - EY Cloud Team
@@ -19,96 +19,96 @@ date: 2010-08-31 00:00:00 -07:00
19
19
  default_executable: ey
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
+ prerelease: false
22
23
  version_requirements: &id001 !ruby/object:Gem::Requirement
23
24
  none: false
24
25
  requirements:
25
26
  - - ~>
26
27
  - !ruby/object:Gem::Version
27
- hash: 39
28
+ hash: 7
28
29
  segments:
29
- - 0
30
- - 14
31
- - 0
32
- version: 0.14.0
30
+ - 1
31
+ - 5
32
+ - 2
33
+ version: 1.5.2
33
34
  requirement: *id001
34
35
  type: :runtime
35
- name: thor
36
- prerelease: false
36
+ name: highline
37
37
  - !ruby/object:Gem::Dependency
38
+ prerelease: false
38
39
  version_requirements: &id002 !ruby/object:Gem::Requirement
39
40
  none: false
40
41
  requirements:
41
42
  - - ~>
42
43
  - !ruby/object:Gem::Version
43
- hash: 7
44
+ hash: 39
44
45
  segments:
45
- - 1
46
- - 4
47
- version: "1.4"
46
+ - 0
47
+ - 14
48
+ - 0
49
+ version: 0.14.0
48
50
  requirement: *id002
49
51
  type: :runtime
50
- name: rest-client
51
- prerelease: false
52
+ name: thor
52
53
  - !ruby/object:Gem::Dependency
54
+ prerelease: false
53
55
  version_requirements: &id003 !ruby/object:Gem::Requirement
54
56
  none: false
55
57
  requirements:
56
- - - ~>
58
+ - - ">="
57
59
  - !ruby/object:Gem::Version
58
- hash: 7
60
+ hash: 3
59
61
  segments:
60
- - 1
61
- - 5
62
- - 2
63
- version: 1.5.2
62
+ - 0
63
+ version: "0"
64
64
  requirement: *id003
65
65
  type: :runtime
66
- name: highline
67
- prerelease: false
66
+ name: ruby-termios
68
67
  - !ruby/object:Gem::Dependency
68
+ prerelease: false
69
69
  version_requirements: &id004 !ruby/object:Gem::Requirement
70
70
  none: false
71
71
  requirements:
72
- - - ">="
72
+ - - ~>
73
73
  - !ruby/object:Gem::Version
74
- hash: 3
74
+ hash: 23
75
75
  segments:
76
76
  - 0
77
- version: "0"
77
+ - 0
78
+ - 4
79
+ version: 0.0.4
78
80
  requirement: *id004
79
81
  type: :runtime
80
- name: ruby-termios
81
- prerelease: false
82
+ name: escape
82
83
  - !ruby/object:Gem::Dependency
84
+ prerelease: false
83
85
  version_requirements: &id005 !ruby/object:Gem::Requirement
84
86
  none: false
85
87
  requirements:
86
- - - ">="
88
+ - - ~>
87
89
  - !ruby/object:Gem::Version
88
- hash: 3
90
+ hash: 7
89
91
  segments:
90
- - 0
91
- version: "0"
92
+ - 1
93
+ - 4
94
+ version: "1.4"
92
95
  requirement: *id005
93
96
  type: :runtime
94
- name: json_pure
95
- prerelease: false
97
+ name: rest-client
96
98
  - !ruby/object:Gem::Dependency
99
+ prerelease: false
97
100
  version_requirements: &id006 !ruby/object:Gem::Requirement
98
101
  none: false
99
102
  requirements:
100
- - - ~>
103
+ - - ">="
101
104
  - !ruby/object:Gem::Version
102
- hash: 23
105
+ hash: 3
103
106
  segments:
104
107
  - 0
105
- - 0
106
- - 4
107
- version: 0.0.4
108
+ version: "0"
108
109
  requirement: *id006
109
110
  type: :runtime
110
- name: escape
111
- prerelease: false
111
+ name: json_pure
112
112
  description: This gem allows you to deploy your rails application to the Engine Yard cloud directly from the command line.
113
113
  email: cloud@engineyard.com
114
114
  executables:
@@ -131,7 +131,6 @@ files:
131
131
  - lib/engineyard/collection.rb
132
132
  - lib/engineyard/config.rb
133
133
  - lib/engineyard/error.rb
134
- - lib/engineyard/model/#api_struct.rb#
135
134
  - lib/engineyard/model/api_struct.rb
136
135
  - lib/engineyard/model/app.rb
137
136
  - lib/engineyard/model/environment.rb
@@ -146,7 +145,6 @@ files:
146
145
  - lib/engineyard.rb
147
146
  - LICENSE
148
147
  - README.rdoc
149
- - spec/engineyard/#resolver_spec.rb#
150
148
  - spec/engineyard/api_spec.rb
151
149
  - spec/engineyard/cli/api_spec.rb
152
150
  - spec/engineyard/cli_spec.rb
@@ -171,7 +169,6 @@ files:
171
169
  - spec/ey/web/disable_spec.rb
172
170
  - spec/ey/web/enable_spec.rb
173
171
  - spec/spec_helper.rb
174
- - spec/support/#shared_behavior.rb#
175
172
  - spec/support/bundled_ey
176
173
  - spec/support/fake_awsm.ru
177
174
  - spec/support/git_repo.rb
@@ -213,7 +210,6 @@ signing_key:
213
210
  specification_version: 3
214
211
  summary: Command-line deployment for the Engine Yard cloud
215
212
  test_files:
216
- - spec/engineyard/#resolver_spec.rb#
217
213
  - spec/engineyard/api_spec.rb
218
214
  - spec/engineyard/cli/api_spec.rb
219
215
  - spec/engineyard/cli_spec.rb
@@ -238,7 +234,6 @@ test_files:
238
234
  - spec/ey/web/disable_spec.rb
239
235
  - spec/ey/web/enable_spec.rb
240
236
  - spec/spec_helper.rb
241
- - spec/support/#shared_behavior.rb#
242
237
  - spec/support/bundled_ey
243
238
  - spec/support/fake_awsm.ru
244
239
  - spec/support/git_repo.rb
@@ -1,31 +0,0 @@
1
- module EY
2
- module Model
3
- class ApiStruct < Struct
4
-
5
- def self.new(*args, &block)
6
- super(*args) do |*block_args|
7
- block.call(*block_args) if block
8
-
9
- def self.from_array(array, common_values = {})
10
- array.map do |values|
11
- from_hash(values.merge(common_values))
12
- end if array
13
- end
14
-
15
- def self.from_hash(hash)
16
- return nil unless hash
17
- members = new.members
18
- values = members.map{|a| hash.has_key?(a.to_sym) ? hash[a.to_sym] : hash[a] }
19
- new(*values)
20
- end
21
-
22
- end
23
- end
24
-
25
- def api_get(uri, options = {})
26
- api.request(uri, options.merge(:method => :get))
27
- end
28
-
29
- end
30
- end
31
- end
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
- require 'engineyard/cli'
3
-
4
- describe EY::Resolver do
5
-
6
- let(:repo) { 'git://engineyard/ey-cloud.git' }
7
-
8
- let(:ey) do
9
- EY::Deployment.new(:account => 'ey',
10
- :repo => repo,
11
- :app => 'ey-cloud',
12
- :environment => 'production')
13
- end
14
-
15
- let(:me) do
16
- EY::Deployment.new(:account => 'me',
17
- :repo => repo,
18
- :app => 'my-app',
19
- :environment => 'production')
20
- end
21
-
22
- context "ambiguous account" do
23
- it do
24
- resolver = EY::Resolver.new([one, two], :repo => repo)
25
- resolver.resolve.should be_nil
26
- resolver.optoins.should == []
27
- end
28
-
29
- it do
30
- EY::Resolver.new([one, two], :repo => repo, :account => 'me').resolve.should == me
31
- end
32
-
33
- end
34
-
35
- end
36
-
37
- deployments = EY::Deployment::Collection.new(get_deployments)
38
- matched_deps = deployments.resolve(params)
39
-
40
- matched_deps.message.should == "no matches"
41
-
@@ -1,275 +0,0 @@
1
- module Spec
2
- module Helpers
3
- module SharedIntegrationTestUtils
4
-
5
- def run_ey(command_options, ey_options={})
6
- if respond_to?(:extra_ey_options) # needed for ssh tests
7
- ey_options.merge!(extra_ey_options)
8
- end
9
-
10
- ey(command_to_run(command_options), ey_options)
11
- end
12
-
13
- def make_scenario(hash)
14
- # since nil will silently turn to empty string when interpolated,
15
- # and there's a lot of string matching involved in integration
16
- # testing, it would be nice to have early notification of typos.
17
- scenario = Hash.new { |h,k| raise "Tried to get key #{k.inspect}, but it's missing!" }
18
- scenario.merge!(hash)
19
- end
20
-
21
- end
22
- end
23
- end
24
-
25
- shared_examples_for "it requires an unambiguous git repo" do
26
- include Spec::Helpers::SharedIntegrationTestUtils
27
-
28
- define_git_repo("dup test") do
29
- system("git remote add dup git://github.com/engineyard/dup.git")
30
- end
31
-
32
- use_git_repo("dup test")
33
-
34
- before(:all) do
35
- api_scenario "two apps, same git uri"
36
- end
37
-
38
- it "lists disambiguating environments to choose from" do
39
- run_ey({}, {:expect_failure => true})
40
- @err.should =~ /ambiguous/
41
- @err.should =~ /specify one of the following environments/
42
- @err.should =~ /giblets/
43
- @err.should =~ /keycollector_production/
44
- end
45
- end
46
-
47
- shared_examples_for "it takes an environment name" do
48
- include Spec::Helpers::SharedIntegrationTestUtils
49
-
50
- it "operates on the current environment by default" do
51
- api_scenario "one app, one environment"
52
- run_ey({:env => nil}, {:debug => true})
53
- verify_ran(make_scenario({
54
- :environment => 'giblets',
55
- :application => 'rails232app',
56
- :master_hostname => 'app_master_hostname.compute-1.amazonaws.com',
57
- :ssh_username => 'turkey',
58
- }))
59
- end
60
-
61
- it "complains when you specify a nonexistent environment" do
62
- api_scenario "one app, one environment"
63
- run_ey({:env => 'typo-happens-here'}, {:expect_failure => true})
64
- @err.should match(/no environment named 'typo-happens-here'/i)
65
- end
66
-
67
- context "given a piece of the environment name" do
68
- before(:all) do
69
- api_scenario "one app, many similarly-named environments"
70
- end
71
-
72
- it "complains when the substring is ambiguous" do
73
- run_ey({:env => 'staging'}, {:expect_failure => true})
74
- @err.should match(/'staging' is ambiguous/)
75
- end
76
-
77
- it "works when the substring is unambiguous" do
78
- api_scenario "one app, many similarly-named environments"
79
- run_ey({:env => 'prod'}, {:debug => true})
80
- verify_ran(make_scenario({
81
- :environment => 'railsapp_production',
82
- :application => 'rails232app',
83
- :master_hostname => 'app_master_hostname.compute-1.amazonaws.com',
84
- :ssh_username => 'turkey',
85
- }))
86
- end
87
- end
88
-
89
- it "complains when it can't guess the environment and its name isn't specified" do
90
- api_scenario "one app, one environment, not linked"
91
- run_ey({:env => nil}, {:expect_failure => true})
92
- @err.should =~ /single environment/i
93
- end
94
- end
95
-
96
- shared_examples_for "it takes an app name" do
97
- include Spec::Helpers::SharedIntegrationTestUtils
98
-
99
- it "allows you to specify a valid app" do
100
- api_scenario "one app, one environment"
101
- Dir.chdir(Dir.tmpdir) do
102
- run_ey({:env => 'giblets', :app => 'rails232app', :ref => 'master'}, {})
103
- verify_ran(make_scenario({
104
- :environment => 'giblets',
105
- :application => 'rails232app',
106
- :master_hostname => 'app_master_hostname.compute-1.amazonaws.com',
107
- :ssh_username => 'turkey',
108
- }))
109
- end
110
- end
111
-
112
- it "can guess the environment from the app" do
113
- api_scenario "two apps"
114
- Dir.chdir(Dir.tmpdir) do
115
- run_ey({:app => 'rails232app', :ref => 'master'}, {})
116
- verify_ran(make_scenario({
117
- :environment => 'giblets',
118
- :application => 'rails232app',
119
- :master_hostname => 'app_master_hostname.compute-1.amazonaws.com',
120
- :ssh_username => 'turkey',
121
- }))
122
- end
123
- end
124
-
125
- it "complains when you specify a nonexistant app" do
126
- api_scenario "one app, one environment"
127
- run_ey({:env => 'giblets', :app => 'P-time-SAT-solver', :ref => 'master'},
128
- {:expect_failure => true})
129
- @err.should =~ /no app.*P-time-SAT-solver/i
130
- end
131
-
132
- end
133
-
134
- shared_examples_for "it invokes engineyard-serverside" do
135
- include Spec::Helpers::SharedIntegrationTestUtils
136
-
137
- context "with arguments" do
138
- before(:all) do
139
- api_scenario "one app, one environment"
140
- run_ey({:env => 'giblets', :verbose => true})
141
- end
142
-
143
- it "passes --verbose to engineyard-serverside" do
144
- @ssh_commands.should have_command_like(/engineyard-serverside.*deploy.*--verbose/)
145
- end
146
-
147
- it "passes along instance information to engineyard-serverside" do
148
- instance_args = [
149
- Regexp.quote("app_master_hostname.compute-1.amazonaws.com,app_master"),
150
- Regexp.quote("app_hostname.compute-1.amazonaws.com,app"),
151
- Regexp.quote("util_fluffy_hostname.compute-1.amazonaws.com,util,fluffy"),
152
- ]
153
-
154
- db_instance = Regexp.quote("db_master_hostname.compute-1.amazonaws.com,db_master")
155
-
156
- # apps + utilities are all mentioned
157
- instance_args.each do |i|
158
- @ssh_commands.last.should =~ /#{i}/
159
- end
160
-
161
- # but not database instances
162
- @ssh_commands.last.should_not =~ /#{db_instance}/
163
-
164
- # and it's all after the option '--instances'
165
- @ssh_commands.last.should match(/--instances (#{instance_args.join('|')})/)
166
- end
167
-
168
- it "passes the framework environment" do
169
- @ssh_commands.last.should match(/--framework-env production/)
170
- end
171
-
172
- end
173
-
174
-
175
- context "engineyard-serverside installation" do
176
- before(:all) do
177
- api_scenario "one app, one environment"
178
- end
179
-
180
- before(:each) do
181
- ENV.delete "NO_SSH"
182
- end
183
-
184
- after(:each) do
185
- ENV['NO_SSH'] = "true"
186
- end
187
-
188
- def exiting_ssh(exit_code)
189
- "#!/usr/bin/env ruby\n exit!(#{exit_code}) if ARGV.to_s =~ /gem list engineyard-serverside/"
190
- end
191
-
192
- it "raises an error if SSH fails" do
193
- run_ey({:env => 'giblets'},
194
- {:prepend_to_path => {'ssh' => exiting_ssh(255)}, :expect_failure => true})
195
- @err.should =~ /SSH connection to \S+ failed/
196
- end
197
-
198
- it "installs engineyard-serverside if it's missing" do
199
- run_ey({:env => 'giblets'}, {:prepend_to_path => {'ssh' => exiting_ssh(1)}})
200
-
201
- gem_install_command = @ssh_commands.find do |command|
202
- command =~ /gem install engineyard-serverside/
203
- end
204
- gem_install_command.should_not be_nil
205
- gem_install_command.should =~ %r{/usr/local/ey_resin/ruby/bin/gem install.*engineyard-serverside}
206
- end
207
-
208
- it "does not try to install engineyard-serverside if it's already there" do
209
- run_ey({:env => 'giblets'}, {:prepend_to_path => {'ssh' => exiting_ssh(0)}})
210
- @ssh_commands.should_not have_command_like(/gem install engineyard-serverside/)
211
- ver = Regexp.quote(EY::ENGINEYARD_SERVERSIDE_VERSION)
212
- @ssh_commands.should have_command_like(/engineyard-serverside _#{ver}_ deploy/)
213
- end
214
- end
215
- end
216
-
217
- shared_examples_for "model collections" do
218
- describe "#match_one" do
219
- it "works when given an unambiguous substring" do
220
- @collection.match_one("prod").name.should == "app_production"
221
- end
222
-
223
- it "raises an error when given an ambiguous substring" do
224
- lambda {
225
- @collection.match_one("staging")
226
- }.should raise_error(@collection_class.ambiguous_error)
227
- end
228
-
229
- it "returns an exact match if one exists" do
230
- @collection.match_one("app_staging").name.should == "app_staging"
231
- end
232
-
233
- it "returns nil when it can't find anything" do
234
- @collection.match_one("dev-and-production").should be_nil
235
- end
236
- end
237
-
238
- describe "#match_one!" do
239
- it "works when given an unambiguous substring" do
240
- @collection.match_one!("prod").name.should == "app_production"
241
- end
242
-
243
- it "raises an error when given an ambiguous substring" do
244
- lambda {
245
- @collection.match_one!("staging")
246
- }.should raise_error(@collection_class.ambiguous_error)
247
- end
248
-
249
- it "returns an exact match if one exists" do
250
- @collection.match_one!("app_staging").name.should == "app_staging"
251
- end
252
-
253
- it "raises an error when given an ambiguous exact string" do
254
- lambda {
255
- @collection.match_one!("app_duplicate")
256
- }.should raise_error(@collection_class.ambiguous_error)
257
- end
258
-
259
- it "raises an error when it can't find anything" do
260
- lambda {
261
- @collection.match_one!("dev-and-production")
262
- }.should raise_error(@collection_class.invalid_error)
263
- end
264
- end
265
-
266
- describe "#named" do
267
- it "finds matching by name" do
268
- @collection.named("app_staging").name.should == "app_staging"
269
- end
270
-
271
- it "returns nil when no name matches" do
272
- @collection.named("something else").should be_nil
273
- end
274
- end
275
- end