engineyard 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
- begin
3
- require File.expand_path('../../../.bundle/environment', __FILE__)
4
- rescue LoadError
5
- ENV['BUNDLE_GEMFILE'] = File.expand_path('../../../Gemfile', __FILE__)
6
- require "rubygems"; require "bundler"; Bundler.setup
7
- end
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
8
5
 
9
6
  $LOAD_PATH.unshift File.expand_path("../../../lib", __FILE__)
10
- load File.expand_path('../../../bin/ey', __FILE__)
7
+ load File.expand_path('../../../bin/ey', __FILE__)
@@ -10,7 +10,7 @@ class FakeAwsm < Sinatra::Base
10
10
  # every request. It makes sense; you hardly ever want to keep
11
11
  # state in your application object (accidentally or otherwise),
12
12
  # but in this situation that's exactly what we want to do.
13
- @@scenario = Scenario::Empty # have to start somewhere
13
+ @@cloud_mock = Scenario::Base # have to start somewhere
14
14
  end
15
15
 
16
16
  before { content_type "application/json" }
@@ -23,7 +23,7 @@ class FakeAwsm < Sinatra::Base
23
23
  put "/scenario" do
24
24
  new_scenario = case params[:scenario]
25
25
  when "empty"
26
- Scenario::Empty
26
+ Scenario::Base
27
27
  when "one app, one environment, not linked"
28
28
  Scenario::UnlinkedApp
29
29
  when "two apps"
@@ -38,24 +38,26 @@ class FakeAwsm < Sinatra::Base
38
38
  Scenario::OneAppManyEnvs
39
39
  when "one app, many similarly-named environments"
40
40
  Scenario::OneAppManySimilarlyNamedEnvs
41
+ when "two apps, same git uri"
42
+ Scenario::TwoAppsSameGitUri
41
43
  else
42
44
  status(400)
43
45
  return {"ok" => "false", "message" => "wtf is the #{params[:scenario]} scenario?"}.to_json
44
46
  end
45
- @@scenario = new_scenario.new(params[:remote])
47
+ @@cloud_mock = CloudMock.new(new_scenario.new(params[:remote]))
46
48
  {"ok" => "true"}.to_json
47
49
  end
48
50
 
49
51
  get "/api/v2/apps" do
50
- {"apps" => @@scenario.apps}.to_json
52
+ {"apps" => @@cloud_mock.apps}.to_json
51
53
  end
52
54
 
53
55
  get "/api/v2/environments" do
54
- {"environments" => @@scenario.environments}.to_json
56
+ {"environments" => @@cloud_mock.environments}.to_json
55
57
  end
56
58
 
57
59
  get "/api/v2/environments/:env_id/logs" do
58
- {"logs" => @@scenario.logs(params[:env_id])}.to_json
60
+ {"logs" => @@cloud_mock.logs(params[:env_id].to_i)}.to_json
59
61
  end
60
62
 
61
63
  get "/api/v2/environments/:env_id/recipes" do
@@ -118,56 +120,106 @@ private
118
120
  params[:password] == "test"
119
121
  end
120
122
 
121
- module Scenario
122
- class Empty
123
- attr_reader :git_remote
123
+ class CloudMock
124
+ def initialize(initial_conditions)
125
+ @apps, @envs, @keys, @app_joins, @key_joins = [], [], [], [], []
126
+ @next_id = 1
124
127
 
125
- def initialize(git_remote)
126
- @git_remote = git_remote
128
+ initial_conditions.starting_apps.each {|a| add_app(a) }
129
+ initial_conditions.starting_environments.each {|e| add_environment(e) }
130
+ initial_conditions.starting_app_joins.each {|(app_id, env_id)| link_app(app_id, env_id) }
131
+ end
132
+
133
+ def add_app(app)
134
+ app["id"] ||= next_id
135
+ @apps << app
136
+ app
137
+ end
138
+
139
+ def add_environment(env)
140
+ env["id"] ||= next_id
141
+
142
+ unless env.has_key?("app_master")
143
+ master = env["instances"].find{ |i| %w[solo app_master].include?(i["role"]) }
144
+ env.merge!("app_master" => master)
127
145
  end
128
146
 
