engineyard 1.4.29 → 1.7.0.pre2

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.
Files changed (68) hide show
  1. data/README.rdoc +139 -4
  2. data/bin/ey +1 -7
  3. data/lib/engineyard.rb +1 -22
  4. data/lib/engineyard/cli.rb +192 -94
  5. data/lib/engineyard/cli/#recipes.rb# +32 -0
  6. data/lib/engineyard/cli/api.rb +42 -28
  7. data/lib/engineyard/cli/recipes.rb +13 -6
  8. data/lib/engineyard/cli/ui.rb +103 -42
  9. data/lib/engineyard/cli/web.rb +16 -10
  10. data/lib/engineyard/config.rb +92 -18
  11. data/lib/engineyard/deploy_config.rb +66 -0
  12. data/lib/engineyard/deploy_config/migrate.rb +125 -0
  13. data/lib/engineyard/deploy_config/ref.rb +56 -0
  14. data/lib/engineyard/error.rb +38 -78
  15. data/lib/engineyard/repo.rb +75 -27
  16. data/lib/engineyard/serverside_runner.rb +133 -0
  17. data/lib/engineyard/thor.rb +110 -18
  18. data/lib/engineyard/version.rb +1 -1
  19. data/spec/engineyard/cli/api_spec.rb +10 -16
  20. data/spec/engineyard/cli_spec.rb +0 -11
  21. data/spec/engineyard/config_spec.rb +1 -8
  22. data/spec/engineyard/deploy_config_spec.rb +203 -0
  23. data/spec/engineyard/eyrc_spec.rb +2 -0
  24. data/spec/engineyard/repo_spec.rb +57 -34
  25. data/spec/ey/deploy_spec.rb +102 -52
  26. data/spec/ey/list_environments_spec.rb +69 -14
  27. data/spec/ey/login_spec.rb +11 -7
  28. data/spec/ey/logout_spec.rb +4 -4
  29. data/spec/ey/logs_spec.rb +6 -6
  30. data/spec/ey/recipes/apply_spec.rb +1 -1
  31. data/spec/ey/recipes/download_spec.rb +1 -1
  32. data/spec/ey/recipes/upload_spec.rb +6 -6
  33. data/spec/ey/rollback_spec.rb +3 -3
  34. data/spec/ey/ssh_spec.rb +9 -9
  35. data/spec/ey/status_spec.rb +2 -2
  36. data/spec/ey/whoami_spec.rb +9 -8
  37. data/spec/spec_helper.rb +18 -15
  38. data/spec/support/{fake_awsm.rb → git_repos.rb} +0 -14
  39. data/spec/support/helpers.rb +84 -28
  40. data/spec/support/matchers.rb +0 -16
  41. data/spec/support/shared_behavior.rb +83 -103
  42. metadata +65 -51
  43. data/lib/engineyard/api.rb +0 -117
  44. data/lib/engineyard/collection.rb +0 -7
  45. data/lib/engineyard/collection/abstract.rb +0 -71
  46. data/lib/engineyard/collection/apps.rb +0 -8
  47. data/lib/engineyard/collection/environments.rb +0 -8
  48. data/lib/engineyard/model.rb +0 -12
  49. data/lib/engineyard/model/account.rb +0 -8
  50. data/lib/engineyard/model/api_struct.rb +0 -33
  51. data/lib/engineyard/model/app.rb +0 -32
  52. data/lib/engineyard/model/deployment.rb +0 -90
  53. data/lib/engineyard/model/environment.rb +0 -194
  54. data/lib/engineyard/model/instance.rb +0 -166
  55. data/lib/engineyard/model/log.rb +0 -9
  56. data/lib/engineyard/model/user.rb +0 -6
  57. data/lib/engineyard/resolver.rb +0 -134
  58. data/lib/engineyard/rest_client_ext.rb +0 -9
  59. data/lib/engineyard/ruby_ext.rb +0 -9
  60. data/spec/engineyard/api_spec.rb +0 -39
  61. data/spec/engineyard/collection/apps_spec.rb +0 -16
  62. data/spec/engineyard/collection/environments_spec.rb +0 -16
  63. data/spec/engineyard/model/api_struct_spec.rb +0 -41
  64. data/spec/engineyard/model/environment_spec.rb +0 -198
  65. data/spec/engineyard/model/instance_spec.rb +0 -27
  66. data/spec/engineyard/resolver_spec.rb +0 -112
  67. data/spec/support/fake_awsm.ru +0 -245
  68. data/spec/support/scenarios.rb +0 -417
