engineyard 1.3.17 → 1.3.18
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/README.rdoc +19 -7
- data/bin/ey +1 -0
- data/lib/engineyard/api.rb +6 -1
- data/lib/engineyard/cli.rb +2 -1
- data/lib/engineyard/cli/recipes.rb +37 -10
- data/lib/engineyard/cli/ui.rb +15 -25
- data/lib/engineyard/model/environment.rb +19 -9
- data/lib/engineyard/version.rb +1 -1
- data/spec/engineyard/api_spec.rb +7 -0
- data/spec/ey/recipes/upload_spec.rb +52 -3
- data/spec/spec_helper.rb +1 -0
- data/spec/support/fake_awsm.ru +20 -388
- data/spec/support/fixture_recipes.tgz +0 -0
- data/spec/support/helpers.rb +10 -0
- data/spec/support/scenarios.rb +361 -0
- data/spec/support/shared_behavior.rb +2 -0
- metadata +57 -53
data/spec/support/fake_awsm.ru
CHANGED
@@ -1,8 +1,21 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'sinatra/base'
|
3
3
|
require 'json'
|
4
|
+
require File.expand_path('../scenarios', __FILE__)
|
4
5
|
|
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
|
+
}
|
6
19
|
|
7
20
|
def initialize(*_)
|
8
21
|
super
|
@@ -10,7 +23,7 @@ class FakeAwsm < Sinatra::Base
|
|
10
23
|
# every request. It makes sense; you hardly ever want to keep
|
11
24
|
# state in your application object (accidentally or otherwise),
|
12
25
|
# but in this situation that's exactly what we want to do.
|
13
|
-
@@cloud_mock = Scenario::Base
|
26
|
+
@@cloud_mock = CloudMock.new(Scenario::Base.new('git://example.com'))
|
14
27
|
end
|
15
28
|
|
16
29
|
before { content_type "application/json" }
|
@@ -21,36 +34,17 @@ class FakeAwsm < Sinatra::Base
|
|
21
34
|
end
|
22
35
|
|
23
36
|
put "/scenario" do
|
24
|
-
new_scenario =
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
when "two apps"
|
30
|
-
Scenario::TwoApps
|
31
|
-
when "one app, one environment"
|
32
|
-
Scenario::LinkedApp
|
33
|
-
when "two accounts, two apps, two environments, ambiguous"
|
34
|
-
Scenario::MultipleAmbiguousAccounts
|
35
|
-
when "one app, one environment, no instances"
|
36
|
-
Scenario::LinkedAppNotRunning
|
37
|
-
when "one app, one environment, app master red"
|
38
|
-
Scenario::LinkedAppRedMaster
|
39
|
-
when "one app, many environments"
|
40
|
-
Scenario::OneAppManyEnvs
|
41
|
-
when "one app, many similarly-named environments"
|
42
|
-
Scenario::OneAppManySimilarlyNamedEnvs
|
43
|
-
when "two apps, same git uri"
|
44
|
-
Scenario::TwoAppsSameGitUri
|
45
|
-
else
|
46
|
-
status(400)
|
47
|
-
return {"ok" => "false", "message" => "wtf is the #{params[:scenario]} scenario?"}.to_json
|
48
|
-
end
|
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
|
49
42
|
@@cloud_mock = CloudMock.new(new_scenario.new(params[:remote]))
|
50
43
|
{"ok" => "true"}.to_json
|
51
44
|
end
|
52
45
|
|
53
46
|
get "/api/v2/apps" do
|
47
|
+
raise('No user agent header') unless env['HTTP_USER_AGENT'] =~ %r#^EngineYardCLI/#
|
54
48
|
{"apps" => @@cloud_mock.apps}.to_json
|
55
49
|
end
|
56
50
|
|
@@ -226,368 +220,6 @@ private
|
|
226
220
|
end
|
227
221
|
end
|
228
222
|
end
|
229
|
-
|
230
|
-
module Scenario
|
231
|
-
class Base
|
232
|
-
attr_accessor :git_remote
|
233
|
-
|
234
|
-
def initialize(git_remote)
|
235
|
-
self.git_remote = git_remote
|
236
|
-
end
|
237
|
-
|
238
|
-
def starting_accounts() [{"name" => "main"}] end
|
239
|
-
def starting_apps() [] end
|
240
|
-
def starting_environments() [] end
|
241
|
-
def starting_app_joins() [] end
|
242
|
-
|
243
|
-
end
|
244
|
-
|
245
|
-
class LinkedApp < Base
|
246
|
-
def _instances
|
247
|
-
[{
|
248
|
-
"id" => 27220,
|
249
|
-
"role" => "app_master",
|
250
|
-
"name" => nil,
|
251
|
-
"status" => "running",
|
252
|
-
"amazon_id" => 'i-ddbbdd92',
|
253
|
-
"public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
|
254
|
-
}, {
|
255
|
-
"id" => 22721,
|
256
|
-
"name" => nil,
|
257
|
-
"role" => "db_master",
|
258
|
-
"status" => "running",
|
259
|
-
"amazon_id" => "i-d4cdddbf",
|
260
|
-
"public_hostname" => "db_master_hostname.compute-1.amazonaws.com",
|
261
|
-
}, {
|
262
|
-
"id" => 22724,
|
263
|
-
"name" => nil,
|
264
|
-
"role" => "db_slave",
|
265
|
-
"status" => "running",
|
266
|
-
"amazon_id" => "i-asdfasdfaj",
|
267
|
-
"public_hostname" => "db_slave_1_hostname.compute-1.amazonaws.com",
|
268
|
-
}, {
|
269
|
-
"id" => 22725,
|
270
|
-
"name" => nil,
|
271
|
-
"role" => "db_slave",
|
272
|
-
"status" => "running",
|
273
|
-
"amazon_id" => "i-asdfasdfaj",
|
274
|
-
"public_hostname" => "db_slave_2_hostname.compute-1.amazonaws.com",
|
275
|
-
}, {
|
276
|
-
"id" => 22722,
|
277
|
-
"role" => "app",
|
278
|
-
"name" => nil,
|
279
|
-
"status" => "building",
|
280
|
-
"amazon_id" => "i-d2e3f1b9",
|
281
|
-
"public_hostname" => "app_hostname.compute-1.amazonaws.com",
|
282
|
-
}, {
|
283
|
-
"id" => 22723,
|
284
|
-
"role" => "util",
|
285
|
-
"name" => "fluffy",
|
286
|
-
"status" => "running",
|
287
|
-
"amazon_id" => "i-80e3f1eb",
|
288
|
-
"public_hostname" => "util_fluffy_hostname.compute-1.amazonaws.com",
|
289
|
-
}, {
|
290
|
-
"id" => 22727,
|
291
|
-
"role" => "util",
|
292
|
-
"name" => "rocky",
|
293
|
-
"status" => "running",
|
294
|
-
"amazon_id" => "i-80etf1eb",
|
295
|
-
"public_hostname" => "util_rocky_hostname.compute-1.amazonaws.com",
|
296
|
-
}]
|
297
|
-
end
|
298
|
-
private :_instances
|
299
|
-
|
300
|
-
def starting_apps
|
301
|
-
[{
|
302
|
-
"id" => 1001,
|
303
|
-
"name" => "rails232app",
|
304
|
-
"repository_uri" => git_remote}]
|
305
|
-
end
|
306
|
-
|
307
|
-
def starting_environments
|
308
|
-
[{
|
309
|
-
"id" => 200,
|
310
|
-
"ssh_username" => "turkey",
|
311
|
-
"instances" => _instances,
|
312
|
-
"name" => "giblets",
|
313
|
-
"instances_count" => 4,
|
314
|
-
"stack_name" => "nginx_mongrel",
|
315
|
-
"framework_env" => "production"}]
|
316
|
-
end
|
317
|
-
|
318
|
-
def starting_app_joins
|
319
|
-
[[1001, 200]]
|
320
|
-
end
|
321
|
-
|
322
|
-
end # LinkedApp
|
323
|
-
|
324
|
-
class MultipleAmbiguousAccounts < LinkedApp
|
325
|
-
def starting_accounts
|
326
|
-
super + [{"name" => "account_2", "id" => 256}]
|
327
|
-
end
|
328
|
-
|
329
|
-
def starting_apps
|
330
|
-
apps = super
|
331
|
-
new_app = apps.first.dup
|
332
|
-
new_app["id"] += 1000
|
333
|
-
new_app["account"] = starting_accounts.last
|
334
|
-
apps + [new_app]
|
335
|
-
end
|
336
|
-
|
337
|
-
def starting_environments
|
338
|
-
envs = super
|
339
|
-
new_env = envs.first.dup
|
340
|
-
new_env["id"] += 1000
|
341
|
-
new_env["account"] = starting_accounts.last
|
342
|
-
envs + [new_env]
|
343
|
-
end
|
344
|
-
|
345
|
-
def starting_app_joins
|
346
|
-
joins = super
|
347
|
-
new_join = [joins.first[0] + 1000,
|
348
|
-
joins.first[1] + 1000]
|
349
|
-
joins + [new_join]
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
class UnlinkedApp < Base
|
354
|
-
def starting_apps
|
355
|
-
[{
|
356
|
-
"id" => 1001,
|
357
|
-
"name" => "rails232app",
|
358
|
-
"repository_uri" => git_remote}]
|
359
|
-
end
|
360
|
-
|
361
|
-
def starting_environments
|
362
|
-
[{
|
363
|
-
"ssh_username" => "turkey",
|
364
|
-
"instances" => [{
|
365
|
-
"status" => "running",
|
366
|
-
"id" => 27220,
|
367
|
-
"amazon_id" => 'i-ddbbdd92',
|
368
|
-
"role" => "solo",
|
369
|
-
"public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com"}],
|
370
|
-
"name" => "giblets",
|
371
|
-
"instances_count" => 1,
|
372
|
-
"stack_name" => "nginx_mongrel",
|
373
|
-
"id" => 200,
|
374
|
-
"framework_env" => "production"}]
|
375
|
-
end
|
376
|
-
end # UnlinkedApp
|
377
|
-
|
378
|
-
class LinkedAppNotRunning < Base
|
379
|
-
def starting_apps
|
380
|
-
[{
|
381
|
-
"id" => 1001,
|
382
|
-
"name" => "rails232app",
|
383
|
-
"repository_uri" => git_remote}]
|
384
|
-
end
|
385
|
-
|
386
|
-
def starting_environments
|
387
|
-
[{
|
388
|
-
"ssh_username" => "turkey",
|
389
|
-
"instances" => [],
|
390
|
-
"name" => "giblets",
|
391
|
-
"instances_count" => 0,
|
392
|
-
"stack_name" => "nginx_mongrel",
|
393
|
-
"id" => 200,
|
394
|
-
"framework_env" => "production"}]
|
395
|
-
end
|
396
|
-
|
397
|
-
def starting_app_joins
|
398
|
-
[[1001, 200]]
|
399
|
-
end
|
400
|
-
end # LinkedAppNotRunning
|
401
|
-
|
402
|
-
class LinkedAppRedMaster < LinkedApp
|
403
|
-
def starting_environments
|
404
|
-
envs = super
|
405
|
-
envs[0]["instances"][0]["status"] = "error"
|
406
|
-
envs
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
|
-
class OneAppManyEnvs < Base
|
411
|
-
def starting_apps
|
412
|
-
[{
|
413
|
-
"id" => 1001,
|
414
|
-
"name" => "rails232app",
|
415
|
-
"repository_uri" => git_remote}]
|
416
|
-
end
|
417
|
-
|
418
|
-
def starting_app_joins
|
419
|
-
[
|
420
|
-
[1001, 200],
|
421
|
-
[1001, 202],
|
422
|
-
]
|
423
|
-
end
|
424
|
-
|
425
|
-
def starting_environments
|
426
|
-
[{
|
427
|
-
"ssh_username" => "turkey",
|
428
|
-
"instances" => [{
|
429
|
-
"status" => "running",
|
430
|
-
"id" => 27220,
|
431
|
-
"amazon_id" => 'i-ddbbdd92',
|
432
|
-
"role" => "solo",
|
433
|
-
"public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
|
434
|
-
"name" => "giblets",
|
435
|
-
"instances_count" => 1,
|
436
|
-
"stack_name" => "nginx_mongrel",
|
437
|
-
"id" => 200,
|
438
|
-
"framework_env" => "production",
|
439
|
-
}, {
|
440
|
-
"ssh_username" => "ham",
|
441
|
-
"instances" => [],
|
442
|
-
"name" => "bakon",
|
443
|
-
"instances_count" => 0,
|
444
|
-
"stack_name" => "nginx_passenger",
|
445
|
-
"id" => 202,
|
446
|
-
}, {
|
447
|
-
"ssh_username" => "hamburger",
|
448
|
-
"instances" => [],
|
449
|
-
"name" => "beef",
|
450
|
-
"instances_count" => 0,
|
451
|
-
"stack_name" => "nginx_passenger",
|
452
|
-
"id" => 206,
|
453
|
-
}]
|
454
|
-
end
|
455
|
-
end # OneAppTwoEnvs
|
456
|
-
|
457
|
-
class TwoApps < Base
|
458
|
-
def railsapp_master
|
459
|
-
{
|
460
|
-
"status" => "running",
|
461
|
-
"name" => nil,
|
462
|
-
"role" => "solo",
|
463
|
-
"public_hostname" => "ec2-174-129-7-113.compute-1.amazonaws.com",
|
464
|
-
"id" => 35707,
|
465
|
-
"amazon_id" => "i-0911f063",
|
466
|
-
}
|
467
|
-
end
|
468
|
-
private :railsapp_master
|
469
|
-
|
470
|
-
def keycollector_master
|
471
|
-
{
|
472
|
-
"status" => "running",
|
473
|
-
"name" => nil,
|
474
|
-
"role" => "solo",
|
475
|
-
"public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
|
476
|
-
"id" => 75428,
|
477
|
-
"amazon_id" => "i-051195b9",
|
478
|
-
}
|
479
|
-
end
|
480
|
-
private :keycollector_master
|
481
|
-
|
482
|
-
def starting_apps
|
483
|
-
[{
|
484
|
-
"id" => 3202,
|
485
|
-
"name" => "keycollector",
|
486
|
-
"repository_uri" => "git@github.com:smerritt/keycollector.git",
|
487
|
-
}, {
|
488
|
-
"id" => 6125,
|
489
|
-
"name" => "rails232app",
|
490
|
-
"repository_uri" => "git://github.com/smerritt/rails232app.git"}]
|
491
|
-
end
|
492
|
-
|
493
|
-
def starting_app_joins
|
494
|
-
[
|
495
|
-
[6125, 200],
|
496
|
-
[3202, 439],
|
497
|
-
]
|
498
|
-
end
|
499
|
-
|
500
|
-
def starting_environments
|
501
|
-
[{
|
502
|
-
"id" => 200,
|
503
|
-
"name" => "giblets",
|
504
|
-
"framework_env" => "staging",
|
505
|
-
"ssh_username" => "turkey",
|
506
|
-
"instances_count" => 1,
|
507
|
-
"instances" => [railsapp_master],
|
508
|
-
"stack_name" => "nginx_unicorn",
|
509
|
-
}, {
|
510
|
-
"id" => 439,
|
511
|
-
"framework_env" => "production",
|
512
|
-
"name" => "keycollector_production",
|
513
|
-
"ssh_username" => "deploy",
|
514
|
-
"stack_name" => "nginx_mongrel",
|
515
|
-
"instances_count" => 1,
|
516
|
-
"instances" => [keycollector_master],
|
517
|
-
}]
|
518
|
-
end
|
519
|
-
end # TwoApps
|
520
|
-
|
521
|
-
class TwoAppsSameGitUri < TwoApps
|
522
|
-
def starting_apps
|
523
|
-
apps = super
|
524
|
-
apps.each do |app|
|
525
|
-
app["repository_uri"] = "git://github.com/engineyard/dup.git"
|
526
|
-
end
|
527
|
-
apps
|
528
|
-
end
|
529
|
-
end # TwoAppsSameGitUri
|
530
|
-
|
531
|
-
class OneAppManySimilarlyNamedEnvs < Base
|
532
|
-
def starting_apps
|
533
|
-
[{
|
534
|
-
"id" => 1001,
|
535
|
-
"name" => "rails232app",
|
536
|
-
"repository_uri" => git_remote}]
|
537
|
-
end
|
538
|
-
|
539
|
-
def starting_environments
|
540
|
-
[{
|
541
|
-
"id" => 200,
|
542
|
-
"ssh_username" => "turkey",
|
543
|
-
"instances" => [{
|
544
|
-
"status" => "running",
|
545
|
-
"id" => 27220,
|
546
|
-
"amazon_id" => 'i-ddbbdd92',
|
547
|
-
"role" => "solo",
|
548
|
-
"public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
|
549
|
-
"name" => "railsapp_production",
|
550
|
-
"instances_count" => 1,
|
551
|
-
"stack_name" => "nginx_mongrel",
|
552
|
-
"framework_env" => "production",
|
553
|
-
}, {
|
554
|
-
"id" => 202,
|
555
|
-
"ssh_username" => "ham",
|
556
|
-
"instances" => [{
|
557
|
-
"public_hostname" => '127.3.2.1',
|
558
|
-
"status" => "running",
|
559
|
-
"id" => 63066,
|
560
|
-
"role" => "solo",
|
561
|
-
}],
|
562
|
-
"name" => "railsapp_staging",
|
563
|
-
"instances_count" => 1,
|
564
|
-
"stack_name" => "nginx_passenger",
|
565
|
-
"framework_env" => "production",
|
566
|
-
}, {
|
567
|
-
"ssh_username" => "ham",
|
568
|
-
"instances" => [{
|
569
|
-
"status" => "running",
|
570
|
-
"id" => 59395,
|
571
|
-
"role" => "solo",
|
572
|
-
"public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com",
|
573
|
-
}],
|
574
|
-
"name" => "railsapp_staging_2",
|
575
|
-
"instances_count" => 1,
|
576
|
-
"stack_name" => "nginx_passenger",
|
577
|
-
"id" => 204,
|
578
|
-
"framework_env" => "production",
|
579
|
-
}]
|
580
|
-
end
|
581
|
-
|
582
|
-
def starting_app_joins
|
583
|
-
[
|
584
|
-
[1001, 200],
|
585
|
-
[1001, 202],
|
586
|
-
[1001, 204],
|
587
|
-
]
|
588
|
-
end
|
589
|
-
end # OneAppManySimilarlyNamedEnvs
|
590
|
-
end
|
591
223
|
end
|
592
224
|
|
593
225
|
run FakeAwsm.new
|
Binary file
|
data/spec/support/helpers.rb
CHANGED
@@ -187,6 +187,16 @@ module Spec
|
|
187
187
|
end
|
188
188
|
|
189
189
|
end
|
190
|
+
|
191
|
+
module Fixtures
|
192
|
+
def fixture_recipes_tgz
|
193
|
+
File.expand_path('../fixture_recipes.tgz', __FILE__)
|
194
|
+
end
|
195
|
+
|
196
|
+
def link_recipes_tgz(git_dir)
|
197
|
+
system("ln -s #{fixture_recipes_tgz} #{git_dir.join('recipes.tgz')}")
|
198
|
+
end
|
199
|
+
end
|
190
200
|
end
|
191
201
|
end
|
192
202
|
|