129
- def apps
130
- []
147
+ @envs << env
148
+ env
149
+ end
150
+
151
+ def link_app(app_id, env_id)
152
+ @apps.find {|a| a["id"] == app_id } or raise "No such app id:#{app_id}"
153
+ @envs.find {|e| e["id"] == env_id } or raise "No such environment id:#{env_id}"
154
+ @app_joins << [app_id, env_id]
155
+ @app_joins.uniq!
156
+ end
157
+
158
+ def apps
159
+ @apps.dup.map do |app|
160
+ app.merge("environments" => joined_envs(app))
131
161
  end
162
+ end
132
163
 
133
- def environments
134
- []
164
+ def logs(env_id)
165
+ [{
166
+ "id" => env_id,
167
+ "role" => "app_master",
168
+ "main" => "MAIN LOG OUTPUT",
169
+ "custom" => "CUSTOM LOG OUTPUT"
170
+ }]
171
+ end
172
+
173
+ def environments
174
+ @envs.dup.map do |env|
175
+ env.merge("apps" => joined_apps(env))
135
176
  end
136
- end # Empty
177
+ end
137
178
 
138
- class UnlinkedApp < Empty
139
- def apps
140
- [{
141
- "name" => "rails232app",
142
- "environments" => [],
143
- "repository_uri" => git_remote}]
179
+ private
180
+
181
+ def next_id
182
+ id = @next_id
183
+ @next_id += 1
184
+ id
185
+ end
186
+
187
+ def joined_envs(app)
188
+ related_objects(app, @envs, @app_joins)
189
+ end
190
+
191
+ def joined_apps(env)
192
+ related_objects(env, @apps, @app_joins.map {|j| j.reverse})
193
+ end
194
+
195
+ def related_objects(obj, candidates, relation)
196
+ candidate_table = candidates.inject({}) do |table, candidate|
197
+ table.merge(candidate["id"] => candidate)
144
198
  end
145
199
 