@@ -1,27 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "EY::Model::Instance#has_app_code?" do
4
- it "is true for solos" do
5
- EY::Model::Instance.from_hash("role" => "solo").should have_app_code
6
- end
7
-
8
- it "is true for app masters" do
9
- EY::Model::Instance.from_hash("role" => "app_master").should have_app_code
10
- end
11
-
12
- it "is true for app slaves" do
13
- EY::Model::Instance.from_hash("role" => "app").should have_app_code
14
- end
15
-
16
- it "is true for utilities" do
17
- EY::Model::Instance.from_hash("role" => "util").should have_app_code
18
- end
19
-
20
- it "is false for DB masters" do
21
- EY::Model::Instance.from_hash("role" => "db_master").should_not have_app_code
22
- end
23
-
24
- it "is false for DB slaves" do
25
- EY::Model::Instance.from_hash("role" => "db_slave").should_not have_app_code
26
- end
27
- end
@@ -1,112 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe EY::Resolver do
4
- def mock_api
5
- return @mock_api if @mock_api
6
- apps = Object.new
7
- def apps.named(name, *args)
8
- result = EY::Model::App.from_hash(:name => name)
9
- result.stub!(:environments => [])
10
- result
11
- end
12
- environments = Object.new
13
- def environments.named(name, *args)
14
- result = EY::Model::Environment.from_hash(:name => name)
15
- result.stub!(:apps => [])
16
- result
17
- end
18
- @mock_api = mock("api", :apps => apps, :environments => environments)
19
- end
20
-
21
- def resolver
22
- @resolver ||= EY::Resolver.new(mock_api).tap do |r|
23
- r.instance_variable_set("@app_deployments", [])
24
- end
25
- end
26
-
27
- def new_app_deployment(options)
28
- resolver.instance_variable_get("@app_deployments") << options
29
- options
30
- end
31
-
32
-
33
- before do
34
- @production = new_app_deployment(:environment_name => "app_production", :app_name => "app", :account_name => "ey", :repository_uri => "git://github.com/repo/app.git")
35
- @staging = new_app_deployment(:environment_name => "app_staging" , :app_name => "app", :account_name => "ey", :repository_uri => "git://github.com/repo/app.git")
36
- @big = new_app_deployment(:environment_name => "bigapp_staging", :app_name => "bigapp", :account_name => "ey", :repository_uri => "git://github.com/repo/bigapp.git")
37
- @ey_dup = new_app_deployment(:environment_name => "app_duplicate" , :app_name => "app_duplicate", :account_name => "ey", :repository_uri => "git://github.com/repo/dup.git")
38
- @sumo = new_app_deployment(:environment_name => "sumo_wrestler" , :app_name => "app_duplicate", :account_name => "ey", :repository_uri => "git://github.com/repo/dup.git")
39
- @me_dup = new_app_deployment(:environment_name => "app_duplicate" , :app_name => "app_duplicate", :account_name => "me", :repository_uri => "git://github.com/repo/dup.git")
40
- end
41
-
42
- def repo(url)
43
- r = mock("repo", :has_remote? => false)
44
- r.stub!(:has_remote?).with(url).and_return(true)
45
- r
46
- end
47
-
48
- describe "#fetch" do
49
- it "raises argument error if the conditions are empty" do
50
- lambda { resolver.app_and_environment({}) }.should raise_error(ArgumentError)
51
- end
52
-
53
- it "raises when there is no app match" do
54
- lambda { resolver.app_and_environment(:environment_name => 'app_duplicate', :app_name => 'smallapp') }.should raise_error(EY::InvalidAppError)
55
- end
56
-
57
- it "raises when there is no environment match" do
58
- lambda { resolver.app_and_environment(:environment_name => 'gibberish', :app_name => 'app') }.should raise_error(EY::NoEnvironmentError)
59
- end
60
-
61
- it "raises when there are no matches" do
62
- lambda { resolver.app_and_environment(:environment_name => 'app_duplicate', :app_name => 'bigapp') }.should raise_error(EY::NoMatchesError)
63
- lambda { resolver.app_and_environment(:repo => repo("git://github.com/repo/app.git"), :environment_name => 'app_duplicate') }.should raise_error(EY::NoMatchesError)
64
- end
65
-
66
- it "raises when there is more than one match" do
67
- lambda { resolver.app_and_environment(:app_name => "app") }.should raise_error(EY::MultipleMatchesError)
68
- lambda { resolver.app_and_environment(:account_name => "ey", :app_name => "app") }.should raise_error(EY::MultipleMatchesError)
69
- lambda { resolver.app_and_environment(:repo => repo("git://github.com/repo/dup.git")) }.should raise_error(EY::MultipleMatchesError)
70
- lambda { resolver.app_and_environment(:repo => repo("git://github.com/repo/app.git")) }.should raise_error(EY::MultipleMatchesError)
71
- end
72
-
73
- it "does not include duplicate copies of apps across accounts when raising a more than one match error" do
74
- do_include = "--environment='sumo_wrestler' --app='app_duplicate' --account='ey'"
75
- do_not_include = "--environment='sumo_wrestler' --app='app_duplicate' --account='me'"
76
- lambda do
77
- resolver.app_and_environment(:repo => repo("git://github.com/repo/dup.git"))
78
- end.should raise_error(EY::MultipleMatchesError) {|e|
79
- e.message.should include(do_include)
80
- e.message.should_not include(do_not_include)
81
- }
82
- end
83
-
84
- it "returns one deployment whene there is only one match" do
85
- resolver.app_and_environment(:account_name => "ey", :app_name => "big").should resolve_to(@big)
86
- resolver.app_and_environment(:environment_name => "production").should resolve_to(@production)
87
- resolver.app_and_environment(:repo => repo("git://github.com/repo/bigapp.git")).should resolve_to(@big)
88
- resolver.app_and_environment(:repo => repo("git://github.com/repo/app.git"), :environment_name => "staging").should resolve_to(@staging)
89
- end
90
-
91
- it "doesn't care about case" do
92
- resolver.app_and_environment(:account_name => "EY", :app_name => "big").should resolve_to(@big)
93
- resolver.app_and_environment(:account_name => "ey", :app_name => "BiG").should resolve_to(@big)
94
- end
95
-
96
- it "returns the match when an app is specified even when there is a repo" do
97
- resolver.app_and_environment(:account_name => "ey", :app_name => "bigapp", :repo => repo("git://github.com/repo/app.git")).should resolve_to(@big)
98
- end
99
-
100
- it "returns the specific match even if there is a partial match" do
101
- resolver.app_and_environment(:environment_name => 'app_staging', :app_name => 'app').should resolve_to(@staging)
102
- resolver.app_and_environment(:environment_name => "app_staging").should resolve_to(@staging)
103
- resolver.app_and_environment(:app_name => "app", :environment_name => "staging").should resolve_to(@staging)
104
- end
105
-
106
- it "scopes searches under the correct account" do
107
- resolver.app_and_environment(:account_name => "ey", :environment_name => "dup", :app_name => "dup").should resolve_to(@ey_dup)
108
- resolver.app_and_environment(:account_name => "me", :environment_name => "dup").should resolve_to(@me_dup)
109
- resolver.app_and_environment(:account_name => "me", :app_name => "dup").should resolve_to(@me_dup)
110
- end
111
- end
112
- end
@@ -1,245 +0,0 @@
1
- require 'rubygems'
2
- require 'sinatra/base'
3
- require 'json'
4
- require File.expand_path('../scenarios', __FILE__)
5
-
6
- class FakeAwsm < Sinatra::Base
7
- SCENARIOS = {
8
- "empty" => Scenario::Base,
9
- "one app, one environment, not linked" => Scenario::UnlinkedApp,
10
- "two apps" => Scenario::TwoApps,
11
- "one app, one environment" => Scenario::LinkedApp,
12
- "two accounts, two apps, two environments, ambiguous" => Scenario::MultipleAmbiguousAccounts,
13
- "one app, one environment, no instances" => Scenario::LinkedAppNotRunning,
14
- "one app, one environment, app master red" => Scenario::LinkedAppRedMaster,
15
- "one app, many environments" => Scenario::OneAppManyEnvs,
16
- "one app, many similarly-named environments" => Scenario::OneAppManySimilarlyNamedEnvs,
17
- "two apps, same git uri" => Scenario::TwoAppsSameGitUri,
18
- }
19
-
20
- def initialize(*_)
21
- super
22
- # the class var is because the object passed to #run is #dup-ed on
23
- # every request. It makes sense; you hardly ever want to keep
24
- # state in your application object (accidentally or otherwise),
25
- # but in this situation that's exactly what we want to do.
26
- @@cloud_mock = CloudMock.new(Scenario::Base.new('git://example.com'))
27
- end
28
-
29
- before { content_type "application/json" }
30
-
31
- get "/" do
32
- content_type :html
33
- "OMG"
34
- end
35
-
36
- put "/scenario" do
37
- new_scenario = SCENARIOS[params[:scenario]]
38
- unless new_scenario
39
- status(400)
40
- return {"ok" => "false", "message" => "wtf is the #{params[:scenario]} scenario?"}.to_json
41
- end
42
- @@cloud_mock = CloudMock.new(new_scenario.new(params[:remote]))
43
- {"ok" => "true"}.to_json
44
- end
45
-
46
- get "/api/v2/current_user" do
47
- { "user" => { "id" => 1, "name" => "User Name", "email" => "test@test.test" } }.to_json
48
- end
49
-
50
- get "/api/v2/apps" do
51
- raise('No user agent header') unless env['HTTP_USER_AGENT'] =~ %r#^EngineYardCLI/#
52
- {"apps" => @@cloud_mock.apps}.to_json
53
- end
54
-
55
- get "/api/v2/environments" do
56
- {"environments" => @@cloud_mock.environments}.to_json
57
- end
58
-
59
- get "/api/v2/environments/:env_id/logs" do
60
- {"logs" => @@cloud_mock.logs(params[:env_id].to_i)}.to_json
61
- end
62
-
63
- get "/api/v2/environments/:env_id/recipes" do
64
- redirect '/fakes3/recipe'
65
- end
66
-
67
- get "/fakes3/recipe" do
68
- content_type "binary/octet-stream"
69
- status(200)
70
-
71
- tempdir = File.join(Dir.tmpdir, "ey_test_cmds_#{Time.now.tv_sec}#{Time.now.tv_usec}_#{$$}")
72
- Dir.mkdir(tempdir)
73
- Dir.mkdir("#{tempdir}/cookbooks")
74
- File.open("#{tempdir}/cookbooks/README", 'w') do |f|
75
- f.write "Remove this file to clone an upstream git repository of cookbooks\n"
76
- end
77
-
78
- Dir.chdir(tempdir) { `tar czf - cookbooks` }
79
- end
80
-
81
- post "/api/v2/environments/:env_id/recipes" do
82
- if params[:file][:tempfile]
83
- files = `tar --list -z -f "#{params[:file][:tempfile].path}"`.split(/\n/)
84
- if files.empty?
85
- status(400)
86
- "No files in uploaded tarball"
87
- else
88
- status(204)
89
- ""
90
- end
91
- else
92
- status(400)
93
- "Recipe file not uploaded"
94
- end
95
- end
96
-
97
- put "/api/v2/environments/:env_id/update_instances" do
98
- status(202)
99
- ""
100
- end
101
-
102
- put "/api/v2/environments/:env_id/run_custom_recipes" do
103
- status(202)
104
- ""
105
- end
106
-
107
- get "/api/v2/apps/:app_id/environments/:environment_id/deployments/last" do
108
- {
109
- "deployment" => {
110
- "id" => 3,
111
- "ref" => "HEAD",
112
- "resolved_ref" => "HEAD",
113
- "commit" => 'a'*40,
114
- "user_name" => "User Name",
115
- "migrate_command" => "rake db:migrate --trace",
116
- "created_at" => Time.now.utc - 3600,
117
- "finished_at" => Time.now.utc - 3400,
118
- "successful" => true,
119
- }
120
- }.to_json
121
- end
122
-
123
- post "/api/v2/apps/:app_id/environments/:environment_id/deployments" do
124
- {"deployment" => params[:deployment].merge({"id" => 2, "commit" => 'a'*40, "resolved_ref" => "resolved-#{params[:deployment][:ref]}"})}.to_json
125
- end
126
-
127
- put "/api/v2/apps/:app_id/environments/:environment_id/deployments/:deployment_id/finished" do
128
- {"deployment" => params[:deployment].merge({"id" => 2, "finished_at" => Time.now})}.to_json
129
- end
130
-
131
- post "/api/v2/authenticate" do
132
- if valid_user?
133
- {"api_token" => "deadbeef", "ok" => true}.to_json
134
- else
135
- status(401)
136
- {"ok" => false}.to_json
137
- end
138
- end
139
-
140
- private
141
-
142
- def valid_user?
143
- params[:email] == "test@test.test" &&
144
- params[:password] == "test"
145
- end
146
-
147
- class CloudMock
148
- def initialize(initial_conditions)
149
- @accounts, @apps, @envs, @keys, @app_joins, @key_joins = [], [], [], [], [], []
150
- @next_id = 1
151
-
152
- initial_conditions.starting_accounts.each {|a| add_account(a) }
153
- initial_conditions.starting_apps.each {|a| add_app(a) }
154
- initial_conditions.starting_environments.each {|e| add_environment(e) }
155
- initial_conditions.starting_app_joins.each {|(app_id, env_id)| link_app(app_id, env_id) }
156
- end
157
-
158
- def add_account(acc)
159
- acc["id"] ||= next_id
160
- @accounts << acc
161
- acc
162
- end
163
-
164
- def add_app(app)
165
- app["id"] ||= next_id
166
- app["account"] ||= @accounts.first
167
- @apps << app
168
- app
169
- end
170
-
171
- def add_environment(env)
172
- env["id"] ||= next_id
173
- env["account"] ||= @accounts.first
174
-
175
- unless env.has_key?("app_master")
176
- master = env["instances"].find{ |i| %w[solo app_master].include?(i["role"]) }
177
- env.merge!("app_master" => master)
178
- end
179
-
180
- @envs << env
181
- env
182
- end
183
-
184
- def link_app(app_id, env_id)
185
- app = @apps.find {|a| a["id"] == app_id } or raise "No such app id:#{app_id}"
186
- env = @envs.find {|e| e["id"] == env_id } or raise "No such environment id:#{env_id}"
187
- if app["account"]["id"] != env["account"]["id"]
188
- raise "App #{app_id} in account #{app["account"]["id"]} cannot be attached to environment #{env_id} in account #{env["account"]["id"]}"
189
- end
190
- @app_joins << [app_id, env_id]
191
- @app_joins.uniq!
192
- end
193
-
194
- def apps
195
- @apps.dup.map do |app|
196
- app.merge("environments" => joined_envs(app))
197
- end
198
- end
199
-
200
- def logs(env_id)
201
- [{
202
- "id" => env_id,
203
- "role" => "app_master",
204
- "main" => "MAIN LOG OUTPUT",
205
- "custom" => "CUSTOM LOG OUTPUT"
206
- }]
207
- end
208
-
209
- def environments
210
- @envs.dup.map do |env|
211
- env.merge("apps" => joined_apps(env))
212
- end
213
- end
214
-
215
- private
216
-
217
- def next_id
218
- id = @next_id
219
- @next_id += 1
220
- id
221
- end
222
-
223
- def joined_envs(app)
224
- related_objects(app, @envs, @app_joins)
225
- end
226
-
227
- def joined_apps(env)
228
- related_objects(env, @apps, @app_joins.map {|j| j.reverse})
229
- end
230
-
231
- def related_objects(obj, candidates, relation)
232
- candidate_table = candidates.inject({}) do |table, candidate|
233
- table.merge(candidate["id"] => candidate)
234
- end
235
-
236
- relation.find_all do |(obj_id, candidate_id)|
237
- obj["id"] == obj_id
238
- end.map do |(obj_id, candidate_id)|
239
- candidate_table[candidate_id]
240
- end
241
- end
242
- end
243
- end
244
-
245
- run FakeAwsm.new
@@ -1,417 +0,0 @@
1
- module Scenario
2
- class Base
3
- attr_accessor :git_remote
4
-
5
- def initialize(git_remote)
6
- self.git_remote = git_remote
7
- end
8
-
9
- def starting_accounts() [{"name" => "main"}] end
10
- def starting_apps() [] end
11
- def starting_environments() [] end
12
- def starting_app_joins() [] end
13
-
14
- end
15
-
16
- class LinkedApp < Base
17
- def _instances
18
- [{
19
- "id" => 27220,
20
- "role" => "app_master",
21
- "name" => nil,
22
- "status" => "running",
23
- "amazon_id" => 'i-ddbbdd92',
24
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
25
- }, {
26
- "id" => 22721,
27
- "name" => nil,
28
- "role" => "db_master",
29
- "status" => "running",
30
- "amazon_id" => "i-d4cdddbf",
31
- "public_hostname" => "db_master_hostname.compute-1.amazonaws.com",
32
- }, {
33
- "id" => 22724,
34
- "name" => nil,
35
- "role" => "db_slave",
36
- "status" => "running",
37
- "amazon_id" => "i-asdfasdfaj",
38
- "public_hostname" => "db_slave_1_hostname.compute-1.amazonaws.com",
39
- }, {
40
- "id" => 22725,
41
- "name" => nil,
42
- "role" => "db_slave",
43
- "status" => "running",
44
- "amazon_id" => "i-asdfasdfaj",
45
- "public_hostname" => "db_slave_2_hostname.compute-1.amazonaws.com",
46
- }, {
47
- "id" => 22722,
48
- "role" => "app",
49
- "name" => nil,
50
- "status" => "building",
51
- "amazon_id" => "i-d2e3f1b9",
52
- "public_hostname" => "app_hostname.compute-1.amazonaws.com",
53
- }, {
54
- "id" => 22723,
55
- "role" => "util",
56
- "name" => "fluffy",
57
- "status" => "running",
58
- "amazon_id" => "i-80e3f1eb",
59
- "public_hostname" => "util_fluffy_hostname.compute-1.amazonaws.com",
60
- }, {
61
- "id" => 22727,
62
- "role" => "util",
63
- "name" => "rocky",
64
- "status" => "running",
65
- "amazon_id" => "i-80etf1eb",
66
- "public_hostname" => "util_rocky_hostname.compute-1.amazonaws.com",
67
- }]
68
- end
69
- private :_instances
70
-
71
- def starting_apps
72
- [{
73
- "id" => 1001,
74
- "name" => "rails232app",
75
- "repository_uri" => git_remote}]
76
- end
77
-
78
- def starting_environments
79
- [{
80
- "id" => 200,
81
- "ssh_username" => "turkey",
82
- "instances" => _instances,
83
- "name" => "giblets",
84
- "instances_count" => 4,
85
- "app_server_stack_name" => "nginx_mongrel",
86
- "load_balancer_ip_address" => '127.0.0.0',
87
- "deployment_configurations" => {
88
- "rails232app" => {
89
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
90
- }
91
- },
92
- "framework_env" => "production"}]
93
- end
94
-
95
- def starting_app_joins
96
- [[1001, 200]]
97
- end
98
-
99
- end # LinkedApp
100
-
101
- class MultipleAmbiguousAccounts < LinkedApp
102
- def starting_accounts
103
- super + [{"name" => "account_2", "id" => 256}]
104
- end
105
-
106
- def starting_apps
107
- apps = super
108
- new_app = apps.first.dup
109
- new_app["id"] += 1000
110
- new_app["account"] = starting_accounts.last
111
- apps + [new_app]
112
- end
113
-
114
- def starting_environments
115
- envs = super
116
- new_env = envs.first.dup
117
- new_env["id"] += 1000
118
- new_env["account"] = starting_accounts.last
119
- envs + [new_env]
120
- end
121
-
122
- def starting_app_joins
123
- joins = super
124
- new_join = [joins.first[0] + 1000,
125
- joins.first[1] + 1000]
126
- joins + [new_join]
127
- end
128
- end
129
-
130
- class UnlinkedApp < Base
131
- def starting_apps
132
- [{
133
- "id" => 1001,
134
- "name" => "rails232app",
135
- "repository_uri" => git_remote}]
136
- end
137
-
138
- def starting_environments
139
- [{
140
- "ssh_username" => "turkey",
141
- "instances" => [{
142
- "status" => "running",
143
- "id" => 27220,
144
- "amazon_id" => 'i-ddbbdd92',
145
- "role" => "solo",
146
- "public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com"}],
147
- "name" => "giblets",
148
- "instances_count" => 1,
149
- "id" => 200,
150
- "app_server_stack_name" => "nginx_mongrel",
151
- "load_balancer_ip_address" => '127.0.0.0',
152
- "framework_env" => "production"}]
153
- end
154
- end # UnlinkedApp
155
-
156
- class LinkedAppNotRunning < Base
157
- def starting_apps
158
- [{
159
- "id" => 1001,
160
- "name" => "rails232app",
161
- "repository_uri" => git_remote}]
162
- end
163
-
164
- def starting_environments
165
- [{
166
- "ssh_username" => "turkey",
167
- "instances" => [],
168
- "name" => "giblets",
169
- "instances_count" => 0,
170
- "id" => 200,
171
- "app_server_stack_name" => "nginx_mongrel",
172
- "load_balancer_ip_address" => '127.0.0.0',
173
- "deployment_configurations" => {
174
- "rails232app" => {
175
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
176
- }
177
- },
178
- "framework_env" => "production"}]
179
- end
180
-
181
- def starting_app_joins
182
- [[1001, 200]]
183
- end
184
- end # LinkedAppNotRunning
185
-
186
- class LinkedAppRedMaster < LinkedApp
187
- def starting_environments
188
- envs = super
189
- envs[0]["instances"][0]["status"] = "error"
190
- envs
191
- end
192
- end
193
-
194
- class OneAppManyEnvs < Base
195
- def starting_apps
196
- [{
197
- "id" => 1001,
198
- "name" => "rails232app",
199
- "repository_uri" => git_remote}]
200
- end
201
-
202
- def starting_app_joins
203
- [
204
- [1001, 200],
205
- [1001, 202],
206
- ]
207
- end
208
-
209
- def starting_environments
210
- [{
211
- "ssh_username" => "turkey",
212
- "instances" => [{
213
- "status" => "running",
214
- "id" => 27220,
215
- "amazon_id" => 'i-ddbbdd92',
216
- "role" => "solo",
217
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
218
- "name" => "giblets",
219
- "instances_count" => 1,
220
- "id" => 200,
221
- "app_server_stack_name" => "nginx_mongrel",
222
- "load_balancer_ip_address" => '127.0.0.0',
223
- "framework_env" => "production",
224
- "deployment_configurations" => {
225
- "rails232app" => {
226
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
227
- }
228
- },
229
- }, {
230
- "ssh_username" => "ham",
231
- "instances" => [],
232
- "name" => "bakon",
233
- "instances_count" => 0,
234
- "app_server_stack_name" => "nginx_passenger",
235
- "load_balancer_ip_address" => '127.0.0.0',
236
- "id" => 202,
237
- "deployment_configurations" => {
238
- "rails232app" => {
239
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
240
- }
241
- },
242
- }, {
243
- "ssh_username" => "hamburger",
244
- "instances" => [],
245
- "name" => "beef",
246
- "instances_count" => 0,
247
- "app_server_stack_name" => "nginx_passenger",
248
- "load_balancer_ip_address" => '127.0.0.0',
249
- "id" => 206,
250
- }]
251
- end
252
- end # OneAppTwoEnvs
253
-
254
- class TwoApps < Base
255
- def railsapp_master
256
- {
257
- "status" => "running",
258
- "name" => nil,
259
- "role" => "solo",
260
- "public_hostname" => "ec2-174-129-7-113.compute-1.amazonaws.com",
261
- "id" => 35707,
262
- "amazon_id" => "i-0911f063",
263
- }
264
- end
265
- private :railsapp_master
266
-
267
- def keycollector_master
268
- {
269
- "status" => "running",
270
- "name" => nil,
271
- "role" => "solo",
272
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
273
- "id" => 75428,
274
- "amazon_id" => "i-051195b9",
275
- }
276
- end
277
- private :keycollector_master
278
-
279
- def starting_apps
280
- [{
281
- "id" => 3202,
282
- "name" => "keycollector",
283
- "repository_uri" => "git@github.com:smerritt/keycollector.git",
284
- }, {
285
- "id" => 6125,
286
- "name" => "rails232app",
287
- "repository_uri" => "git://github.com/smerritt/rails232app.git"}]
288
- end
289
-
290
- def starting_app_joins
291
- [
292
- [6125, 200],
293
- [3202, 439],
294
- ]
295
- end
296
-
297
- def starting_environments
298
- [{
299
- "id" => 200,
300
- "name" => "giblets",
301
- "framework_env" => "staging",
302
- "ssh_username" => "turkey",
303
- "instances_count" => 1,
304
- "instances" => [railsapp_master],
305
- "app_server_stack_name" => "nginx_unicorn",
306
- "load_balancer_ip_address" => '127.0.0.0',
307
- "deployment_configurations" => {
308
- "rails232app" => {
309
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
310
- }
311
- },
312
- }, {
313
- "id" => 439,
314
- "framework_env" => "production",
315
- "name" => "keycollector_production",
316
- "ssh_username" => "deploy",
317
- "instances_count" => 1,
318
- "load_balancer_ip_address" => '127.0.0.0',
319
- "app_server_stack_name" => "nginx_mongrel",
320
- "instances" => [keycollector_master],
321
- "deployment_configurations" => {
322
- "keycollector" => {
323
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
324
- }
325
- },
326
- }]
327
- end
328
- end # TwoApps
329
-
330
- class TwoAppsSameGitUri < TwoApps
331
- def starting_apps
332
- apps = super
333
- apps.each do |app|
334
- app["repository_uri"] = "git://github.com/engineyard/dup.git"
335
- end
336
- apps
337
- end
338
- end # TwoAppsSameGitUri
339
-
340
- class OneAppManySimilarlyNamedEnvs < Base
341
- def starting_apps
342
- [{
343
- "id" => 1001,
344
- "name" => "rails232app",
345
- "repository_uri" => git_remote}]
346
- end
347
-
348
- def starting_environments
349
- [{
350
- "id" => 200,
351
- "ssh_username" => "turkey",
352
- "instances" => [{
353
- "status" => "running",
354
- "id" => 27220,
355
- "amazon_id" => 'i-ddbbdd92',
356
- "role" => "solo",
357
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
358
- "name" => "railsapp_production",
359
- "instances_count" => 1,
360
- "load_balancer_ip_address" => '127.0.0.0',
361
- "app_server_stack_name" => "nginx_mongrel",
362
- "framework_env" => "production",
363
- "deployment_configurations" => {
364
- "rails232app" => {
365
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
366
- }
367
- },
368
- }, {
369
- "id" => 202,
370
- "ssh_username" => "ham",
371
- "instances" => [{
372
- "public_hostname" => '127.3.2.1',
373
- "status" => "running",
374
- "id" => 63066,
375
- "role" => "solo",
376
- }],
377
- "name" => "railsapp_staging",
378
- "instances_count" => 1,
379
- "load_balancer_ip_address" => '127.3.2.1',
380
- "app_server_stack_name" => "nginx_passenger",
381
- "framework_env" => "production",
382
- "deployment_configurations" => {
383
- "rails232app" => {
384
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
385
- }
386
- },
387
- }, {
388
- "ssh_username" => "ham",
389
- "instances" => [{
390
- "status" => "running",
391
- "id" => 59395,
392
- "role" => "solo",
393
- "public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com",
394
- }],
395
- "name" => "railsapp_staging_2",
396
- "instances_count" => 1,
397
- "app_server_stack_name" => "nginx_passenger",
398
- "id" => 204,
399
- "load_balancer_ip_address" => '127.0.0.2',
400
- "framework_env" => "production",
401
- "deployment_configurations" => {
402
- "rails232app" => {
403
- 'migrate' => {'command' => 'rake db:migrate', 'perform' => true}
404
- }
405
- },
406
- }]
407
- end
408
-
409
- def starting_app_joins
410
- [
411
- [1001, 200],
412
- [1001, 202],
413
- [1001, 204],
414
- ]
415
- end
416
- end # OneAppManySimilarlyNamedEnvs
417
- end