engineyard-cloud-client 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/README.rdoc +7 -0
- data/lib/engineyard-cloud-client.rb +149 -0
- data/lib/engineyard-cloud-client/errors.rb +38 -0
- data/lib/engineyard-cloud-client/model_registry.rb +21 -0
- data/lib/engineyard-cloud-client/models.rb +14 -0
- data/lib/engineyard-cloud-client/models/account.rb +38 -0
- data/lib/engineyard-cloud-client/models/api_struct.rb +50 -0
- data/lib/engineyard-cloud-client/models/app.rb +77 -0
- data/lib/engineyard-cloud-client/models/app_environment.rb +85 -0
- data/lib/engineyard-cloud-client/models/deployment.rb +105 -0
- data/lib/engineyard-cloud-client/models/environment.rb +240 -0
- data/lib/engineyard-cloud-client/models/instance.rb +15 -0
- data/lib/engineyard-cloud-client/models/keypair.rb +32 -0
- data/lib/engineyard-cloud-client/models/log.rb +11 -0
- data/lib/engineyard-cloud-client/models/user.rb +11 -0
- data/lib/engineyard-cloud-client/resolver_result.rb +19 -0
- data/lib/engineyard-cloud-client/rest_client_ext.rb +11 -0
- data/lib/engineyard-cloud-client/ruby_ext.rb +9 -0
- data/lib/engineyard-cloud-client/test.rb +31 -0
- data/lib/engineyard-cloud-client/test/fake_awsm.rb +22 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/config.ru +207 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/models.rb +9 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/models/account.rb +13 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/models/app.rb +24 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/models/app_environment.rb +19 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/models/deployments.rb +15 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/models/environment.rb +25 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/models/instance.rb +23 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/models/user.rb +15 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/scenarios.rb +325 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/accounts.rabl +2 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/apps.rabl +10 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/base_app_environment.rabl +13 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/base_environment.rabl +4 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/environments.rabl +11 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/instances.rabl +2 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/resolve_app_environments.rabl +7 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/resolve_environments.rabl +7 -0
- data/lib/engineyard-cloud-client/test/fake_awsm/views/user.rabl +2 -0
- data/lib/engineyard-cloud-client/test/scenario.rb +43 -0
- data/lib/engineyard-cloud-client/test/ui.rb +33 -0
- data/lib/engineyard-cloud-client/version.rb +7 -0
- data/spec/engineyard-cloud-client/api_spec.rb +59 -0
- data/spec/engineyard-cloud-client/integration/account_spec.rb +18 -0
- data/spec/engineyard-cloud-client/integration/app_environment_spec.rb +38 -0
- data/spec/engineyard-cloud-client/integration/app_spec.rb +20 -0
- data/spec/engineyard-cloud-client/integration/environment_spec.rb +57 -0
- data/spec/engineyard-cloud-client/integration/user_spec.rb +18 -0
- data/spec/engineyard-cloud-client/models/api_struct_spec.rb +41 -0
- data/spec/engineyard-cloud-client/models/app_spec.rb +64 -0
- data/spec/engineyard-cloud-client/models/environment_spec.rb +300 -0
- data/spec/engineyard-cloud-client/models/instance_spec.rb +44 -0
- data/spec/engineyard-cloud-client/models/keypair_spec.rb +58 -0
- data/spec/spec_helper.rb +50 -0
- data/spec/support/helpers.rb +16 -0
- data/spec/support/matchers.rb +2 -0
- metadata +377 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'engineyard-cloud-client'
|
2
|
+
|
3
|
+
module EY::CloudClient::Test
|
4
|
+
end
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'dm-core'
|
8
|
+
require 'dm-migrations'
|
9
|
+
require 'dm-aggregates'
|
10
|
+
require 'dm-sqlite-adapter'
|
11
|
+
require 'ey_resolver'
|
12
|
+
require 'rabl'
|
13
|
+
rescue LoadError
|
14
|
+
raise LoadError, <<-ERROR
|
15
|
+
engineyard-cloud-client needs the following gems to run in test mode:
|
16
|
+
|
17
|
+
group 'engineyard-cloud-client-test' do
|
18
|
+
gem 'dm-core'
|
19
|
+
gem 'dm-migrations'
|
20
|
+
gem 'dm-aggregates'
|
21
|
+
gem 'dm-sqlite-adapter'
|
22
|
+
gem 'ey_resolver', '~>0.2.1'
|
23
|
+
gem 'rabl'
|
24
|
+
end
|
25
|
+
|
26
|
+
Please add the above to your Gemfile.
|
27
|
+
ERROR
|
28
|
+
end
|
29
|
+
|
30
|
+
require 'engineyard-cloud-client/test/ui'
|
31
|
+
require 'engineyard-cloud-client/test/scenario'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'engineyard-cloud-client/test'
|
2
|
+
require 'engineyard-cloud-client/test'
|
3
|
+
require 'realweb'
|
4
|
+
|
5
|
+
module EY::CloudClient::Test
|
6
|
+
module FakeAwsm
|
7
|
+
def self.uri
|
8
|
+
@uri ||= load_server
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def self.load_server
|
14
|
+
config_ru = File.expand_path("fake_awsm/config.ru", File.dirname(__FILE__))
|
15
|
+
unless system("ruby -c '#{config_ru}' > /dev/null")
|
16
|
+
raise SyntaxError, "There is a syntax error in fake_awsm/config.ru! FIX IT!"
|
17
|
+
end
|
18
|
+
@server = RealWeb.start_server_in_fork(config_ru)
|
19
|
+
@server.base_uri.to_s
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,207 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sinatra/base'
|
3
|
+
require 'json'
|
4
|
+
require 'rabl'
|
5
|
+
require 'gitable'
|
6
|
+
require 'ey_resolver'
|
7
|
+
require File.expand_path('../scenarios', __FILE__)
|
8
|
+
require File.expand_path('../models', __FILE__)
|
9
|
+
|
10
|
+
Rabl.register!
|
11
|
+
|
12
|
+
class FakeAwsm < Sinatra::Base
|
13
|
+
disable :show_exceptions
|
14
|
+
enable :raise_errors
|
15
|
+
set :views, File.expand_path('../views', __FILE__)
|
16
|
+
|
17
|
+
SCENARIOS = [
|
18
|
+
Scenario::Base.new,
|
19
|
+
Scenario::AppWithoutEnv.new,
|
20
|
+
Scenario::UnlinkedApp.new,
|
21
|
+
Scenario::TwoApps.new,
|
22
|
+
Scenario::LinkedApp.new,
|
23
|
+
Scenario::MultipleAmbiguousAccounts.new,
|
24
|
+
Scenario::LinkedAppNotRunning.new,
|
25
|
+
Scenario::LinkedAppRedMaster.new,
|
26
|
+
Scenario::OneAppManyEnvs.new,
|
27
|
+
Scenario::OneAppManySimilarlyNamedEnvs.new,
|
28
|
+
Scenario::TwoAppsSameGitUri.new,
|
29
|
+
]
|
30
|
+
|
31
|
+
def initialize(*)
|
32
|
+
super
|
33
|
+
@user = Scenario::Base.new.user
|
34
|
+
end
|
35
|
+
|
36
|
+
before do
|
37
|
+
content_type "application/json"
|
38
|
+
token = request.env['HTTP_X_EY_CLOUD_TOKEN']
|
39
|
+
if token
|
40
|
+
@user = User.first(:api_token => token)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
get "/" do
|
45
|
+
content_type :html
|
46
|
+
"OMG"
|
47
|
+
end
|
48
|
+
|
49
|
+
get "/scenario" do
|
50
|
+
new_scenario = SCENARIOS.detect { |scen| scen.user.name == params[:scenario] }
|
51
|
+
unless new_scenario
|
52
|
+
status(404)
|
53
|
+
return {"ok" => "false", "message" => "wtf is the #{params[:scenario]} scenario?"}.to_json
|
54
|
+
end
|
55
|
+
user = new_scenario.user
|
56
|
+
{
|
57
|
+
"scenario" => {
|
58
|
+
"email" => user.email,
|
59
|
+
"password" => user.password,
|
60
|
+
"api_token" => user.api_token,
|
61
|
+
}
|
62
|
+
}.to_json
|
63
|
+
end
|
64
|
+
|
65
|
+
get "/scenarios" do
|
66
|
+
scenarios = SCENARIOS.map do |scen|
|
67
|
+
user = scen.user
|
68
|
+
{
|
69
|
+
:name => user.name,
|
70
|
+
:email => user.email,
|
71
|
+
:password => user.password,
|
72
|
+
:api_token => user.api_token,
|
73
|
+
}
|
74
|
+
end
|
75
|
+
{'scenarios' => scenarios}.to_json
|
76
|
+
end
|
77
|
+
|
78
|
+
get "/api/v2/current_user" do
|
79
|
+
render :rabl, :user, :format => "json"
|
80
|
+
end
|
81
|
+
|
82
|
+
get "/api/v2/accounts" do
|
83
|
+
@accounts = @user.accounts
|
84
|
+
render :rabl, :accounts, :format => "json"
|
85
|
+
end
|
86
|
+
|
87
|
+
get "/api/v2/apps" do
|
88
|
+
raise('No user agent header') unless env['HTTP_USER_AGENT'] =~ %r#^EngineYardCloudClient/#
|
89
|
+
@apps = @user.accounts.apps
|
90
|
+
render :rabl, :apps, :format => "json"
|
91
|
+
end
|
92
|
+
|
93
|
+
get "/api/v2/environments" do
|
94
|
+
@environments = @user.accounts.environments
|
95
|
+
render :rabl, :environments, :format => "json"
|
96
|
+
end
|
97
|
+
|
98
|
+
get "/api/v2/environments/resolve" do
|
99
|
+
@resolver = EY::Resolver.environment_resolver(@user, params['constraints'])
|
100
|
+
render :rabl, :resolve_environments, :format => "json"
|
101
|
+
end
|
102
|
+
|
103
|
+
get "/api/v2/app_environments/resolve" do
|
104
|
+
@resolver = EY::Resolver.app_env_resolver(@user, params['constraints'])
|
105
|
+
render :rabl, :resolve_app_environments, :format => "json"
|
106
|
+
end
|
107
|
+
|
108
|
+
get "/api/v2/environments/:env_id/instances" do
|
109
|
+
environment = @user.accounts.environments.get(params['env_id'])
|
110
|
+
@instances = environment.instances
|
111
|
+
render :rabl, :instances, :format => "json"
|
112
|
+
end
|
113
|
+
|
114
|
+
get "/api/v2/environments/:env_id/logs" do
|
115
|
+
{
|
116
|
+
"logs" => [
|
117
|
+
{
|
118
|
+
"id" => params['env_id'].to_i,
|
119
|
+
"role" => "app_master",
|
120
|
+
"main" => "MAIN LOG OUTPUT",
|
121
|
+
"custom" => "CUSTOM LOG OUTPUT"
|
122
|
+
}
|
123
|
+
]
|
124
|
+
}.to_json
|
125
|
+
end
|
126
|
+
|
127
|
+
get "/api/v2/environments/:env_id/recipes" do
|
128
|
+
redirect '/fakes3/recipe'
|
129
|
+
end
|
130
|
+
|
131
|
+
get "/fakes3/recipe" do
|
132
|
+
content_type "binary/octet-stream"
|
133
|
+
status(200)
|
134
|
+
|
135
|
+
tempdir = File.join(Dir.tmpdir, "ey_test_cmds_#{Time.now.tv_sec}#{Time.now.tv_usec}_#{$$}")
|
136
|
+
Dir.mkdir(tempdir)
|
137
|
+
Dir.mkdir("#{tempdir}/cookbooks")
|
138
|
+
File.open("#{tempdir}/cookbooks/README", 'w') do |f|
|
139
|
+
f.write "Remove this file to clone an upstream git repository of cookbooks\n"
|
140
|
+
end
|
141
|
+
|
142
|
+
Dir.chdir(tempdir) { `tar czf - cookbooks` }
|
143
|
+
end
|
144
|
+
|
145
|
+
post "/api/v2/environments/:env_id/recipes" do
|
146
|
+
if params[:file][:tempfile]
|
147
|
+
files = `tar --list -z -f "#{params[:file][:tempfile].path}"`.split(/\n/)
|
148
|
+
if files.empty?
|
149
|
+
status(400)
|
150
|
+
"No files in uploaded tarball"
|
151
|
+
else
|
152
|
+
status(204)
|
153
|
+
""
|
154
|
+
end
|
155
|
+
else
|
156
|
+
status(400)
|
157
|
+
"Recipe file not uploaded"
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
put "/api/v2/environments/:env_id/update_instances" do
|
162
|
+
status(202)
|
163
|
+
""
|
164
|
+
end
|
165
|
+
|
166
|
+
put "/api/v2/environments/:env_id/run_custom_recipes" do
|
167
|
+
status(202)
|
168
|
+
""
|
169
|
+
end
|
170
|
+
|
171
|
+
get "/api/v2/apps/:app_id/environments/:environment_id/deployments/last" do
|
172
|
+
{
|
173
|
+
"deployment" => {
|
174
|
+
"id" => 3,
|
175
|
+
"ref" => "HEAD",
|
176
|
+
"resolved_ref" => "HEAD",
|
177
|
+
"commit" => 'a'*40,
|
178
|
+
"user_name" => "User Name",
|
179
|
+
"migrate_command" => "rake db:migrate --trace",
|
180
|
+
"created_at" => Time.now.utc - 3600,
|
181
|
+
"finished_at" => Time.now.utc - 3400,
|
182
|
+
"successful" => true,
|
183
|
+
}
|
184
|
+
}.to_json
|
185
|
+
end
|
186
|
+
|
187
|
+
post "/api/v2/apps/:app_id/environments/:environment_id/deployments" do
|
188
|
+
{"deployment" => params[:deployment].merge({"id" => 2, "commit" => 'a'*40, "resolved_ref" => "resolved-#{params[:deployment][:ref]}"})}.to_json
|
189
|
+
end
|
190
|
+
|
191
|
+
put "/api/v2/apps/:app_id/environments/:environment_id/deployments/:deployment_id/finished" do
|
192
|
+
{"deployment" => params[:deployment].merge({"id" => 2, "finished_at" => Time.now})}.to_json
|
193
|
+
end
|
194
|
+
|
195
|
+
post "/api/v2/authenticate" do
|
196
|
+
user = User.first(:email => params[:email], :password => params[:password])
|
197
|
+
if user
|
198
|
+
{"api_token" => user.api_token, "ok" => true}.to_json
|
199
|
+
else
|
200
|
+
status(401)
|
201
|
+
{"ok" => false}.to_json
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
run FakeAwsm.new
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'gitable'
|
2
|
+
require 'dm-core'
|
3
|
+
|
4
|
+
class App
|
5
|
+
include DataMapper::Resource
|
6
|
+
|
7
|
+
property :id, Serial
|
8
|
+
property :name, String
|
9
|
+
property :repository_uri, String
|
10
|
+
property :app_type_id, String
|
11
|
+
|
12
|
+
belongs_to :account
|
13
|
+
has n, :app_environments
|
14
|
+
has n, :environments, :through => :app_environments
|
15
|
+
|
16
|
+
def gitable_uri
|
17
|
+
Gitable::URI.parse(repository_uri)
|
18
|
+
end
|
19
|
+
|
20
|
+
def inspect
|
21
|
+
"#<App name:#{name} account:#{account.name}>"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'dm-core'
|
2
|
+
|
3
|
+
class AppEnvironment
|
4
|
+
include DataMapper::Resource
|
5
|
+
|
6
|
+
property :id, Serial
|
7
|
+
property :app_id, Integer
|
8
|
+
property :environment_id, Integer
|
9
|
+
|
10
|
+
belongs_to :app
|
11
|
+
belongs_to :environment
|
12
|
+
|
13
|
+
has n, :deployments
|
14
|
+
|
15
|
+
def inspect
|
16
|
+
"#<AppEnvironment app:#{app.name} env:#{environment.name}>"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'dm-core'
|
2
|
+
|
3
|
+
class Deployment
|
4
|
+
include DataMapper::Resource
|
5
|
+
|
6
|
+
property :id, Serial
|
7
|
+
property :app_environment_id, Integer
|
8
|
+
|
9
|
+
belongs_to :app_environment
|
10
|
+
|
11
|
+
def inspect
|
12
|
+
"#<Deployment app_environment:#{app_environment.inspect}>"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'dm-core'
|
2
|
+
|
3
|
+
class Environment
|
4
|
+
include DataMapper::Resource
|
5
|
+
|
6
|
+
property :id, Serial
|
7
|
+
property :name, String
|
8
|
+
property :ssh_username, String
|
9
|
+
property :app_server_stack_name, String
|
10
|
+
property :load_balancer_ip_address, String
|
11
|
+
property :framework_env, String
|
12
|
+
|
13
|
+
belongs_to :account
|
14
|
+
has n, :app_environments
|
15
|
+
has n, :apps, :through => :app_environments
|
16
|
+
has n, :instances
|
17
|
+
|
18
|
+
def inspect
|
19
|
+
"#<Environment name:#{name} account:#{account.name}>"
|
20
|
+
end
|
21
|
+
|
22
|
+
def instances_count
|
23
|
+
instances.size
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'dm-core'
|
2
|
+
|
3
|
+
class Instance
|
4
|
+
include DataMapper::Resource
|
5
|
+
|
6
|
+
property :id, Serial
|
7
|
+
property :name, String
|
8
|
+
property :role, String
|
9
|
+
property :status, String
|
10
|
+
property :amazon_id, String
|
11
|
+
property :public_hostname, String
|
12
|
+
|
13
|
+
belongs_to :environment
|
14
|
+
|
15
|
+
def inspect
|
16
|
+
"#<Instance environment:#{environment.name} role:#{role} name:#{name}>"
|
17
|
+
end
|
18
|
+
|
19
|
+
def bridge
|
20
|
+
%w[app_master solo].include?(role)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'dm-core'
|
2
|
+
|
3
|
+
class User
|
4
|
+
include DataMapper::Resource
|
5
|
+
|
6
|
+
property :id, Serial
|
7
|
+
property :name, String
|
8
|
+
property :email, String, :default => 'test@test.test'
|
9
|
+
property :password, String, :default => 'test'
|
10
|
+
property :api_token, String,
|
11
|
+
:default => lambda { |r, p| File.open('/dev/urandom', 'r') { |fh| fh.read(16).unpack('H*').first }}
|
12
|
+
|
13
|
+
has n, :accounts
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,325 @@
|
|
1
|
+
require 'engineyard-cloud-client/test/fake_awsm'
|
2
|
+
|
3
|
+
module Scenario
|
4
|
+
class Base
|
5
|
+
attr_accessor :git_remote
|
6
|
+
attr_reader :user
|
7
|
+
|
8
|
+
def initialize(name = "User Name", email = "test@test.test", pass = "test")
|
9
|
+
@git_remote = "user@git.host:path/to/repo.git"
|
10
|
+
@user = User.create(:name => name, :email => email, :password => pass)
|
11
|
+
@account = @user.accounts.create({"name" => "main"})
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class LinkedApp < Base
|
16
|
+
def initialize(name = 'Linked App', email = 'linked.app@test.local', pass = 'linked')
|
17
|
+
super
|
18
|
+
@app = @account.apps.create("name" => "rails232app", "repository_uri" => git_remote)
|
19
|
+
@env = @account.environments.create({
|
20
|
+
"name" => "giblets",
|
21
|
+
"ssh_username" => "turkey",
|
22
|
+
"app_server_stack_name" => "nginx_mongrel",
|
23
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
24
|
+
"framework_env" => "production"
|
25
|
+
})
|
26
|
+
|
27
|
+
_instances.each do |inst|
|
28
|
+
@env.instances.create(inst)
|
29
|
+
end
|
30
|
+
@app_env = @app.app_environments.create(:environment => @env)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def _instances
|
36
|
+
[{
|
37
|
+
"role" => "app_master",
|
38
|
+
"name" => nil,
|
39
|
+
"status" => "running",
|
40
|
+
"amazon_id" => 'i-ddbbdd92',
|
41
|
+
"public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
|
42
|
+
}, {
|
43
|
+
"name" => nil,
|
44
|
+
"role" => "db_master",
|
45
|
+
"status" => "running",
|
46
|
+
"amazon_id" => "i-d4cdddbf",
|
47
|
+
"public_hostname" => "db_master_hostname.compute-1.amazonaws.com",
|
48
|
+
}, {
|
49
|
+
"name" => nil,
|
50
|
+
"role" => "db_slave",
|
51
|
+
"status" => "running",
|
52
|
+
"amazon_id" => "i-asdfasdfaj",
|
53
|
+
"public_hostname" => "db_slave_1_hostname.compute-1.amazonaws.com",
|
54
|
+
}, {
|
55
|
+
"name" => nil,
|
56
|
+
"role" => "db_slave",
|
57
|
+
"status" => "running",
|
58
|
+
"amazon_id" => "i-asdfasdfaj",
|
59
|
+
"public_hostname" => "db_slave_2_hostname.compute-1.amazonaws.com",
|
60
|
+
}, {
|
61
|
+
"role" => "app",
|
62
|
+
"name" => nil,
|
63
|
+
"status" => "building",
|
64
|
+
"amazon_id" => "i-d2e3f1b9",
|
65
|
+
"public_hostname" => "app_hostname.compute-1.amazonaws.com",
|
66
|
+
}, {
|
67
|
+
"role" => "util",
|
68
|
+
"name" => "fluffy",
|
69
|
+
"status" => "running",
|
70
|
+
"amazon_id" => "i-80e3f1eb",
|
71
|
+
"public_hostname" => "util_fluffy_hostname.compute-1.amazonaws.com",
|
72
|
+
}, {
|
73
|
+
"role" => "util",
|
74
|
+
"name" => "rocky",
|
75
|
+
"status" => "running",
|
76
|
+
"amazon_id" => "i-80etf1eb",
|
77
|
+
"public_hostname" => "util_rocky_hostname.compute-1.amazonaws.com",
|
78
|
+
}]
|
79
|
+
end
|
80
|
+
end # LinkedApp
|
81
|
+
|
82
|
+
class MultipleAmbiguousAccounts < LinkedApp
|
83
|
+
def initialize(name = 'Multiple Ambiguous Accounts', email = 'multiple.ambiguous.accounts@test.local', pass = 'multi')
|
84
|
+
super
|
85
|
+
@account2 = @user.accounts.create("name" => "account_2")
|
86
|
+
@app2 = @account2.apps.create("name" => "rails232app", "repository_uri" => git_remote)
|
87
|
+
@env2 = @account2.environments.create({
|
88
|
+
"name" => "giblets",
|
89
|
+
"ssh_username" => "turkey",
|
90
|
+
"app_server_stack_name" => "nginx_mongrel",
|
91
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
92
|
+
"framework_env" => "production"
|
93
|
+
})
|
94
|
+
|
95
|
+
_instances.each do |inst|
|
96
|
+
@env2.instances.create(inst)
|
97
|
+
end
|
98
|
+
@app_env2 = @app2.app_environments.create(:environment => @env2)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class AppWithoutEnv < Base
|
103
|
+
def initialize(name = 'App Without Env', email = 'app.without.env@test.local', pass = 'without')
|
104
|
+
super
|
105
|
+
|
106
|
+
@app = @account.apps.create({
|
107
|
+
"name" => "rails232app",
|
108
|
+
"repository_uri" => git_remote
|
109
|
+
})
|
110
|
+
end
|
111
|
+
end # AppWithoutEnv
|
112
|
+
|
113
|
+
|
114
|
+
class UnlinkedApp < Base
|
115
|
+
def initialize(name = 'Unlinked App', email = 'unlinked.app@test.local', pass = 'unlinked')
|
116
|
+
super
|
117
|
+
|
118
|
+
@app = @account.apps.create({
|
119
|
+
"name" => "rails232app",
|
120
|
+
"repository_uri" => git_remote
|
121
|
+
})
|
122
|
+
|
123
|
+
@other = @account.environments.create({
|
124
|
+
"name" => "chickenwings",
|
125
|
+
"ssh_username" => "ham",
|
126
|
+
"app_server_stack_name" => "nginx_mongrel",
|
127
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
128
|
+
"framework_env" => "production"
|
129
|
+
})
|
130
|
+
@app_env = @app.app_environments.create(:environment => @other)
|
131
|
+
|
132
|
+
@env = @account.environments.create({
|
133
|
+
"name" => "giblets",
|
134
|
+
"ssh_username" => "turkey",
|
135
|
+
"app_server_stack_name" => "nginx_mongrel",
|
136
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
137
|
+
"framework_env" => "production"
|
138
|
+
})
|
139
|
+
|
140
|
+
@env.instances.create({
|
141
|
+
"status" => "running",
|
142
|
+
"amazon_id" => 'i-ddbbdd92',
|
143
|
+
"role" => "solo",
|
144
|
+
"public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com"
|
145
|
+
})
|
146
|
+
end
|
147
|
+
end # UnlinkedApp
|
148
|
+
|
149
|
+
class LinkedAppNotRunning < Base
|
150
|
+
def initialize(name = 'Linked App Not Running', email = 'linked.app.not.running@test.local', pass = 'linked.stopped')
|
151
|
+
super
|
152
|
+
@app = @account.apps.create({
|
153
|
+
"name" => "rails232app",
|
154
|
+
"repository_uri" => git_remote
|
155
|
+
})
|
156
|
+
|
157
|
+
@env = @account.environments.create({
|
158
|
+
"ssh_username" => "turkey",
|
159
|
+
"instances" => [],
|
160
|
+
"name" => "giblets",
|
161
|
+
"app_server_stack_name" => "nginx_mongrel",
|
162
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
163
|
+
"framework_env" => "production"
|
164
|
+
})
|
165
|
+
|
166
|
+
@app.app_environments.create(:environment => @env)
|
167
|
+
end
|
168
|
+
end # LinkedAppNotRunning
|
169
|
+
|
170
|
+
class LinkedAppRedMaster < LinkedApp
|
171
|
+
def initialize(name = 'Linked App Red Master', email = 'linked.app.red.master@test.local', pass = 'linked.red')
|
172
|
+
super
|
173
|
+
@env.instances.first.update(:status => "error")
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
class OneAppManyEnvs < Base
|
178
|
+
def initialize(name = 'One App Many Envs', email = 'one.app.many.envs@test.local', pass = '1app2cups')
|
179
|
+
super
|
180
|
+
@app = @account.apps.create({
|
181
|
+
"name" => "rails232app",
|
182
|
+
"repository_uri" => git_remote
|
183
|
+
})
|
184
|
+
|
185
|
+
@env1 = @account.environments.create({
|
186
|
+
"ssh_username" => "turkey",
|
187
|
+
"name" => "giblets",
|
188
|
+
"app_server_stack_name" => "nginx_mongrel",
|
189
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
190
|
+
"framework_env" => "production",
|
191
|
+
})
|
192
|
+
@env1.app_environments.create(:app => @app)
|
193
|
+
|
194
|
+
@env1.instances.create({
|
195
|
+
"status" => "running",
|
196
|
+
"amazon_id" => 'i-ddbbdd92',
|
197
|
+
"role" => "solo",
|
198
|
+
"public_hostname" => "app_master_hostname.compute-1.amazonaws.com"
|
199
|
+
})
|
200
|
+
@env2 = @account.environments.create({
|
201
|
+
"ssh_username" => "ham",
|
202
|
+
"instances" => [],
|
203
|
+
"name" => "bakon",
|
204
|
+
"app_server_stack_name" => "nginx_passenger",
|
205
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
206
|
+
})
|
207
|
+
@env2.app_environments.create(:app => @app)
|
208
|
+
|
209
|
+
@env3 = @account.environments.create({
|
210
|
+
"ssh_username" => "hamburger",
|
211
|
+
"instances" => [],
|
212
|
+
"name" => "beef",
|
213
|
+
"app_server_stack_name" => "nginx_passenger",
|
214
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
215
|
+
})
|
216
|
+
end
|
217
|
+
end # OneAppTwoEnvs
|
218
|
+
|
219
|
+
class TwoApps < Base
|
220
|
+
def initialize(name = 'Two Apps', email = 'two.apps@test.local', pass = '2apps')
|
221
|
+
super
|
222
|
+
@env1 = @account.environments.create({
|
223
|
+
"name" => "giblets",
|
224
|
+
"framework_env" => "staging",
|
225
|
+
"ssh_username" => "turkey",
|
226
|
+
"app_server_stack_name" => "nginx_unicorn",
|
227
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
228
|
+
})
|
229
|
+
@app1 = @account.apps.create({
|
230
|
+
"name" => "rails232app",
|
231
|
+
"repository_uri" => "git://github.com/smerritt/rails232app.git"
|
232
|
+
})
|
233
|
+
@env1.app_environments.create(:app => @app1)
|
234
|
+
@env1.instances.create({
|
235
|
+
"status" => "running",
|
236
|
+
"name" => nil,
|
237
|
+
"role" => "solo",
|
238
|
+
"public_hostname" => "ec2-174-129-7-113.compute-1.amazonaws.com",
|
239
|
+
"amazon_id" => "i-0911f063",
|
240
|
+
})
|
241
|
+
|
242
|
+
@env2 = @account.environments.create({
|
243
|
+
"framework_env" => "production",
|
244
|
+
"name" => "keycollector_production",
|
245
|
+
"ssh_username" => "deploy",
|
246
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
247
|
+
"app_server_stack_name" => "nginx_mongrel",
|
248
|
+
})
|
249
|
+
@app2 = @account.apps.create({
|
250
|
+
"name" => "keycollector",
|
251
|
+
"repository_uri" => "git@github.com:smerritt/keycollector.git",
|
252
|
+
})
|
253
|
+
@env2.app_environments.create(:app => @app2)
|
254
|
+
@env2.instances.create({
|
255
|
+
"status" => "running",
|
256
|
+
"name" => nil,
|
257
|
+
"role" => "solo",
|
258
|
+
"public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
|
259
|
+
"amazon_id" => "i-051195b9",
|
260
|
+
})
|
261
|
+
end
|
262
|
+
end # TwoApps
|
263
|
+
|
264
|
+
class TwoAppsSameGitUri < TwoApps
|
265
|
+
def initialize(name = 'Two Apps Same Git URI', email = 'two.apps.same.git.uri@test.local', pass = '2apps1repo')
|
266
|
+
super
|
267
|
+
@app1.update(:repository_uri => "git://github.com/engineyard/dup.git")
|
268
|
+
@app2.update(:repository_uri => "git://github.com/engineyard/dup.git")
|
269
|
+
end
|
270
|
+
end # TwoAppsSameGitUri
|
271
|
+
|
272
|
+
class OneAppManySimilarlyNamedEnvs < Base
|
273
|
+
def initialize(name = 'One App Similarly Named Envs', email = 'one.app.similarly.named.envs@test.local', pass = '1apptwinrepos')
|
274
|
+
super
|
275
|
+
@app = @account.apps.create({
|
276
|
+
"name" => "rails232app",
|
277
|
+
"repository_uri" => git_remote
|
278
|
+
})
|
279
|
+
|
280
|
+
@env1 = @account.environments.create({
|
281
|
+
"ssh_username" => "turkey",
|
282
|
+
"name" => "railsapp_production",
|
283
|
+
"load_balancer_ip_address" => '127.0.0.0',
|
284
|
+
"app_server_stack_name" => "nginx_mongrel",
|
285
|
+
"framework_env" => "production",
|
286
|
+
})
|
287
|
+
@env1.instances.create({
|
288
|
+
"status" => "running",
|
289
|
+
"amazon_id" => 'i-ddbbdd92',
|
290
|
+
"role" => "solo",
|
291
|
+
"public_hostname" => "app_master_hostname.compute-1.amazonaws.com"
|
292
|
+
})
|
293
|
+
|
294
|
+
@env2 = @account.environments.create({
|
295
|
+
"ssh_username" => "ham",
|
296
|
+
"name" => "railsapp_staging",
|
297
|
+
"load_balancer_ip_address" => '127.3.2.1',
|
298
|
+
"app_server_stack_name" => "nginx_passenger",
|
299
|
+
"framework_env" => "production",
|
300
|
+
})
|
301
|
+
|
302
|
+
@env2.instances.create({
|
303
|
+
"public_hostname" => '127.3.2.1',
|
304
|
+
"status" => "running",
|
305
|
+
"role" => "solo",
|
306
|
+
})
|
307
|
+
@env3 = @account.environments.create({
|
308
|
+
"ssh_username" => "ham",
|
309
|
+
"name" => "railsapp_staging_2",
|
310
|
+
"app_server_stack_name" => "nginx_passenger",
|
311
|
+
"load_balancer_ip_address" => '127.0.0.2',
|
312
|
+
"framework_env" => "production",
|
313
|
+
})
|
314
|
+
@env3.instances.create({
|
315
|
+
"status" => "running",
|
316
|
+
"role" => "solo",
|
317
|
+
"public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com",
|
318
|
+
})
|
319
|
+
|
320
|
+
@app.app_environments.create(:environment => @env1)
|
321
|
+
@app.app_environments.create(:environment => @env2)
|
322
|
+
@app.app_environments.create(:environment => @env3)
|
323
|
+
end
|
324
|
+
end # OneAppManySimilarlyNamedEnvs
|
325
|
+
end
|