146
- def environments
147
- [{
148
- "ssh_username" => "turkey",
149
- "instances" => [{
150
- "status" => "running",
151
- "id" => 27220,
152
- "amazon_id" => 'i-ddbbdd92',
153
- "role" => "solo",
154
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
155
- "name" => "giblets",
156
- "apps" => [],
157
- "instances_count" => 1,
158
- "stack_name" => "nginx_mongrel",
159
- "id" => 200,
160
- "framework_env" => "production",
161
- "app_master" => {
162
- "status" => "running",
163
- "id" => 27220,
164
- "amazon_id" => 'i-ddbbdd92',
165
- "role" => "solo",
166
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}}]
200
+ relation.find_all do |(obj_id, candidate_id)|
201
+ obj["id"] == obj_id
202
+ end.map do |(obj_id, candidate_id)|
203
+ candidate_table[candidate_id]
204
+ end
205
+ end
206
+ end
207
+
208
+ module Scenario
209
+ class Base
210
+ attr_accessor :git_remote
211
+
212
+ def initialize(git_remote)
213
+ self.git_remote = git_remote
167
214
  end
168
- end # UnlinkedApp
169
215
 
170
- class LinkedApp < Empty
216
+ def starting_apps() [] end
217
+ def starting_environments() [] end
218
+ def starting_app_joins() [] end
219
+
220
+ end
221
+
222
+ class LinkedApp < Base
171
223
  def _instances
172
224
  [{
173
225
  "id" => 27220,
@@ -222,140 +274,103 @@ private
222
274
  end
223
275
  private :_instances
224
276
 
225
- def apps
226
- [{"name" => "rails232app",
227
- "environments" => [{"ssh_username" => "turkey",
228
- "instances" => _instances,
229
- "name" => "giblets",
230
- "apps" => [{"name" => "rails232app",
231
- "repository_uri" => git_remote}],
232
- "instances_count" => 1,
233
- "stack_name" => "nginx_mongrel",
234
- "id" => 200,
235
- "framework_env" => "production",
236
- "app_master" => _instances.first}],
277
+ def starting_apps
278
+ [{
279
+ "id" => 1001,
280
+ "name" => "rails232app",
237
281
  "repository_uri" => git_remote}]
238
282
  end
239
283
 
240
- def environments
284
+ def starting_environments
241
285
  [{
286
+ "id" => 200,
242
287
  "ssh_username" => "turkey",
243
288
  "instances" => _instances,
244
289
  "name" => "giblets",
245
- "apps" => [{
246
- "name" => "rails232app",
247
- "repository_uri" => git_remote}],
290
+ "instances_count" => 4,
291
+ "stack_name" => "nginx_mongrel",
292
+ "framework_env" => "production"}]
293
+ end
294
+
295
+ def starting_app_joins
296
+ [[1001, 200]]
297
+ end
298
+
299
+ end # LinkedApp
300
+
301
+ class UnlinkedApp < Base
302
+ def starting_apps
303
+ [{
304
+ "id" => 1001,
305
+ "name" => "rails232app",
306
+ "repository_uri" => git_remote}]
307
+ end
308
+
309
+ def starting_environments
310
+ [{
311
+ "ssh_username" => "turkey",
312
+ "instances" => [{
313
+ "status" => "running",
314
+ "id" => 27220,
315
+ "amazon_id" => 'i-ddbbdd92',
316
+ "role" => "solo",
317
+ "public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com"}],
318
+ "name" => "giblets",
248
319
  "instances_count" => 1,
249
320
  "stack_name" => "nginx_mongrel",
250
321
  "id" => 200,
251
- "framework_env" => "production",
252
- "app_master" => _instances[0]}]
322
+ "framework_env" => "production"}]
253
323
  end
324
+ end # UnlinkedApp
254
325
 
255
- def logs(env_id)
326
+ class LinkedAppNotRunning < Base
327
+ def starting_apps
256
328
  [{
257
- "id" => env_id,
258
- "role" => "app_master",
259
- "main" => "MAIN LOG OUTPUT",
260
- "custom" => "CUSTOM LOG OUTPUT"
261
- }]
262
- end
263
- end # LinkedApp
264
-
265
- class LinkedAppNotRunning < Empty
266
- def apps
267
- [{"name" => "rails232app",
268
- "environments" => [{"ssh_username" => "turkey",
269
- "instances" => [],
270
- "name" => "giblets",
271
- "apps" => [{"name" => "rails232app",
272
- "repository_uri" => git_remote}],
273
- "instances_count" => 0,
274
- "stack_name" => "nginx_mongrel",
275
- "id" => 200,
276
- "framework_env" => "production",
277
- "app_master" => {}}],
329
+ "id" => 1001,
330
+ "name" => "rails232app",
278
331
  "repository_uri" => git_remote}]
279
332
  end
280
333
 
281
- def environments
334
+ def starting_environments
282
335
  [{
283
336
  "ssh_username" => "turkey",
284
337
  "instances" => [],
285
338
  "name" => "giblets",
286
- "apps" => [{
287
- "name" => "rails232app",
288
- "repository_uri" => git_remote}],
289
339
  "instances_count" => 0,
290
340
  "stack_name" => "nginx_mongrel",
291
341
  "id" => 200,
292
- "framework_env" => "production",
293
- "app_master" => {}}]
342
+ "framework_env" => "production"}]
294
343
  end
295
344
 
296
- def logs(env_id)
297
- []
345
+ def starting_app_joins
346
+ [[1001, 200]]
298
347
  end
299
348
  end # LinkedAppNotRunning
300
349
 
301
350
  class LinkedAppRedMaster < LinkedApp
302
- def apps
303
- apps = super
304
- apps[0]["environments"][0]["instances"][0]["status"] = "error"
305
- apps[0]["environments"][0]["app_master"]["status"] = "error"
306
- apps
307
- end
308
-
309
- def environments
351
+ def starting_environments
310
352
  envs = super
311
353
  envs[0]["instances"][0]["status"] = "error"
312
- envs[0]["app_master"]["status"] = "error"
313
354
  envs
314
355
  end
315
356
  end
316
357
 
317
- class OneAppManyEnvs < Empty
318
- def apps
319
- apps = [{
358
+ class OneAppManyEnvs < Base
359
+ def starting_apps
360
+ [{
361
+ "id" => 1001,
320
362
  "name" => "rails232app",
321
- "repository_uri" => git_remote
322
- }]
323
-
324
- [{"name" => "rails232app",
325
- "environments" => [{
326
- "ssh_username" => "turkey",
327
- "instances" => [{
328
- "status" => "running",
329
- "id" => 27220,
330
- "amazon_id" => 'i-ddbbdd92',
331
- "role" => "solo",
332
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
333
- "name" => "giblets",
334
- "apps" => apps,
335
- "instances_count" => 1,
336
- "stack_name" => "nginx_mongrel",
337
- "id" => 200,
338
- "framework_env" => "production",
339
- "app_master" => {
340
- "status" => "running",
341
- "id" => 27220,
342
- "amazon_id" => 'i-ddbbdd92',
343
- "role" => "solo",
344
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}
345
- }, {
346
- "ssh_username" => "ham",
347
- "instances" => [],
348
- "name" => "bakon",
349
- "apps" => apps,
350
- "instances_count" => 0,
351
- "stack_name" => "nginx_passenger",
352
- "id" => 8371,
353
- "app_master" => nil,
354
- }],
355
363
  "repository_uri" => git_remote}]
356
364
  end
357
365
 
358
- def environments
366
+ def starting_app_joins
367
+ [
368
+ [1001, 200],
369
+ [1001, 202],
370
+ ]
371
+ end
372
+
373
+ def starting_environments
359
374
  [{
360
375
  "ssh_username" => "turkey",
361
376
  "instances" => [{
@@ -365,44 +380,29 @@ private
365
380
  "role" => "solo",
366
381
  "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
367
382
  "name" => "giblets",
368
- "apps" => [{
369
- "name" => "rails232app",
370
- "repository_uri" => git_remote}],
371
383
  "instances_count" => 1,
372
384
  "stack_name" => "nginx_mongrel",
373
385
  "id" => 200,
374
386
  "framework_env" => "production",
375
- "app_master" => {
376
- "status" => "running",
377
- "id" => 27220,
378
- "amazon_id" => 'i-ddbbdd92',
379
- "role" => "solo",
380
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}
381
387
  }, {
382
388
  "ssh_username" => "ham",
383
389
  "instances" => [],
384
390
  "name" => "bakon",
385
- "apps" => [{
386
- "name" => "rails232app",
387
- "repository_uri" => git_remote}],
388
391
  "instances_count" => 0,
389
392
  "stack_name" => "nginx_passenger",
390
- "id" => 8371,
391
- "app_master" => nil,
393
+ "id" => 202,
392
394
  }, {
393
395
  "ssh_username" => "hamburger",
394
396
  "instances" => [],
395
397
  "name" => "beef",
396
- "apps" => [],
397
398
  "instances_count" => 0,
398
399
  "stack_name" => "nginx_passenger",
399
- "id" => 8372,
400
- "app_master" => nil,
400
+ "id" => 206,
401
401
  }]
402
402
  end
403
403
  end # OneAppTwoEnvs
404
404
 
405
- class TwoApps < Empty
405
+ class TwoApps < Base
406
406
  def railsapp_master
407
407
  {
408
408
  "status" => "running",
@@ -427,149 +427,66 @@ private
427
427
  end
428
428
  private :keycollector_master
429
429
 
430
- def apps
430
+ def starting_apps
431
431
  [{
432
432
  "id" => 3202,
433
433
  "name" => "keycollector",
434
434
  "repository_uri" => "git@github.com:smerritt/keycollector.git",
435
- "instances_count" => 0,
436
- "ssh_username" => "deploy",
437
- "environments" => [{
438
- "apps" => [{
439
- "name" => "keycollector",
440
- "repository_uri" => "git@github.com:smerritt/keycollector.git",
441
- "id" => 3202}],
442
- "name" => "keycollector_production",
443
- "app_master" => keycollector_master,
444
- "instances" => [keycollector_master],
445
- "id" => 4359,
446
- "framework_env" => "production",
447
- "stack_name" => "nginx_mongrel"}],
448
435
  }, {
449
- "name" => "rails232app",
450
- "repository_uri" => "git://github.com/smerritt/rails232app.git",
451
436
  "id" => 6125,
452
- "environments" => [{
453
- "apps" => [{
454
- "name" => "rails232app",
455
- "repository_uri" => "git://github.com/smerritt/rails232app.git",
456
- "id" => 6125}],
457
- "instances_count" => 1,
458
- "ssh_username" => "turkey",
459
- "name" => "giblets",
460
- "app_master" => railsapp_master,
461
- "instances" => [railsapp_master],
462
- "framework_env" => "production",
463
- "id" => 200,
464
- "stack_name" => "nginx_unicorn"}],
465
- }]
437
+ "name" => "rails232app",
438
+ "repository_uri" => "git://github.com/smerritt/rails232app.git"}]
439
+ end
440
+
441
+ def starting_app_joins
442
+ [
443
+ [6125, 200],
444
+ [3202, 439],
445
+ ]
466
446
  end
467
447
 
468
- def environments
448
+ def starting_environments
469
449
  [{
470
450
  "id" => 200,
471
451
  "name" => "giblets",
452
+ "framework_env" => "staging",
472
453
  "ssh_username" => "turkey",
473
454
  "instances_count" => 1,
474
455
  "instances" => [railsapp_master],
475
- "app_master" => railsapp_master,
476
456
  "stack_name" => "nginx_unicorn",
477
- "apps" => [{
478
- "name" => "rails232app",
479
- "repository_uri" => "git://github.com/smerritt/rails232app.git",
480
- "id" => 6125}],
481
457
  }, {
482
- "id" => 4359,
458
+ "id" => 439,
483
459
  "framework_env" => "production",
484
460
  "name" => "keycollector_production",
485
461
  "ssh_username" => "deploy",
486
462
  "stack_name" => "nginx_mongrel",
487
463
  "instances_count" => 1,
488
464
  "instances" => [keycollector_master],
489
- "app_master" => keycollector_master,
490
- "apps" => [{
491
- "name" => "keycollector",
492
- "repository_uri" => "git@github.com:smerritt/keycollector.git",
493
- "id" => 3202}],
494
465
  }]
495
466
  end
496
467
  end # TwoApps
497
468
 
498
- class OneAppManySimilarlyNamedEnvs < Empty
499
- def apps
500
- apps = [{
501
- "name" => "rails232app",
502
- "repository_uri" => git_remote
503
- }]
469
+ class TwoAppsSameGitUri < TwoApps
470
+ def starting_apps
471
+ apps = super
472
+ apps.each do |app|
473
+ app["repository_uri"] = "git://github.com/engineyard/dup.git"
474
+ end
475
+ apps
476
+ end
477
+ end # TwoAppsSameGitUri
504
478
 
505
- [{"name" => "rails232app",
506
- "environments" => [{
507
- "ssh_username" => "turkey",
508
- "instances" => [{
509
- "status" => "running",
510
- "id" => 27220,
511
- "amazon_id" => 'i-ddbbdd92',
512
- "role" => "solo",
513
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
514
- "name" => "railsapp_production",
515
- "apps" => apps,
516
- "instances_count" => 1,
517
- "stack_name" => "nginx_mongrel",
518
- "framework_env" => "production",
519
- "id" => 200,
520
- "app_master" => {
521
- "status" => "running",
522
- "id" => 27220,
523
- "amazon_id" => 'i-ddbbdd92',
524
- "role" => "solo",
525
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
526
- },
527
- }, {
528
- "ssh_username" => "ham",
529
- "instances" => [{
530
- "public_hostname" => '127.3.2.1',
531
- "status" => "running",
532
- "id" => 63066,
533
- "role" => "solo",
534
- }],
535
- "name" => "railsapp_staging",
536
- "apps" => apps,
537
- "instances_count" => 1,
538
- "stack_name" => "nginx_passenger",
539
- "id" => 8371,
540
- "framework_env" => "production",
541
- "app_master" => {
542
- "public_hostname" => '127.3.2.1',
543
- "status" => "running",
544
- "id" => 63066,
545
- "role" => "solo",
546
- },
547
- }, {
548
- "ssh_username" => "ham",
549
- "instances" => [{
550
- "status" => "running",
551
- "id" => 59395,
552
- "role" => "solo",
553
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
554
- }],
555
- "name" => "railsapp_staging_2",
556
- "apps" => apps,
557
- "instances_count" => 1,
558
- "stack_name" => "nginx_passenger",
559
- "id" => 8371,
560
- "framework_env" => "production",
561
- "app_master" => {
562
- "public_hostname" => '127.44.55.66',
563
- "status" => "running",
564
- "id" => 59395,
565
- "role" => "solo",
566
- },
567
- }],
479
+ class OneAppManySimilarlyNamedEnvs < Base
480
+ def starting_apps
481
+ [{
482
+ "id" => 1001,
483
+ "name" => "rails232app",
568
484
  "repository_uri" => git_remote}]
569
485
  end
570
486
 
571
- def environments
487
+ def starting_environments
572
488
  [{
489
+ "id" => 200,
573
490
  "ssh_username" => "turkey",
574
491
  "instances" => [{
575
492
  "status" => "running",
@@ -578,77 +495,44 @@ private
578
495
  "role" => "solo",
579
496
  "public_hostname" => "app_master_hostname.compute-1.amazonaws.com"}],
580
497
  "name" => "railsapp_production",
581
- "apps" => [{
582
- "name" => "rails232app",
583
- "repository_uri" => git_remote}],
584
498
  "instances_count" => 1,
585
499
  "stack_name" => "nginx_mongrel",
586
- "id" => 200,
587
500
  "framework_env" => "production",
588
- "app_master" => {
589
- "public_hostname" => "app_master_hostname.compute-1.amazonaws.com",
590
- "status" => "running",
591
- "id" => 27220,
592
- "amazon_id" => 'i-ddbbdd92',
593
- "role" => "solo"},
594
501
  }, {
502
+ "id" => 202,
595
503
  "ssh_username" => "ham",
596
504
  "instances" => [{
597
505
  "public_hostname" => '127.3.2.1',
598
506
  "status" => "running",
599
507
  "id" => 63066,
600
- "amazon_id" => 'i-09fec72a',
601
508
  "role" => "solo",
602
509
  }],
603
510
  "name" => "railsapp_staging",
604
- "apps" => [{
605
- "name" => "rails232app",
606
- "repository_uri" => git_remote}],
607
511
  "instances_count" => 1,
608
512
  "stack_name" => "nginx_passenger",
609
- "id" => 8371,
610
513
  "framework_env" => "production",
611
- "app_master" => {
612
- "public_hostname" => '127.3.2.1',
613
- "status" => "running",
614
- "id" => 63066,
615
- "amazon_id" => 'i-09fec72a',
616
- "role" => "solo",
617
- },
618
514
  }, {
619
- "ssh_username" => "chicken",
515
+ "ssh_username" => "ham",
620
516
  "instances" => [{
621
- "public_hostname" => '127.44.55.66',
622
517
  "status" => "running",
623
518
  "id" => 59395,
624
- "amazon_id" => 'i-1aa1e271',
625
519
  "role" => "solo",
520
+ "public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com",
626
521
  }],
627
522
  "name" => "railsapp_staging_2",
628
- "apps" => [{
629
- "name" => "rails232app",
630
- "repository_uri" => git_remote}],
631
523
  "instances_count" => 1,
632
524
  "stack_name" => "nginx_passenger",
633
- "id" => 8371,
525
+ "id" => 204,
634
526
  "framework_env" => "production",
635
- "app_master" => {
636
- "public_hostname" => '127.44.55.66',
637
- "status" => "running",
638
- "id" => 59395,
639
- "amazon_id" => 'i-1aa1e271',
640
- "role" => "solo",
641
- },
642
527
  }]
643
528
  end
644
529
 
645
- def logs(env_id)
646
- [{
647
- "id" => env_id,
648
- "role" => "app_master",
649
- "main" => "MAIN LOG OUTPUT",
650
- "custom" => "CUSTOM LOG OUTPUT"
651
- }]
530
+ def starting_app_joins
531
+ [
532
+ [1001, 200],
533
+ [1001, 202],
534
+ [1001, 204],
535
+ ]
652
536
  end
653
537
  end # OneAppManySimilarlyNamedEnvs
654
538
  end