prima-twig 0.13.1 → 0.13.37

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 993c9744a43a74c9f057a9372b26c7cc16b57d03
4
- data.tar.gz: cb64f1e1df97ccb62071c242b90e669a84ef5a62
2
+ SHA256:
3
+ metadata.gz: 80453e18a20c633202fb9511c8467c7a55fe041d4f95c48dcba8c94438c30fd5
4
+ data.tar.gz: 61157b2ab76835811dda1be558bfb1a33013e28e4a134cebc1d3811672ce7e27
5
5
  SHA512:
6
- metadata.gz: 6474f160cdb79c904557e18cba0de25e49b4ab878bfd35316ff55171b01c38d89a60dfcaed342a9334220bb420d048075bb3fb3b6a25dbf0d812b8424d82339b
7
- data.tar.gz: e234f4af11997da5fbe1a24239058221656c4f6b94b5eb8cffaca65c4818c1eb8b96882446f9dae1860f8c897513f3b66440e97bff11ecd2b08bca2e8c0d3f1a
6
+ metadata.gz: 748b849608be9eb2a7b8a23eb453e9e3bfce1bad2af8b167fb58001f000a8bd40f2bb0e0f1d61f847dc5919815a22d789639cd31fc9ea4bb9c766c6dffc14a69
7
+ data.tar.gz: 86882fe4d74c2ee22934c51002e0f076577647ca4b67e116e05534ed1ed74e3442987a266dc49128096c0996200e84e5c89f97a7ffa3a72cb195927735744778
@@ -0,0 +1,2153 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require_relative '../lib/prima_twig.rb'
5
+ require_relative '../lib/prima_aws_client.rb'
6
+ require 'digest'
7
+ require 'json'
8
+ require 'launchy'
9
+ require 'pp'
10
+ require 'redis'
11
+
12
+ class Build
13
+ include Command
14
+ include PrimaAwsClient
15
+
16
+ def initialize()
17
+ @prima = Prima.new
18
+ @batch = Aws::Batch::Client.new
19
+ @s3 = Aws::S3::Client.new
20
+ @s3_bucket = 'prima-artifacts'
21
+ @artifact_path = '/tmp/prima-artifact.zip'
22
+ @import_db_task = 'arn:aws:ecs:eu-west-1:001575623345:task-definition/ecs-task-db-restore2-TaskDefinitionDbRestore-XYF2QX2UJRXZ:1'
23
+ @cf_role = 'arn:aws:iam::001575623345:role/qainit-service-role-cloudformat-CloudformationRole-18KBZQIS148R9'
24
+ @ecs_cluster_name = nil
25
+ @deploy_update = false
26
+ @qainit = false
27
+ @qainit_host_folder = "/var/ci/#{ENV['DRONE_REPO']}/#{ENV['DRONE_BRANCH']}/#{ENV['DRONE_BUILD_NUMBER']}"
28
+ @qainit_folder = "/drone/src/github.com/project/primait/qainit"
29
+ @projects = {
30
+ 'prima' => {},
31
+ 'urania' => {},
32
+ 'ermes' => {},
33
+ 'bburago' => {},
34
+ 'hal9000' => {},
35
+ 'fidaty' => {},
36
+ 'peano' => {},
37
+ 'assange' => {},
38
+ 'borat' => {},
39
+ 'crash' => {},
40
+ 'activia' => {},
41
+ 'skynet' => {},
42
+ 'roger' => {},
43
+ 'rachele' => {},
44
+ 'leftorium' => {},
45
+ 'pyxis-npm' => {},
46
+ 'starsky' => {},
47
+ 'hutch' => {},
48
+ 'maia' => {},
49
+ 'legion' => {},
50
+ 'vianello' => {},
51
+ 'domus' => {}
52
+ # 'toretto' => {}
53
+ }
54
+ @base_stack_name_alb = 'ecs-alb-http-public-qa-'
55
+ @base_stack_name_alb_ws = 'ecs-alb-ws-public-qa-'
56
+ @git_branch = ENV['DRONE_BRANCH']
57
+ @cloudflare = Rubyflare.connect_with(ENV['CLOUDFLARE_EMAIL'], ENV['CLOUDFLARE_APIKEY'])
58
+ end
59
+
60
+ def execute!(args)
61
+ qainit_read_config!
62
+ abort('Non sei nella cartella di qainit') unless Dir.pwd.match 'qainit$' or Dir.pwd.match '/drone/src'
63
+ case args[0]
64
+ when 'infrastructure'
65
+ create_infrastructure_stacks! unless is_shutdown?
66
+ when 'project'
67
+ set_tags()
68
+ proj_method = "create_#{args[1]}_stack"
69
+ self.send(proj_method.to_sym) unless is_shutdown?
70
+ when 'complete'
71
+ if is_shutdown?
72
+ output 'Shutting down'.green
73
+ qainit_drone_shutdown!
74
+ else
75
+ complete_qa_setup!
76
+ end
77
+ end
78
+ end
79
+
80
+ def is_shutdown?
81
+ return ENV['DRONE_COMMIT_MESSAGE'] == 'shutdown'
82
+ end
83
+
84
+ def qainit_drone_shutdown!
85
+ output "Recupero le informazioni sui QA attivi..."
86
+ stack_list, envs = get_stacks
87
+
88
+ env_hash = "qa-" + get_deploy_id
89
+
90
+ cluster_stack_name = nil
91
+ stacks_to_delete = []
92
+ stack_list.each do |stack|
93
+ if stack.stack_name.match(/#{env_hash}$/)
94
+ if stack.stack_name.match(/ecs-cluster/)
95
+ cluster_stack_name = stack.stack_name
96
+ else
97
+ break unless stack.stack_name.match(/#{env_hash}$/)
98
+ stacks_to_delete.push(stack.stack_name)
99
+ delete_stack(stack.stack_name)
100
+ end
101
+ end
102
+ end
103
+
104
+ cluster_stack_name = "ecs-cluster-#{env_hash}"
105
+ if stack_exists?(cluster_stack_name)
106
+ aggregator_enabled = get_stack_tags(cluster_stack_name).detect do |tag|
107
+ tag.key === "hostname_pattern_priority" and tag.value === "1"
108
+ end.is_a?(Aws::CloudFormation::Types::Tag)
109
+
110
+ if aggregator_enabled
111
+ dns_to_staging(env_hash)
112
+ end
113
+ end
114
+
115
+ # Se non ha finito di cancellare le altre non si puo' cancellare il cluster
116
+ output "Attendo 10 secondi per poter eliminare il cluster ECS"
117
+
118
+ while stacks_to_delete.length > 0
119
+ sleep 13
120
+ stacks_to_delete.each do |stack_name|
121
+ stacks_to_delete = stacks_to_delete - [stack_name] unless stack_exists?(stack_name)
122
+ end
123
+ output "Stack ancora attivi: #{stacks_to_delete.length.to_s}. Attendo altri 10 secondi per eliminare il cluster ECS"
124
+ end
125
+
126
+ delete_stack(cluster_stack_name) if stack_exists?(cluster_stack_name)
127
+ delete_stack(@base_stack_name_alb + env_hash[3..8]) if stack_exists?(@base_stack_name_alb + env_hash[3..8])
128
+ delete_stack(@base_stack_name_alb_ws + env_hash[3..8]) if stack_exists?(@base_stack_name_alb_ws + env_hash[3..8])
129
+ `git checkout master && git push origin --delete ${DRONE_BRANCH}`
130
+ output "Cancello il record DNS utilizzato da Lighthouse"
131
+ delete_lighthouse_dns()
132
+ output "Finito!".green
133
+
134
+ if @qainit
135
+ qainit_write_output("QA #{ENV["DRONE_BRANCH"]} spento.", 'Indirizzi scritti su ')
136
+ end
137
+ end
138
+
139
+ def qainit_write_output(file_message, output_message)
140
+ `mkdir -p /etc/qainit-output`
141
+ qa_file_name = "/etc/qainit-output/url_qa"
142
+ File.open(qa_file_name + '.txt', 'w') { |file| file.write(file_message) }
143
+ output "#{output_message} #{qa_file_name}".green
144
+ end
145
+
146
+ def qainit_read_config!()
147
+ projects = ''
148
+
149
+ File.open('branch_names', 'r') do |file|
150
+ file.each_line do |line|
151
+ projects = JSON.parse(line)
152
+ end
153
+ end
154
+
155
+ projects.each do |key, project|
156
+ @projects[key] = project
157
+ end
158
+
159
+ get_s3_config_files
160
+ @qainit = true
161
+ end
162
+
163
+ def get_s3_config_files
164
+ # manteniamo la struttura per lanciarlo facilmente anche da locale
165
+ `mkdir -p cloudformation/stacks/task cloudformation/stacks/route53 cloudformation/stacks/asg cloudformation/stacks/elb`
166
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/task/db-rabbitmq385.yml', response_target: 'cloudformation/stacks/task/db-rabbitmq385.yml'})
167
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/task/otel-agent.yml', response_target: 'cloudformation/stacks/task/otel-agent.yml'})
168
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/route53/qa.yml', response_target: 'cloudformation/stacks/route53/qa.yml'})
169
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/asg/ecs-asg-allinone.yml', response_target: 'cloudformation/stacks/asg/ecs-asg-allinone.yml'})
170
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/ecs-cluster.yml', response_target: 'cloudformation/stacks/ecs-cluster.yml'})
171
+ @s3.get_object({bucket: "prima-deploy", key: 'cloudformation/stacks/elb/alb-public-qa.yml', response_target: 'cloudformation/stacks/elb/alb-public-qa.yml'})
172
+ end
173
+
174
+ def get_deploy_id
175
+ if @deploy_id
176
+ @deploy_id
177
+ else
178
+ @deploy_id = Digest::MD5.hexdigest(ENV['DRONE_BRANCH'])
179
+ @deploy_id
180
+ end
181
+ end
182
+
183
+ def get_ecs_cluster_name
184
+ if @ecs_cluster_name
185
+ @ecs_cluster_name
186
+ else
187
+ cluster_stack_name = "ecs-cluster-qa-#{get_deploy_id}"
188
+ resp = describe_stack_resource(cluster_stack_name, 'ECSCluster')
189
+ @ecs_cluster_name = resp.stack_resource_detail.physical_resource_id
190
+ @ecs_cluster_name
191
+ end
192
+ end
193
+
194
+ def get_asg_stack_name
195
+ "ecs-asg-allinone-qa-#{get_deploy_id}"
196
+ end
197
+
198
+ def get_stack_name(service)
199
+ "ecs-task-#{service}-qa-#{get_deploy_id}"
200
+ end
201
+
202
+ def set_tags()
203
+ @tags = [
204
+ {
205
+ key: "qainit",
206
+ value: @git_branch.gsub(/[^a-zA-Z0-9\-]/,"-")
207
+ },
208
+ {
209
+ key: "hostname_pattern_priority",
210
+ value: hostname_pattern_priority
211
+ }
212
+ ]
213
+ @projects.each do |key, value|
214
+ unless value['name'].to_s.strip.empty?
215
+ @tags << { key: key, value: value['name'] }
216
+ end
217
+ end
218
+ end
219
+
220
+ def create_infrastructure_stacks!
221
+ `git pull && git submodule init && git submodule update`
222
+ @ami_id = get_ami_id("ecs-fleet-allinone-staging")
223
+ deploy_id = get_deploy_id
224
+ stack_name_alb = 'ecs-alb-http-public-qa-' + deploy_id[0..5]
225
+ stack_name_alb_ws = 'ecs-alb-ws-public-qa-' + deploy_id[0..5]
226
+ unless @qainit
227
+ @projects.each_key do |project_key|
228
+ if @projects[project_key]['revision']
229
+ git_checkout_version(project_key, @projects[project_key]['revision'])
230
+ end
231
+ end
232
+ end
233
+ hostname_pattern_priority = hostname_pattern_priority()
234
+
235
+ set_tags()
236
+
237
+ cluster_stack_name = "ecs-cluster-qa-#{deploy_id}"
238
+
239
+ if stack_exists?(cluster_stack_name)
240
+ @tags = get_stack_tags(cluster_stack_name)
241
+ hostname_pattern_priority = @tags.detect do |tag|
242
+ tag.key == 'hostname_pattern_priority'
243
+ end.value
244
+ end
245
+
246
+ create_cluster_stack(cluster_stack_name, @tags) unless stack_exists?(cluster_stack_name)
247
+ wait_for_stack_ready(cluster_stack_name) unless stack_ready?(cluster_stack_name)
248
+
249
+ create_alb_stack(stack_name_alb, "http", deploy_id) unless stack_exists?(stack_name_alb)
250
+ create_alb_stack(stack_name_alb_ws, "websocket", deploy_id) unless stack_exists?(stack_name_alb_ws)
251
+
252
+ create_asg_stack(get_asg_stack_name, @tags) unless stack_exists?(get_asg_stack_name)
253
+
254
+ stack_name_db = "ecs-task-db-qa-#{deploy_id}"
255
+ stack_body = IO.read('cloudformation/stacks/task/db-rabbitmq385.yml')
256
+ parameters = [
257
+ {
258
+ parameter_key: "Environment",
259
+ parameter_value: "qa"
260
+ },
261
+ {
262
+ parameter_key: "ECSClusterName",
263
+ parameter_value: get_ecs_cluster_name
264
+ }
265
+ ]
266
+ create_stack(stack_name_db, stack_body, parameters, @tags, @cf_role) unless stack_exists?(stack_name_db) # creazione asincrona stack dei db (~4 min)
267
+
268
+ output "check pyxis \n".yellow
269
+
270
+ wait_for_stack_ready(stack_name_db) unless stack_ready?(stack_name_db) # dovrebbe essere istantaneo
271
+ db_task = ''
272
+ db_task = import_dbs(get_ec2_ip_address) unless stack_exists?("ecs-route53-qa-#{deploy_id}") # import asincrono dei dati
273
+
274
+ wait_for_db_import(db_task) unless stack_exists?("ecs-route53-qa-#{deploy_id}") # dovrebbe essere istantaneo
275
+
276
+ import_redis_crash(get_ec2_ip_address) if !stack_exists?("ecs-task-web-qa-#{deploy_id}")
277
+
278
+ wait_for_stack_ready(stack_name_alb) unless stack_ready?(stack_name_alb)
279
+ wait_for_stack_ready(stack_name_alb_ws) unless stack_ready?(stack_name_alb_ws)
280
+
281
+ stack_name_route53 = "ecs-route53-qa-#{deploy_id}"
282
+ stack_body = IO.read('cloudformation/stacks/route53/qa.yml')
283
+ parameters = [
284
+ {
285
+ parameter_key: "DnsRecordIdentifier",
286
+ parameter_value: get_deploy_id
287
+ },
288
+ {
289
+ parameter_key: "PrimaElbHostname",
290
+ parameter_value: get_alb_host(stack_name_alb)
291
+ },
292
+ {
293
+ parameter_key: "UraniaIp",
294
+ parameter_value: get_ec2_ip_address
295
+ },
296
+ {
297
+ parameter_key: "BburagoIp",
298
+ parameter_value: get_ec2_ip_address
299
+ },
300
+ {
301
+ parameter_key: "Hal9000Ip",
302
+ parameter_value: get_ec2_ip_address
303
+ },
304
+ {
305
+ parameter_key: "FidatyIp",
306
+ parameter_value: get_ec2_ip_address
307
+ },
308
+ {
309
+ parameter_key: "PeanoIp",
310
+ parameter_value: get_ec2_ip_address
311
+ },
312
+ {
313
+ parameter_key: "ErmesIp",
314
+ parameter_value: get_ec2_ip_address
315
+ },
316
+ {
317
+ parameter_key: "ActiviaIp",
318
+ parameter_value: get_ec2_ip_address
319
+ },
320
+ {
321
+ parameter_key: "SkynetIp",
322
+ parameter_value: get_ec2_ip_address
323
+ },
324
+ {
325
+ parameter_key: "RogerIp",
326
+ parameter_value: get_ec2_ip_address
327
+ },
328
+ {
329
+ parameter_key: "LeftoriumIp",
330
+ parameter_value: get_ec2_ip_address
331
+ },
332
+ {
333
+ parameter_key: "RacheleIp",
334
+ parameter_value: get_ec2_ip_address
335
+ },
336
+ {
337
+ parameter_key: "RedisIp",
338
+ parameter_value: get_ec2_ip_address
339
+ },
340
+ {
341
+ parameter_key: "LegionIp",
342
+ parameter_value: get_ec2_ip_address
343
+ },
344
+ {
345
+ parameter_key: "AssangeElbHostname",
346
+ parameter_value: get_alb_host(stack_name_alb)
347
+ },
348
+ {
349
+ parameter_key: "BoratElbHostname",
350
+ parameter_value: get_alb_host(stack_name_alb_ws)
351
+ },
352
+ {
353
+ parameter_key: 'CrashElbHostname',
354
+ parameter_value: get_alb_host(stack_name_alb_ws)
355
+ },
356
+ {
357
+ parameter_key: 'StarskyElbHostname',
358
+ parameter_value: get_alb_host(stack_name_alb)
359
+ },
360
+ {
361
+ parameter_key: 'HutchElbHostname',
362
+ parameter_value: get_alb_host(stack_name_alb)
363
+ },
364
+ {
365
+ parameter_key: 'MaiaElbHostname',
366
+ parameter_value: get_alb_host(stack_name_alb)
367
+ },
368
+ {
369
+ parameter_key: 'VianelloElbHostname',
370
+ parameter_value: get_alb_host(stack_name_alb)
371
+ },
372
+ {
373
+ parameter_key: 'DomusElbHostname',
374
+ parameter_value: get_alb_host(stack_name_alb)
375
+ }
376
+ ]
377
+
378
+ create_stack(stack_name_route53, stack_body, parameters, @tags, @cf_role) unless stack_exists?(stack_name_route53)
379
+ wait_for_stack_ready(stack_name_route53) unless stack_ready?(stack_name_route53)
380
+
381
+ stack_name_otel_agent = "ecs-task-otel-agent-qa-#{deploy_id}"
382
+ stack_body = IO.read('cloudformation/stacks/task/otel-agent.yml')
383
+ parameters = [
384
+ {
385
+ parameter_key: "Environment",
386
+ parameter_value: "qa"
387
+ },
388
+ {
389
+ parameter_key: "ClusterId",
390
+ parameter_value: get_ecs_cluster_name
391
+ },
392
+ {
393
+ parameter_key: "ConfigVersion",
394
+ parameter_value: "3.7.0"
395
+ }
396
+ ]
397
+ create_stack(stack_name_otel_agent, stack_body, parameters, @tags, @cf_role) unless stack_exists?(stack_name_otel_agent)
398
+ end
399
+
400
+ def create_skynet_stack()
401
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/skynet/#{@projects["skynet"]['revision']}-qa.tar.gz")
402
+ stack_name_skynet = get_stack_name("skynet")
403
+ git_checkout_version('skynet', @projects["skynet"]['revision'])
404
+ stack_body = File.read('projects/skynet/deploy/task.yml')
405
+ parameters = [
406
+ {
407
+ parameter_key: "Environment",
408
+ parameter_value: "qa"
409
+ },
410
+ {
411
+ parameter_key: "ReleaseVersion",
412
+ parameter_value: @projects["skynet"]['revision']
413
+ },
414
+ {
415
+ parameter_key: "TaskDesiredCount",
416
+ parameter_value: "1"
417
+ },
418
+ {
419
+ parameter_key: "ECSClusterName",
420
+ parameter_value: get_ecs_cluster_name
421
+ },
422
+ {
423
+ parameter_key: "HostnamePattern",
424
+ parameter_value: "skynet-#{get_deploy_id}.qa.colaster.com"
425
+ },
426
+ {
427
+ parameter_key: "HostnamePatternPriority",
428
+ parameter_value: hostname_pattern_priority
429
+ }
430
+ ]
431
+ if stack_exists?(stack_name_skynet)
432
+ cur_version = get_currently_deployed_version(stack_name_skynet)
433
+ update_stack(stack_name_skynet, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["skynet"]['revision'])
434
+ else
435
+ create_stack(stack_name_skynet, stack_body, parameters, @tags, @cf_role)
436
+ end
437
+ end
438
+
439
+ def create_legion_stack()
440
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/legion/#{@projects["legion"]['revision']}-qa.tar.gz")
441
+ stack_name_legion = get_stack_name("legion")
442
+ git_checkout_version('legion', @projects["legion"]['revision'])
443
+ stack_body = File.read('projects/legion/deploy/task.yml')
444
+ parameters = [
445
+ {
446
+ parameter_key: "Environment",
447
+ parameter_value: "qa"
448
+ },
449
+ {
450
+ parameter_key: "ReleaseVersion",
451
+ parameter_value: @projects["legion"]['revision']
452
+ },
453
+ {
454
+ parameter_key: "TaskDesiredCount",
455
+ parameter_value: "1"
456
+ },
457
+ {
458
+ parameter_key: "ECSClusterName",
459
+ parameter_value: get_ecs_cluster_name
460
+ },
461
+ {
462
+ parameter_key: "HostnamePattern",
463
+ parameter_value: "legion-#{get_deploy_id}.qa.colaster.com"
464
+ },
465
+ {
466
+ parameter_key: "HostnamePatternPriority",
467
+ parameter_value: hostname_pattern_priority
468
+ }
469
+ ]
470
+ if stack_exists?(stack_name_legion)
471
+ cur_version = get_currently_deployed_version(stack_name_legion)
472
+ update_stack(stack_name_legion, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["legion"]['revision'])
473
+ else
474
+ create_stack(stack_name_legion, stack_body, parameters, @tags, @cf_role)
475
+ end
476
+ end
477
+
478
+ def create_urania_stack()
479
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/urania/#{@projects["urania"]['revision']}-qa.tar.gz")
480
+ stack_name_urania = get_stack_name("urania")
481
+ git_checkout_version('urania', @projects["urania"]['revision'])
482
+ stack_body = File.read('projects/urania/deploy/task.yml')
483
+ parameters = [
484
+ {
485
+ parameter_key: "Environment",
486
+ parameter_value: "qa"
487
+ },
488
+ {
489
+ parameter_key: "ReleaseVersion",
490
+ parameter_value: @projects["urania"]['revision']
491
+ },
492
+ {
493
+ parameter_key: "TaskDesiredCount",
494
+ parameter_value: "1"
495
+ },
496
+ {
497
+ parameter_key: "ECSClusterName",
498
+ parameter_value: get_ecs_cluster_name
499
+ },
500
+ {
501
+ parameter_key: "HostnamePattern",
502
+ parameter_value: "urania-#{get_deploy_id}.qa.colaster.com"
503
+ },
504
+ {
505
+ parameter_key: "HostnamePatternPriority",
506
+ parameter_value: hostname_pattern_priority
507
+ }
508
+ ]
509
+ if stack_exists?(stack_name_urania)
510
+ cur_version = get_currently_deployed_version(stack_name_urania)
511
+ update_stack(stack_name_urania, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["urania"]['revision'])
512
+ else
513
+ create_stack(stack_name_urania, stack_body, parameters, @tags, @cf_role)
514
+ end
515
+ end
516
+
517
+ def create_ermes_stack()
518
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/ermes/#{@projects["ermes"]['revision']}-qa.tar.gz")
519
+ stack_name_ermes = get_stack_name("ermes")
520
+ git_checkout_version('ermes', @projects["ermes"]['revision'])
521
+ stack_body = File.read('projects/ermes/deploy/task.yml')
522
+ parameters = [
523
+ {
524
+ parameter_key: "Environment",
525
+ parameter_value: "qa"
526
+ },
527
+ {
528
+ parameter_key: "ReleaseVersion",
529
+ parameter_value: "#{@projects['ermes']['revision']}"
530
+ },
531
+ {
532
+ parameter_key: "TaskDesiredCount",
533
+ parameter_value: "1"
534
+ },
535
+ {
536
+ parameter_key: "ECSClusterName",
537
+ parameter_value: get_ecs_cluster_name
538
+ },
539
+ {
540
+ parameter_key: "HostnamePattern",
541
+ parameter_value: "ermes-#{get_deploy_id}.qa.colaster.com"
542
+ },
543
+ {
544
+ parameter_key: "HostnamePatternPriority",
545
+ parameter_value: hostname_pattern_priority
546
+ },
547
+ {
548
+ parameter_key: "WebHost",
549
+ parameter_value: get_route53_hostname('ecs-task-web-qa-notneeded')
550
+ },
551
+ {
552
+ parameter_key: "PeanoHost",
553
+ parameter_value: get_route53_hostname('ecs-task-peano-qa-notneeded')
554
+ }
555
+ ]
556
+ if stack_exists?(stack_name_ermes)
557
+ cur_version = get_currently_deployed_version(stack_name_ermes)
558
+ update_stack(stack_name_ermes, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["ermes"]['revision'])
559
+ else
560
+ create_stack(stack_name_ermes, stack_body, parameters, @tags, @cf_role)
561
+ end
562
+
563
+ stack_name_ermes = get_stack_name("worker-ermes")
564
+ stack_body = File.read('projects/ermes/deploy/task-worker.yml')
565
+ parameters = [
566
+ {
567
+ parameter_key: "Environment",
568
+ parameter_value: "qa"
569
+ },
570
+ {
571
+ parameter_key: "ReleaseVersion",
572
+ parameter_value: "#{@projects['ermes']['revision']}"
573
+ },
574
+ {
575
+ parameter_key: "TaskDesiredCount",
576
+ parameter_value: "1"
577
+ },
578
+ {
579
+ parameter_key: "ECSClusterName",
580
+ parameter_value: get_ecs_cluster_name
581
+ },
582
+ {
583
+ parameter_key: "WebHost",
584
+ parameter_value: get_route53_hostname('ecs-task-web-qa-notneeded')
585
+ },
586
+ {
587
+ parameter_key: "PeanoHost",
588
+ parameter_value: get_route53_hostname('ecs-task-peano-qa-notneeded')
589
+ }
590
+ ]
591
+ if stack_exists?(stack_name_ermes)
592
+ cur_version = get_currently_deployed_version(stack_name_ermes)
593
+ update_stack(stack_name_ermes, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["ermes"]['revision'])
594
+ else
595
+ create_stack(stack_name_ermes, stack_body, parameters, @tags, @cf_role)
596
+ end
597
+ end
598
+
599
+ def create_bburago_stack()
600
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/bburago/#{@projects["bburago"]['revision']}-qa.tar.gz")
601
+
602
+ stack_name_bburago = get_stack_name("bburago")
603
+ git_checkout_version('bburago', @projects["bburago"]['revision'])
604
+ stack_body = File.read('projects/bburago/deploy/task.yml')
605
+ parameters = [
606
+ {
607
+ parameter_key: "Environment",
608
+ parameter_value: "qa"
609
+ },
610
+ {
611
+ parameter_key: "ReleaseVersion",
612
+ parameter_value: @projects["bburago"]['revision']
613
+ },
614
+ {
615
+ parameter_key: "ECSClusterName",
616
+ parameter_value: get_ecs_cluster_name
617
+ },
618
+ {
619
+ parameter_key: "TaskDesiredCount",
620
+ parameter_value: "1"
621
+ },
622
+ {
623
+ parameter_key: "HostnamePattern",
624
+ parameter_value: "bburago-#{get_deploy_id}.qa.colaster.com"
625
+ },
626
+ {
627
+ parameter_key: "HostnamePatternPriority",
628
+ parameter_value: hostname_pattern_priority
629
+ }
630
+ ]
631
+ if stack_exists?(stack_name_bburago)
632
+ cur_version = get_currently_deployed_version(stack_name_bburago)
633
+ update_stack(stack_name_bburago, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["bburago"]['revision'])
634
+ else
635
+ create_stack(stack_name_bburago, stack_body, parameters, @tags, @cf_role)
636
+ end
637
+ end
638
+
639
+ def create_hal9000_stack()
640
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/hal9000/#{@projects["hal9000"]['revision']}-qa.tar.gz")
641
+
642
+ stack_name_hal9000 = get_stack_name("hal9000")
643
+ git_checkout_version('hal9000', @projects["hal9000"]['revision'])
644
+ stack_body = File.read('projects/hal9000/deploy/task.yml')
645
+ parameters = [
646
+ {
647
+ parameter_key: "Environment",
648
+ parameter_value: "qa"
649
+ },
650
+ {
651
+ parameter_key: "ReleaseVersion",
652
+ parameter_value: @projects["hal9000"]['revision']
653
+ },
654
+ {
655
+ parameter_key: "ECSClusterName",
656
+ parameter_value: get_ecs_cluster_name
657
+ },
658
+ {
659
+ parameter_key: "TaskDesiredCount",
660
+ parameter_value: "1"
661
+ },
662
+ {
663
+ parameter_key: "HostnamePattern",
664
+ parameter_value: "hal9000-#{get_deploy_id}.qa.colaster.com"
665
+ },
666
+ {
667
+ parameter_key: "HostnamePatternPriority",
668
+ parameter_value: hostname_pattern_priority
669
+ }
670
+ ]
671
+ if stack_exists?(stack_name_hal9000)
672
+ cur_version = get_currently_deployed_version(stack_name_hal9000)
673
+ update_stack(stack_name_hal9000, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["hal9000"]['revision'])
674
+ else
675
+ create_stack(stack_name_hal9000, stack_body, parameters, @tags, @cf_role)
676
+ end
677
+ end
678
+
679
+ def create_fidaty_stack()
680
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/fidaty/#{@projects["fidaty"]['revision']}-qa.tar.gz")
681
+
682
+ stack_name_fidaty = get_stack_name("fidaty")
683
+ git_checkout_version('fidaty', @projects["fidaty"]['revision'])
684
+ stack_body = File.read('projects/fidaty/deploy/task.yml')
685
+ parameters = [
686
+ {
687
+ parameter_key: "Environment",
688
+ parameter_value: "qa"
689
+ },
690
+ {
691
+ parameter_key: "ReleaseVersion",
692
+ parameter_value: "#{@projects["fidaty"]['revision']}"
693
+ },
694
+ {
695
+ parameter_key: "ECSClusterName",
696
+ parameter_value: get_ecs_cluster_name
697
+ },
698
+ {
699
+ parameter_key: "TaskDesiredCount",
700
+ parameter_value: "1"
701
+ },
702
+ {
703
+ parameter_key: "HostnamePattern",
704
+ parameter_value: "fidaty-#{get_deploy_id}.qa.colaster.com"
705
+ },
706
+ {
707
+ parameter_key: "HostnamePatternPriority",
708
+ parameter_value: hostname_pattern_priority
709
+ },
710
+ {
711
+ parameter_key: "PeanoHost",
712
+ parameter_value: get_route53_hostname("ecs-task-peano-qa-notneeded")
713
+ }
714
+ ]
715
+ if stack_exists?(stack_name_fidaty)
716
+ cur_version = get_currently_deployed_version(stack_name_fidaty)
717
+ update_stack(stack_name_fidaty, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["fidaty"]['revision'])
718
+ else
719
+ create_stack(stack_name_fidaty, stack_body, parameters, @tags, @cf_role)
720
+ end
721
+ end
722
+
723
+ def create_peano_stack()
724
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/peano/#{@projects["peano"]['revision']}-qa.tar.gz")
725
+
726
+ stack_name_peano = get_stack_name("peano")
727
+ git_checkout_version('peano', @projects["peano"]['revision'])
728
+ stack_body = File.read('projects/peano/deploy/task.yml')
729
+ parameters = [
730
+ {
731
+ parameter_key: "Environment",
732
+ parameter_value: "qa"
733
+ },
734
+ {
735
+ parameter_key: "ReleaseVersion",
736
+ parameter_value: "#{@projects['peano']['revision']}"
737
+ },
738
+ {
739
+ parameter_key: "ECSClusterName",
740
+ parameter_value: get_ecs_cluster_name
741
+ },
742
+ {
743
+ parameter_key: "TaskDesiredCount",
744
+ parameter_value: "1"
745
+ },
746
+ {
747
+ parameter_key: "HostnamePattern",
748
+ parameter_value: "peano-#{get_deploy_id}.qa.colaster.com"
749
+ },
750
+ {
751
+ parameter_key: "HostnamePatternPriority",
752
+ parameter_value: hostname_pattern_priority
753
+ },
754
+ {
755
+ parameter_key: "WebHost",
756
+ parameter_value: "www-#{get_deploy_id}.qa.colaster.com"
757
+ }
758
+ ]
759
+ if stack_exists?(stack_name_peano)
760
+ cur_version = get_currently_deployed_version(stack_name_peano)
761
+ update_stack(stack_name_peano, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["peano"]['revision'])
762
+ else
763
+ create_stack(stack_name_peano, stack_body, parameters, @tags, @cf_role)
764
+ end
765
+ end
766
+
767
+ def create_assange_stack()
768
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/assange/#{@projects["assange"]['revision']}-qa.tar.gz")
769
+
770
+ stack_name_assange = get_stack_name("assange")
771
+ git_checkout_version('assange', @projects["assange"]['revision'])
772
+ stack_body = IO.read('projects/assange/deploy/task.yml')
773
+ parameters = [
774
+ {
775
+ parameter_key: "Environment",
776
+ parameter_value: "qa"
777
+ },
778
+ {
779
+ parameter_key: "ReleaseVersion",
780
+ parameter_value: "#{@projects["assange"]['revision']}"
781
+ },
782
+ {
783
+ parameter_key: "ECSClusterName",
784
+ parameter_value: get_ecs_cluster_name
785
+ },
786
+ {
787
+ parameter_key: "TaskDesiredCount",
788
+ parameter_value: "1"
789
+ },
790
+ {
791
+ parameter_key: "ALBShortName",
792
+ parameter_value: "assange-qa-#{get_deploy_id}"[0..27]
793
+ },
794
+ {
795
+ parameter_key: "HostnamePattern",
796
+ parameter_value: "assange-#{get_deploy_id}.qa.colaster.com"
797
+ },
798
+ {
799
+ parameter_key: "HostnamePatternPriority",
800
+ parameter_value: (hostname_pattern_priority.to_i + 20).to_s
801
+ },
802
+ {
803
+ parameter_key: "EnvHash",
804
+ parameter_value: get_deploy_id
805
+ },
806
+ {
807
+ parameter_key: "WebHost",
808
+ parameter_value: "www-#{get_deploy_id}.qa.colaster.com"
809
+ },
810
+ {
811
+ parameter_key: "AssangeHost",
812
+ parameter_value: "assange-#{get_deploy_id}.qa.colaster.com"
813
+ }
814
+ ]
815
+ if stack_exists?(stack_name_assange)
816
+ cur_version = get_currently_deployed_version(stack_name_assange)
817
+ update_stack(stack_name_assange, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["assange"]['revision'])
818
+ else
819
+ create_stack(stack_name_assange, stack_body, parameters, @tags, @cf_role)
820
+ end
821
+
822
+ stack_name_assange_worker = get_stack_name("assange-worker")
823
+ git_checkout_version('assange', @projects["assange"]['revision'])
824
+ stack_body = IO.read('projects/assange/deploy/task-worker.yml')
825
+ parameters = [
826
+ {
827
+ parameter_key: "Environment",
828
+ parameter_value: "qa"
829
+ },
830
+ {
831
+ parameter_key: "ReleaseVersion",
832
+ parameter_value: "#{@projects["assange"]['revision']}"
833
+ },
834
+ {
835
+ parameter_key: "ECSClusterName",
836
+ parameter_value: get_ecs_cluster_name
837
+ },
838
+ {
839
+ parameter_key: "TaskDesiredCount",
840
+ parameter_value: "1"
841
+ },
842
+ {
843
+ parameter_key: "WebHost",
844
+ parameter_value: "www-#{get_deploy_id}.qa.colaster.com"
845
+ },
846
+ {
847
+ parameter_key: "AssangeHost",
848
+ parameter_value: "assange-#{get_deploy_id}.qa.colaster.com"
849
+ }
850
+ ]
851
+ if stack_exists?(stack_name_assange_worker)
852
+ cur_version = get_currently_deployed_version(stack_name_assange_worker)
853
+ update_stack(stack_name_assange_worker, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["assange"]['revision'])
854
+ else
855
+ create_stack(stack_name_assange_worker, stack_body, parameters, @tags, @cf_role)
856
+ end
857
+ end
858
+
859
+ def create_leftorium_stack()
860
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/leftorium/#{@projects["leftorium"]['revision']}-qa.tar.gz")
861
+
862
+ stack_name_leftorium = get_stack_name("leftorium")
863
+ git_checkout_version('leftorium', @projects["leftorium"]['revision'])
864
+ stack_body = File.read('projects/leftorium/deploy/task.yml')
865
+ parameters = [
866
+ {
867
+ parameter_key: "Environment",
868
+ parameter_value: "qa"
869
+ },
870
+ {
871
+ parameter_key: "ReleaseVersion",
872
+ parameter_value: "#{@projects["leftorium"]['revision']}"
873
+ },
874
+ {
875
+ parameter_key: "ECSClusterName",
876
+ parameter_value: get_ecs_cluster_name
877
+ },
878
+ {
879
+ parameter_key: "TaskDesiredCount",
880
+ parameter_value: "1"
881
+ },
882
+ {
883
+ parameter_key: "HostnamePattern",
884
+ parameter_value: "leftorium-#{get_deploy_id}.qa.colaster.com"
885
+ },
886
+ {
887
+ parameter_key: "HostnamePatternPriority",
888
+ parameter_value: hostname_pattern_priority
889
+ }
890
+ ]
891
+ if stack_exists?(stack_name_leftorium)
892
+ cur_version = get_currently_deployed_version(stack_name_leftorium)
893
+ update_stack(stack_name_leftorium, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["leftorium"]['revision'])
894
+ else
895
+ create_stack(stack_name_leftorium, stack_body, parameters, @tags, @cf_role)
896
+ end
897
+ end
898
+
899
+ def create_rachele_stack()
900
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/rachele/#{@projects["rachele"]['revision']}-qa.tar.gz")
901
+
902
+ stack_name_rachele = get_stack_name("rachele")
903
+ git_checkout_version('rachele', @projects["rachele"]['revision'])
904
+ stack_body = File.read('projects/rachele/deploy/task.yml')
905
+ parameters = [
906
+ {
907
+ parameter_key: "Environment",
908
+ parameter_value: "qa"
909
+ },
910
+ {
911
+ parameter_key: "ReleaseVersion",
912
+ parameter_value: "#{@projects["rachele"]['revision']}"
913
+ },
914
+ {
915
+ parameter_key: "ECSClusterName",
916
+ parameter_value: get_ecs_cluster_name
917
+ },
918
+ {
919
+ parameter_key: "TaskDesiredCount",
920
+ parameter_value: "1"
921
+ },
922
+ {
923
+ parameter_key: "EnvHash",
924
+ parameter_value: get_deploy_id
925
+ },
926
+ {
927
+ parameter_key: "WebHost",
928
+ parameter_value: "www-#{get_deploy_id}.qa.colaster.com"
929
+ },
930
+ {
931
+ parameter_key: "HostnamePattern",
932
+ parameter_value: "rachele-#{get_deploy_id}.qa.colaster.com"
933
+ },
934
+ {
935
+ parameter_key: "HostnamePatternPriority",
936
+ parameter_value: hostname_pattern_priority
937
+ }
938
+ ]
939
+ if stack_exists?(stack_name_rachele)
940
+ cur_version = get_currently_deployed_version(stack_name_rachele)
941
+ unless cur_version.include?(@projects["rachele"]['revision'])
942
+ delete_stack(stack_name_rachele)
943
+ wait_for_stack_removal(stack_name_rachele)
944
+ create_stack(stack_name_rachele, stack_body, parameters, @tags, @cf_role)
945
+ end
946
+ else
947
+ create_stack(stack_name_rachele, stack_body, parameters, @tags, @cf_role)
948
+ end
949
+ end
950
+
951
+ def create_borat_stack()
952
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/borat/#{@projects["borat"]['revision']}-qa.tar.gz")
953
+
954
+ stack_name_borat = get_stack_name("borat")
955
+ git_checkout_version('borat', @projects["borat"]['revision'])
956
+ stack_body = IO.read('projects/borat/deploy/task.yml')
957
+ parameters = [
958
+ {
959
+ parameter_key: "Environment",
960
+ parameter_value: "qa"
961
+ },
962
+ {
963
+ parameter_key: "ReleaseVersion",
964
+ parameter_value: "#{@projects["borat"]['revision']}"
965
+ },
966
+ {
967
+ parameter_key: "ECSClusterName",
968
+ parameter_value: get_ecs_cluster_name
969
+ },
970
+ {
971
+ parameter_key: "TaskDesiredCount",
972
+ parameter_value: "1"
973
+ },
974
+ {
975
+ parameter_key: "ALBShortName",
976
+ parameter_value: "borat-qa-#{get_deploy_id}"[0..27]
977
+ },
978
+ {
979
+ parameter_key: "HostnamePattern",
980
+ parameter_value: "backoffice-#{get_deploy_id}.qa.colaster.com"
981
+ },
982
+ {
983
+ parameter_key: "HostnamePatternPriority",
984
+ parameter_value: (hostname_pattern_priority.to_i + 30).to_s
985
+ },
986
+ {
987
+ parameter_key: "EnvHash",
988
+ parameter_value: get_deploy_id
989
+ },
990
+ {
991
+ parameter_key: "WsEndpoint",
992
+ parameter_value: "wss://backoffice-#{get_deploy_id}.qa.colaster.com/socket/websocket?vsn=1.0.0"
993
+ },
994
+ {
995
+ parameter_key: "GraphqlEndpoint",
996
+ parameter_value: "https://backoffice-#{get_deploy_id}.qa.colaster.com/graphql"
997
+ },
998
+ {
999
+ parameter_key: "GraphqlInsuranceEndpoint",
1000
+ parameter_value: "https://backoffice-#{get_deploy_id}.qa.colaster.com/graphql/insurance"
1001
+ },
1002
+ {
1003
+ parameter_key: "AuthEndpoint",
1004
+ parameter_value: "https://backoffice-#{get_deploy_id}.qa.colaster.com/auth"
1005
+ },
1006
+ {
1007
+ parameter_key: "FrontendEndpoint",
1008
+ parameter_value: "https://www-#{get_deploy_id}.qa.colaster.com/"
1009
+ }
1010
+ ]
1011
+ if stack_exists?(stack_name_borat)
1012
+ cur_version = get_currently_deployed_version(stack_name_borat)
1013
+ update_stack(stack_name_borat, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["borat"]['revision'])
1014
+ else
1015
+ create_stack(stack_name_borat, stack_body, parameters, @tags, @cf_role)
1016
+ end
1017
+ end
1018
+
1019
+ def create_crash_stack()
1020
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/crash/#{@projects['crash']['revision']}-qa.tar.gz")
1021
+
1022
+ stack_name_crash = get_stack_name("crash")
1023
+ git_checkout_version('crash', @projects['crash']['revision'])
1024
+ stack_body = IO.read('projects/crash/deploy/task.yml')
1025
+ parameters = [
1026
+ {
1027
+ parameter_key: 'Environment',
1028
+ parameter_value: 'qa'
1029
+ },
1030
+ {
1031
+ parameter_key: 'ReleaseVersion',
1032
+ parameter_value: "#{@projects['crash']['revision']}"
1033
+ },
1034
+ {
1035
+ parameter_key: 'TaskDesiredCount',
1036
+ parameter_value: '1'
1037
+ },
1038
+ {
1039
+ parameter_key: 'ECSClusterName',
1040
+ parameter_value: get_ecs_cluster_name
1041
+ },
1042
+ {
1043
+ parameter_key: 'ALBShortName',
1044
+ parameter_value: "crash-qa-#{get_deploy_id}"[0..27]
1045
+ },
1046
+ {
1047
+ parameter_key: 'HostnamePattern',
1048
+ parameter_value: "crash-#{get_deploy_id}.qa.colaster.com"
1049
+ },
1050
+ {
1051
+ parameter_key: 'HostnamePatternPriority',
1052
+ parameter_value: (hostname_pattern_priority.to_i + 10).to_s
1053
+ },
1054
+ {
1055
+ parameter_key: "EnvHash",
1056
+ parameter_value: get_deploy_id
1057
+ },
1058
+ {
1059
+ parameter_key: "WsEndpoint",
1060
+ parameter_value: "wss://crash-#{get_deploy_id}.qa.colaster.com/socket/websocket?vsn=1.0.0"
1061
+ },
1062
+ {
1063
+ parameter_key: "GraphqlEndpoint",
1064
+ parameter_value: "https://crash-#{get_deploy_id}.qa.colaster.com/graphql"
1065
+ },
1066
+ {
1067
+ parameter_key: "AuthDomain",
1068
+ parameter_value: "https://www-#{get_deploy_id}.qa.colaster.com/"
1069
+ },
1070
+ ]
1071
+ if stack_exists?(stack_name_crash)
1072
+ cur_version = get_currently_deployed_version(stack_name_crash)
1073
+ update_stack(stack_name_crash, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["crash"]['revision'])
1074
+ else
1075
+ create_stack(stack_name_crash, stack_body, parameters, @tags, @cf_role)
1076
+ end
1077
+ end
1078
+
1079
+ def create_starsky_stack()
1080
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/starsky/#{@projects["starsky"]['revision']}-qa.tar.gz")
1081
+
1082
+ git_checkout_version('starsky', @projects["starsky"]['revision'])
1083
+ stack_name_starsky = get_stack_name("starsky")
1084
+ stack_body = IO.read('projects/starsky/deploy/task.yml')
1085
+ parameters = [
1086
+ {
1087
+ parameter_key: "Environment",
1088
+ parameter_value: "qa"
1089
+ },
1090
+ {
1091
+ parameter_key: "ReleaseVersion",
1092
+ parameter_value: "#{@projects["starsky"]['revision']}"
1093
+ },
1094
+ {
1095
+ parameter_key: "TaskDesiredCount",
1096
+ parameter_value: "1"
1097
+ },
1098
+ {
1099
+ parameter_key: "ECSClusterName",
1100
+ parameter_value: get_ecs_cluster_name
1101
+ },
1102
+ {
1103
+ parameter_key: "ALBShortName",
1104
+ parameter_value: "starsky-qa-#{get_deploy_id}"[0..27]
1105
+ },
1106
+ {
1107
+ parameter_key: "EnvHash",
1108
+ parameter_value: get_deploy_id
1109
+ },
1110
+ {
1111
+ parameter_key: "HostnamePattern",
1112
+ parameter_value: "starsky-#{get_deploy_id}.qa.colaster.com"
1113
+ },
1114
+ {
1115
+ parameter_key: "HostnamePatternPriority",
1116
+ parameter_value: (hostname_pattern_priority.to_i + 74).to_s
1117
+ }
1118
+ ]
1119
+ if stack_exists?(stack_name_starsky)
1120
+ cur_version = get_currently_deployed_version(stack_name_starsky)
1121
+ unless cur_version.include?(@projects["starsky"]['revision'])
1122
+ delete_stack(stack_name_starsky)
1123
+ wait_for_stack_removal(stack_name_starsky)
1124
+ create_stack(stack_name_starsky, stack_body, parameters, @tags, @cf_role)
1125
+ end
1126
+ else
1127
+ create_stack(stack_name_starsky, stack_body, parameters, @tags, @cf_role)
1128
+ end
1129
+ end
1130
+
1131
+ def create_activia_stack()
1132
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/activia/#{@projects["activia"]['revision']}-qa.tar.gz")
1133
+
1134
+ stack_name_activia = get_stack_name("activia")
1135
+ git_checkout_version('activia', @projects["activia"]['revision'])
1136
+ stack_body = File.read('projects/activia/deploy/task.yml')
1137
+ parameters = [
1138
+ {
1139
+ parameter_key: "Environment",
1140
+ parameter_value: "qa"
1141
+ },
1142
+ {
1143
+ parameter_key: "ReleaseVersion",
1144
+ parameter_value: "#{@projects["activia"]['revision']}"
1145
+ },
1146
+ {
1147
+ parameter_key: "ECSClusterName",
1148
+ parameter_value: get_ecs_cluster_name
1149
+ },
1150
+ {
1151
+ parameter_key: "TaskDesiredCount",
1152
+ parameter_value: "1"
1153
+ },
1154
+ {
1155
+ parameter_key: "HostnamePattern",
1156
+ parameter_value: "activia-#{get_deploy_id}.qa.colaster.com"
1157
+ },
1158
+ {
1159
+ parameter_key: "HostnamePatternPriority",
1160
+ parameter_value: hostname_pattern_priority
1161
+ },
1162
+ {
1163
+ parameter_key: "WebHost",
1164
+ parameter_value: get_route53_hostname('ecs-task-web-qa-notneeded')
1165
+ },
1166
+ {
1167
+ parameter_key: "PeanoHost",
1168
+ parameter_value: get_route53_hostname('ecs-task-peano-qa-notneeded')
1169
+ }
1170
+ ]
1171
+ if stack_exists?(stack_name_activia)
1172
+ cur_version = get_currently_deployed_version(stack_name_activia)
1173
+ update_stack(stack_name_activia, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["activia"]['revision'])
1174
+ else
1175
+ create_stack(stack_name_activia, stack_body, parameters, @tags, @cf_role)
1176
+ end
1177
+ end
1178
+
1179
+ def create_web_stack()
1180
+ wait_for_artifact('prima-artifacts-encrypted', "prima/#{@projects["prima"]['revision']}.tar.gz")
1181
+ # Waiting for prima healtcheck dependencies
1182
+ wait_for_stack_ready(get_stack_name("skynet")) unless stack_ready?(get_stack_name("skynet"))
1183
+ wait_for_stack_ready(get_stack_name("urania")) unless stack_ready?(get_stack_name("urania"))
1184
+ wait_for_stack_ready(get_stack_name("bburago")) unless stack_ready?(get_stack_name("bburago"))
1185
+ wait_for_stack_ready(get_stack_name("hal9000")) unless stack_ready?(get_stack_name("hal9000"))
1186
+ wait_for_stack_ready(get_stack_name("assange")) unless stack_ready?(get_stack_name("assange"))
1187
+ wait_for_stack_ready(get_stack_name("fidaty")) unless stack_ready?(get_stack_name("fidaty"))
1188
+ wait_for_stack_ready(get_stack_name("leftorium")) unless stack_ready?(get_stack_name("leftorium"))
1189
+ wait_for_stack_ready(get_stack_name("rachele")) unless stack_ready?(get_stack_name("rachele"))
1190
+ stack_name_web = get_stack_name("web")
1191
+ git_checkout_version('prima', @projects["prima"]['revision'])
1192
+ stack_body = IO.read('projects/prima/app/cloudformation/tasks/web.yml')
1193
+ parameters = [
1194
+ {
1195
+ parameter_key: "Environment",
1196
+ parameter_value: "qa"
1197
+ },
1198
+ {
1199
+ parameter_key: "ReleaseVersion",
1200
+ parameter_value: "#{@projects["prima"]['revision']}"
1201
+ },
1202
+ {
1203
+ parameter_key: "TaskDesiredCount",
1204
+ parameter_value: "1"
1205
+ },
1206
+ {
1207
+ parameter_key: "ECSClusterName",
1208
+ parameter_value: get_ecs_cluster_name
1209
+ },
1210
+ {
1211
+ parameter_key: "ALBShortName",
1212
+ parameter_value: "web-qa-#{get_deploy_id}"[0..27]
1213
+ },
1214
+ {
1215
+ parameter_key: "HostnamePatternPriority",
1216
+ parameter_value: hostname_pattern_priority
1217
+ },
1218
+ {
1219
+ parameter_key: "HostnamePatternAggregatorPriority",
1220
+ parameter_value: (hostname_pattern_priority.to_i + 1).to_s
1221
+ },
1222
+ {
1223
+ parameter_key: "EnvHash",
1224
+ parameter_value: get_deploy_id
1225
+ },
1226
+ {
1227
+ parameter_key: "HostnamePattern",
1228
+ parameter_value: "www-#{get_deploy_id}.*"
1229
+ }
1230
+ ]
1231
+ if stack_exists?(stack_name_web)
1232
+ cur_version = get_currently_deployed_version(stack_name_web)
1233
+ update_stack(stack_name_web, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["prima"]['revision'])
1234
+ else
1235
+ create_stack(stack_name_web, stack_body, parameters, @tags, @cf_role)
1236
+ end
1237
+ end
1238
+
1239
+ def create_consumer_stack()
1240
+ wait_for_artifact('prima-artifacts-encrypted', "prima/#{@projects["prima"]['revision']}.tar.gz")
1241
+ # Waiting for prima healtcheck dependencies
1242
+ wait_for_stack_ready(get_stack_name("skynet")) unless stack_ready?(get_stack_name("skynet"))
1243
+ wait_for_stack_ready(get_stack_name("urania")) unless stack_ready?(get_stack_name("urania"))
1244
+ wait_for_stack_ready(get_stack_name("bburago")) unless stack_ready?(get_stack_name("bburago"))
1245
+ wait_for_stack_ready(get_stack_name("hal9000")) unless stack_ready?(get_stack_name("hal9000"))
1246
+ wait_for_stack_ready(get_stack_name("assange")) unless stack_ready?(get_stack_name("assange"))
1247
+ wait_for_stack_ready(get_stack_name("fidaty")) unless stack_ready?(get_stack_name("fidaty"))
1248
+ wait_for_stack_ready(get_stack_name("leftorium")) unless stack_ready?(get_stack_name("leftorium"))
1249
+ wait_for_stack_ready(get_stack_name("rachele")) unless stack_ready?(get_stack_name("rachele"))
1250
+ stack_name_consumer = get_stack_name("consumer")
1251
+ git_checkout_version('prima', @projects["prima"]['revision'])
1252
+ stack_body = IO.read('projects/prima/app/cloudformation/tasks/consumer.yml')
1253
+ parameters = [
1254
+ {
1255
+ parameter_key: "Environment",
1256
+ parameter_value: "qa"
1257
+ },
1258
+ {
1259
+ parameter_key: "ReleaseVersion",
1260
+ parameter_value: "#{@projects["prima"]['revision']}"
1261
+ },
1262
+ {
1263
+ parameter_key: "ECSClusterName",
1264
+ parameter_value: get_ecs_cluster_name
1265
+ },
1266
+ {
1267
+ parameter_key: "EnvHash",
1268
+ parameter_value: get_deploy_id
1269
+ }
1270
+ ]
1271
+ if stack_exists?(stack_name_consumer)
1272
+ cur_version = get_currently_deployed_version(stack_name_consumer)
1273
+ update_stack(stack_name_consumer, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["prima"]['revision'])
1274
+ else
1275
+ create_stack(stack_name_consumer, stack_body, parameters, @tags, @cf_role)
1276
+ end
1277
+
1278
+ stack_name_consumer_api = get_stack_name("consumer-api")
1279
+ stack_body = IO.read('projects/prima/app/cloudformation/tasks/consumer-api.yml')
1280
+ parameters = [
1281
+ {
1282
+ parameter_key: "Environment",
1283
+ parameter_value: "qa"
1284
+ },
1285
+ {
1286
+ parameter_key: "ReleaseVersion",
1287
+ parameter_value: "#{@projects["prima"]['revision']}"
1288
+ },
1289
+ {
1290
+ parameter_key: "ECSClusterName",
1291
+ parameter_value: get_ecs_cluster_name
1292
+ },
1293
+ {
1294
+ parameter_key: "EnvHash",
1295
+ parameter_value: get_deploy_id
1296
+ },
1297
+ {
1298
+ parameter_key: "HostnamePattern",
1299
+ parameter_value: "consumer-#{get_deploy_id}.qa.colaster.com"
1300
+ }
1301
+ ]
1302
+ if stack_exists?(stack_name_consumer_api)
1303
+ cur_version = get_currently_deployed_version(stack_name_consumer_api)
1304
+ update_stack(stack_name_consumer_api, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["prima"]['revision'])
1305
+ else
1306
+ create_stack(stack_name_consumer_api, stack_body, parameters, @tags, @cf_role)
1307
+ end
1308
+ end
1309
+
1310
+ def create_roger_stack()
1311
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/roger/#{@projects["roger"]['revision']}-qa.tar.gz")
1312
+ wait_for_stack_ready(get_stack_name("consumer")) unless stack_ready?(get_stack_name("consumer"))
1313
+ stack_name_roger = "ecs-task-roger-qa-#{get_deploy_id}"
1314
+ git_checkout_version('roger', @projects["roger"]['revision'])
1315
+ stack_body = File.read('projects/roger/deploy/task.yml')
1316
+ parameters = [
1317
+ {
1318
+ parameter_key: "Environment",
1319
+ parameter_value: "qa"
1320
+ },
1321
+ {
1322
+ parameter_key: "ReleaseVersion",
1323
+ parameter_value: @projects["roger"]['revision']
1324
+ },
1325
+ {
1326
+ parameter_key: "ECSClusterName",
1327
+ parameter_value: get_ecs_cluster_name
1328
+ },
1329
+ {
1330
+ parameter_key: "TaskDesiredCount",
1331
+ parameter_value: '1'
1332
+ }
1333
+ ]
1334
+ if stack_exists?(stack_name_roger)
1335
+ cur_version = get_currently_deployed_version(stack_name_roger)
1336
+ update_stack(stack_name_roger, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["roger"]['revision'])
1337
+ else
1338
+ create_stack(stack_name_roger, stack_body, parameters, @tags, @cf_role)
1339
+ end
1340
+ end
1341
+
1342
+ def create_hutch_stack()
1343
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/hutch/#{@projects["hutch"]['revision']}-#{get_deploy_id[0..7]}-qa.tar.gz")
1344
+ wait_for_stack_ready(get_stack_name("starsky")) unless stack_ready?(get_stack_name("starsky"))
1345
+
1346
+ stack_name_hutch = get_stack_name("hutch")
1347
+ git_checkout_version('hutch', @projects["hutch"]['revision'])
1348
+ stack_body = File.read('projects/hutch/deploy/task.yml')
1349
+ parameters = [
1350
+ {
1351
+ parameter_key: "Environment",
1352
+ parameter_value: "qa"
1353
+ },
1354
+ {
1355
+ parameter_key: "ReleaseVersion",
1356
+ parameter_value: "#{@projects["hutch"]['revision']}-#{get_deploy_id[0..7]}"
1357
+ },
1358
+ {
1359
+ parameter_key: "ALBShortName",
1360
+ parameter_value: "hutch-qa-#{get_deploy_id}"[0..27]
1361
+ },
1362
+ {
1363
+ parameter_key: "ECSClusterName",
1364
+ parameter_value: get_ecs_cluster_name
1365
+ },
1366
+ {
1367
+ parameter_key: "EnvHash",
1368
+ parameter_value: get_deploy_id
1369
+ },
1370
+ {
1371
+ parameter_key: "HostnamePattern",
1372
+ parameter_value: "hutch-#{get_deploy_id}.qa.colaster.com"
1373
+ },
1374
+ {
1375
+ parameter_key: "HostnamePatternPriority",
1376
+ parameter_value: (hostname_pattern_priority.to_i + 254).to_s
1377
+ },
1378
+ {
1379
+ parameter_key: "ApiUrl",
1380
+ parameter_value: "https://#{get_route53_hostname('maia-intermediari')}"
1381
+ }
1382
+ ]
1383
+ if stack_exists?(stack_name_hutch)
1384
+ cur_version = get_currently_deployed_version(stack_name_hutch)
1385
+ update_stack(stack_name_hutch, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["hutch"]['revision'])
1386
+ else
1387
+ create_stack(stack_name_hutch, stack_body, parameters, @tags, @cf_role)
1388
+ end
1389
+ end
1390
+
1391
+ def create_maia_stack()
1392
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/maia/#{@projects["maia"]['revision']}-qa.tar.gz")
1393
+ stack_name_maia = get_stack_name("maia")
1394
+ git_checkout_version('maia', @projects["maia"]['revision'])
1395
+ stack_body = File.read('projects/maia/deploy/task.yml')
1396
+ parameters = [
1397
+ {
1398
+ parameter_key: "Environment",
1399
+ parameter_value: "qa"
1400
+ },
1401
+ {
1402
+ parameter_key: "ReleaseVersion",
1403
+ parameter_value: "#{@projects["maia"]['revision']}"
1404
+ },
1405
+ {
1406
+ parameter_key: "ALBShortName",
1407
+ parameter_value: "maia-qa-#{get_deploy_id}"[0..15]
1408
+ },
1409
+ {
1410
+ parameter_key: "ECSClusterName",
1411
+ parameter_value: get_ecs_cluster_name
1412
+ },
1413
+ {
1414
+ parameter_key: "EnvHash",
1415
+ parameter_value: get_deploy_id
1416
+ },
1417
+ {
1418
+ parameter_key: "HostnamePatternPublic",
1419
+ parameter_value: "api*-#{get_deploy_id}.qa.colaster.com"
1420
+ },
1421
+ {
1422
+ parameter_key: "HostnamePatternPriority",
1423
+ parameter_value: (hostname_pattern_priority.to_i + 128).to_s
1424
+ },
1425
+ {
1426
+ parameter_key: "ProxyHostnameIntermediari",
1427
+ parameter_value: "api-intermediari-#{get_deploy_id}.qa.colaster.com"
1428
+ },
1429
+ {
1430
+ parameter_key: "ProxyHostnameApp",
1431
+ parameter_value: "api-#{get_deploy_id}.qa.colaster.com"
1432
+ }
1433
+ ]
1434
+ if stack_exists?(stack_name_maia)
1435
+ cur_version = get_currently_deployed_version(stack_name_maia)
1436
+ update_stack(stack_name_maia, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["maia"]['revision'])
1437
+ else
1438
+ create_stack(stack_name_maia, stack_body, parameters, @tags, @cf_role)
1439
+ end
1440
+ end
1441
+
1442
+ def create_vianello_stack()
1443
+ if deploy_vianello_or_domus?
1444
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/vianello/#{@projects["vianello"]['revision']}-qa.tar.gz")
1445
+ stack_name_vianello = "ecs-task-vianello-qa-#{get_deploy_id}"
1446
+ git_checkout_version('vianello', @projects["vianello"]['revision'])
1447
+ stack_body = File.read('projects/vianello/deploy/task.yml')
1448
+ parameters = [
1449
+ {
1450
+ parameter_key: "Environment",
1451
+ parameter_value: "qa"
1452
+ },
1453
+ {
1454
+ parameter_key: "ReleaseVersion",
1455
+ parameter_value: @projects["vianello"]['revision']
1456
+ },
1457
+ {
1458
+ parameter_key: "ECSClusterName",
1459
+ parameter_value: get_ecs_cluster_name
1460
+ },
1461
+ {
1462
+ parameter_key: "TaskDesiredCount",
1463
+ parameter_value: '1'
1464
+ },
1465
+ {
1466
+ parameter_key: "HostnamePattern",
1467
+ parameter_value: "vianello-#{get_deploy_id}.qa.colaster.com"
1468
+ },
1469
+ {
1470
+ parameter_key: "HostnamePatternPriority",
1471
+ parameter_value: (hostname_pattern_priority.to_i + 254).to_s
1472
+ },
1473
+ {
1474
+ parameter_key: "ECSClusterName",
1475
+ parameter_value: get_ecs_cluster_name
1476
+ },
1477
+ {
1478
+ parameter_key: "ALBShortName",
1479
+ parameter_value: "vianello-qa-#{get_deploy_id}"[0..27]
1480
+ },
1481
+ {
1482
+ parameter_key: "EnvHash",
1483
+ parameter_value: get_deploy_id
1484
+ }
1485
+ ]
1486
+ if stack_exists?(stack_name_vianello)
1487
+ cur_version = get_currently_deployed_version(stack_name_vianello)
1488
+ update_stack(stack_name_vianello, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["vianello"]['revision'])
1489
+ else
1490
+ create_stack(stack_name_vianello, stack_body, parameters, @tags, @cf_role)
1491
+ end
1492
+ else
1493
+ true
1494
+ end
1495
+ end
1496
+
1497
+ def create_domus_stack()
1498
+ if deploy_vianello_or_domus?
1499
+ wait_for_artifact('prima-artifacts-encrypted', "microservices/domus/#{@projects["domus"]['revision']}-#{get_deploy_id[0..7]}-qa.tar.gz")
1500
+ wait_for_stack_ready(get_stack_name("vianello")) unless stack_ready?(get_stack_name("vianello"))
1501
+
1502
+ stack_name_domus = get_stack_name("domus")
1503
+ git_checkout_version('domus', @projects["domus"]['revision'])
1504
+ stack_body = File.read('projects/domus/deploy/task.yml')
1505
+ parameters = [
1506
+ {
1507
+ parameter_key: "Environment",
1508
+ parameter_value: "qa"
1509
+ },
1510
+ {
1511
+ parameter_key: "ReleaseVersion",
1512
+ parameter_value: "#{@projects["domus"]['revision']}-#{get_deploy_id[0..7]}"
1513
+ },
1514
+ {
1515
+ parameter_key: "ALBShortName",
1516
+ parameter_value: "domus-qa-#{get_deploy_id}"[0..27]
1517
+ },
1518
+ {
1519
+ parameter_key: "ECSClusterName",
1520
+ parameter_value: get_ecs_cluster_name
1521
+ },
1522
+ {
1523
+ parameter_key: "EnvHash",
1524
+ parameter_value: get_deploy_id
1525
+ },
1526
+ {
1527
+ parameter_key: "HostnamePattern",
1528
+ parameter_value: "domus-#{get_deploy_id}.qa.colaster.com"
1529
+ },
1530
+ {
1531
+ parameter_key: "HostnamePatternPriority",
1532
+ parameter_value: (hostname_pattern_priority.to_i + 254).to_s
1533
+ },
1534
+ {
1535
+ parameter_key: "ApiUrl",
1536
+ parameter_value: "https://#{get_route53_hostname('vianello')}"
1537
+ }
1538
+ ]
1539
+ if stack_exists?(stack_name_domus)
1540
+ cur_version = get_currently_deployed_version(stack_name_domus)
1541
+ update_stack(stack_name_domus, stack_body, parameters, @tags, @cf_role) unless cur_version.include?(@projects["domus"]['revision'])
1542
+ else
1543
+ create_stack(stack_name_domus, stack_body, parameters, @tags, @cf_role)
1544
+ end
1545
+ else
1546
+ true
1547
+ end
1548
+ end
1549
+
1550
+ def create_rogoreport_stack()
1551
+ true
1552
+ end
1553
+
1554
+ def complete_qa_setup!()
1555
+ wait_for_stack_ready(get_stack_name("web")) unless stack_ready?(get_stack_name("web"))
1556
+ wait_for_stack_ready(get_stack_name("consumer")) unless stack_ready?(get_stack_name("consumer"))
1557
+ wait_for_stack_ready(get_stack_name("worker-ermes")) unless stack_ready?(get_stack_name("worker-ermes"))
1558
+ wait_for_stack_ready(get_stack_name("ermes")) unless stack_ready?(get_stack_name("ermes"))
1559
+ wait_for_stack_ready(get_stack_name("peano")) unless stack_ready?(get_stack_name("peano"))
1560
+ wait_for_stack_ready(get_stack_name("legion")) unless stack_ready?(get_stack_name("legion"))
1561
+ wait_for_stack_ready(get_stack_name("borat")) unless stack_ready?(get_stack_name("borat"))
1562
+ wait_for_stack_ready(get_stack_name("activia")) unless stack_ready?(get_stack_name("activia"))
1563
+ wait_for_stack_ready(get_stack_name("maia")) unless stack_ready?(get_stack_name("maia"))
1564
+ wait_for_stack_ready(get_stack_name("crash")) unless stack_ready?(get_stack_name("crash"))
1565
+ wait_for_stack_ready(get_stack_name("hutch")) unless stack_ready?(get_stack_name("hutch"))
1566
+ if deploy_vianello_or_domus?
1567
+ wait_for_stack_ready(get_stack_name("vianello")) unless stack_ready?(get_stack_name("vianello"))
1568
+ wait_for_stack_ready(get_stack_name("domus")) unless stack_ready?(get_stack_name("domus"))
1569
+ end
1570
+
1571
+ update_service_defaults(get_stack_name("web"))
1572
+ update_service_defaults(get_stack_name("consumer-api"))
1573
+ update_service_defaults(get_stack_name("urania"))
1574
+ update_service_defaults(get_stack_name("worker-ermes"))
1575
+ update_service_defaults(get_stack_name("ermes"))
1576
+ update_service_defaults(get_stack_name("bburago"))
1577
+ update_service_defaults(get_stack_name("hal9000"))
1578
+ update_service_defaults(get_stack_name("fidaty"))
1579
+ update_service_defaults(get_stack_name("peano"))
1580
+ # update_service_defaults(get_stack_name("legion")) TODO UNCOMMENT
1581
+ update_service_defaults(get_stack_name("assange"))
1582
+ update_service_defaults(get_stack_name("borat"))
1583
+ update_service_defaults(get_stack_name("activia"))
1584
+ update_service_defaults(get_stack_name("skynet"))
1585
+ update_service_defaults(get_stack_name("leftorium"))
1586
+ update_service_defaults(get_stack_name("rachele"))
1587
+ update_service_defaults(get_stack_name("maia"))
1588
+ update_service_defaults(get_stack_name("starsky"))
1589
+ update_service_defaults(get_stack_name("hutch"))
1590
+ update_service_defaults(get_stack_name("crash"))
1591
+ if deploy_vianello_or_domus?
1592
+ update_service_defaults(get_stack_name("vianello"))
1593
+ update_service_defaults(get_stack_name("domus"))
1594
+ end
1595
+
1596
+ activia_hostname = get_route53_hostname("activia")
1597
+ assange_hostname = get_route53_hostname("assange")
1598
+ bburago_hostname = get_route53_hostname("bburago")
1599
+ borat_hostname = get_route53_hostname("borat")
1600
+ ermes_hostname = get_route53_hostname("ermes")
1601
+ fidaty_hostname = get_route53_hostname("fidaty")
1602
+ hal9000_hostname = get_route53_hostname("hal9000")
1603
+ prima_hostname = get_route53_hostname("web")
1604
+ peano_hostname = get_route53_hostname("peano")
1605
+ skynet_hostname = get_route53_hostname("skynet")
1606
+ urania_hostname = get_route53_hostname("urania")
1607
+ roger_hostname = get_route53_hostname("roger")
1608
+ leftorium_hostname = get_route53_hostname("leftorium")
1609
+ rachele_hostname = get_route53_hostname("rachele")
1610
+ maia_app_hostname = get_route53_hostname("maia-app")
1611
+ maia_intermediari_hostname = get_route53_hostname("maia-intermediari")
1612
+ crash_hostname = get_route53_hostname("crash")
1613
+ starsky_hostname = get_route53_hostname("starsky")
1614
+ hutch_hostname = get_route53_hostname("hutch")
1615
+ legion_hostname = get_route53_hostname("legion")
1616
+ vianello_hostname = get_route53_hostname("vianello")
1617
+ domus_hostname = get_route53_hostname("domus")
1618
+
1619
+ #launch_mimo(get_deploy_id)
1620
+
1621
+ projects_text = "
1622
+ > Prima url: https://#{prima_hostname}
1623
+ > Backoffice (Borat) url: https://#{borat_hostname}
1624
+ > Urania url: http://#{urania_hostname}:81
1625
+ > Bburago url: http://#{bburago_hostname}:83
1626
+ > Ermes url: http://#{ermes_hostname}:10002
1627
+ > Hal9000 url: http://#{hal9000_hostname}:10031
1628
+ > Fidaty url: http://#{fidaty_hostname}:10021
1629
+ > Peano url: http://#{peano_hostname}:10039
1630
+ > Assange url: https://#{assange_hostname}
1631
+ > Activia url: http://#{activia_hostname}:10041
1632
+ > Skynet url: http://#{skynet_hostname}:8050
1633
+ > Roger url: http://#{roger_hostname}:10051
1634
+ > Leftorium url: http://#{leftorium_hostname}:10061
1635
+ > Rachele url: http://#{rachele_hostname}:10040
1636
+ > Maia App url: https://#{maia_app_hostname}
1637
+ > Maia Intermediari url: https://#{maia_intermediari_hostname}
1638
+ > Legion url: http://#{legion_hostname}:8051
1639
+ > Crash url: https://#{crash_hostname}
1640
+ > Starsky url: https://#{starsky_hostname}
1641
+ > Hutch url: https://#{hutch_hostname}"
1642
+ projects_text.concat "
1643
+ > Vianello url: https://#{vianello_hostname}
1644
+ > Domus url: https://#{domus_hostname}" if deploy_vianello_or_domus?
1645
+ projects_text.concat "
1646
+ > RabbitMQ url: http://#{get_ec2_ip_address}:15672
1647
+ > Elasticsearch url: http://#{get_ec2_ip_address}:9200
1648
+ > Git branch: #{@git_branch}
1649
+ > SSH connection: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no githubUsername@#{get_ec2_ip_address}\n"
1650
+ output projects_text.cyan
1651
+ output "Deploy effettuato, everything is awesome!\n".green
1652
+
1653
+ if @projects['prima']['name'] != 'master' then
1654
+ output "Lancio il batch job per la visual regression..."
1655
+ launch_bocelli_test(prima_hostname)
1656
+ output "Visual regression lanciata con successo!"
1657
+
1658
+ output "Lancio i test con Lighthouse..."
1659
+ launch_lighthouse_test(prima_hostname, "mobile")
1660
+ launch_lighthouse_test(prima_hostname, "desktop")
1661
+ output "Test con Lighthouse lanciati con successo..."
1662
+ end
1663
+
1664
+ qainit_write_output(projects_text, 'Indirizzi scritti su ')
1665
+ end
1666
+
1667
+ def get_route53_hostname(project)
1668
+ case
1669
+ when project.include?('web')
1670
+ host = "www-#{get_deploy_id}.qa.colaster.com"
1671
+ when project.include?('urania')
1672
+ host = "urania-#{get_deploy_id}.qa.colaster.com"
1673
+ when project.include?('bburago')
1674
+ host = "bburago-#{get_deploy_id}.qa.colaster.com"
1675
+ when project.include?('hal9000')
1676
+ host = "hal9000-#{get_deploy_id}.qa.colaster.com"
1677
+ when project.include?('fidaty')
1678
+ host = "fidaty-#{get_deploy_id}.qa.colaster.com"
1679
+ when project.include?('peano')
1680
+ host = "peano-#{get_deploy_id}.qa.colaster.com"
1681
+ when project.include?('assange')
1682
+ host = "assange-#{get_deploy_id}.qa.colaster.com"
1683
+ when project.include?('borat')
1684
+ host = "backoffice-#{get_deploy_id}.qa.colaster.com"
1685
+ when project.include?('crash')
1686
+ host = "crash-#{get_deploy_id}.qa.colaster.com"
1687
+ when project.include?('ermes')
1688
+ host = "ermes-#{get_deploy_id}.qa.colaster.com"
1689
+ when project.include?('activia')
1690
+ host = "activia-#{get_deploy_id}.qa.colaster.com"
1691
+ when project.include?('skynet')
1692
+ host = "skynet-#{get_deploy_id}.qa.colaster.com"
1693
+ when project.include?('roger')
1694
+ host = "roger-#{get_deploy_id}.qa.colaster.com"
1695
+ when project.include?('leftorium')
1696
+ host = "leftorium-#{get_deploy_id}.qa.colaster.com"
1697
+ when project.include?('rachele')
1698
+ host = "rachele-#{get_deploy_id}.qa.colaster.com"
1699
+ when project.include?('starsky')
1700
+ host = "starsky-#{get_deploy_id}.qa.colaster.com"
1701
+ when project.include?('hutch')
1702
+ host = "hutch-#{get_deploy_id}.qa.colaster.com"
1703
+ when project.include?('maia-app')
1704
+ host = "api-#{get_deploy_id}.qa.colaster.com"
1705
+ when project.include?('legion')
1706
+ host = "legion-#{get_deploy_id}.qa.colaster.com"
1707
+ when project.include?('maia-intermediari')
1708
+ host = "api-intermediari-#{get_deploy_id}.qa.colaster.com"
1709
+ when project.include?('vianello')
1710
+ host = "vianello-#{get_deploy_id}.qa.colaster.com"
1711
+ when project.include?('domus')
1712
+ host = "domus-#{get_deploy_id}.qa.colaster.com"
1713
+ end
1714
+ host
1715
+ end
1716
+
1717
+ def get_ec2_ip_address()
1718
+ if @ec2_ip_address
1719
+ @ec2_ip_address
1720
+ else
1721
+ resp = describe_stack_resource(get_asg_stack_name, 'ECSAutoScalingGroup')
1722
+ resp = describe_auto_scaling_groups([resp.stack_resource_detail.physical_resource_id], 1)
1723
+ instance_id = resp.auto_scaling_groups[0].instances[0].instance_id
1724
+ resp = describe_instances([instance_id])
1725
+ @ec2_ip_address = resp.reservations[0].instances[0].private_ip_address
1726
+ @ec2_ip_address
1727
+ end
1728
+ end
1729
+
1730
+ def get_alb_host(stack_name)
1731
+ case
1732
+ when stack_name.include?('web')
1733
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1734
+ when stack_name.include?('urania')
1735
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1736
+ when stack_name.include?('backoffice')
1737
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1738
+ when stack_name.include?('bburago')
1739
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1740
+ when stack_name.include?('hal9000')
1741
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1742
+ when stack_name.include?('fidaty')
1743
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1744
+ when stack_name.include?('activia')
1745
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1746
+ when stack_name.include?('skynet')
1747
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1748
+ when stack_name.include?('roger')
1749
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1750
+ when stack_name.include?('alb-http-public')
1751
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1752
+ when stack_name.include?('alb-ws-public')
1753
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1754
+ when stack_name.include?('peano')
1755
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1756
+ when stack_name.include?('leftorium')
1757
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1758
+ when stack_name.include?('assange')
1759
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1760
+ when stack_name.include?('borat')
1761
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1762
+ when stack_name.include?('crash')
1763
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1764
+ when stack_name.include?('rachele')
1765
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1766
+ when stack_name.include?('starsky')
1767
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1768
+ when stack_name.include?('hutch')
1769
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1770
+ when stack_name.include?('maia')
1771
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1772
+ when stack_name.include?('legion')
1773
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1774
+ when stack_name.include?('vianello')
1775
+ logical_resource_id = 'EcsApplicationLoadBalancerInternal'
1776
+ when stack_name.include?('domus')
1777
+ logical_resource_id = 'EcsApplicationLoadBalancerPublic'
1778
+ end
1779
+ resp = describe_stack_resource(stack_name, logical_resource_id)
1780
+ resp = describe_load_balancers([resp.stack_resource_detail.physical_resource_id])
1781
+ resp.load_balancers[0].dns_name
1782
+ end
1783
+
1784
+ def update_service_defaults(stack_name)
1785
+ case
1786
+ when stack_name.include?('web')
1787
+ logical_resource_id = 'ECSServiceWebQA'
1788
+ when stack_name.include?('consumer')
1789
+ logical_resource_id = 'ECSServiceConsumerApiQa'
1790
+ when stack_name.include?('urania')
1791
+ logical_resource_id = 'ECSServiceUraniaQA'
1792
+ when stack_name.include?('backoffice')
1793
+ logical_resource_id = 'ECSServiceBackoffice'
1794
+ when stack_name.include?('worker-ermes')
1795
+ logical_resource_id = 'ECSServiceErmesWorker'
1796
+ when stack_name.include?('ermes')
1797
+ logical_resource_id = 'ECSServiceErmesQA'
1798
+ when stack_name.include?('bburago')
1799
+ logical_resource_id = 'ECSServiceBburagoQA'
1800
+ when stack_name.include?('hal9000')
1801
+ logical_resource_id = 'ECSServiceHal9000QA'
1802
+ when stack_name.include?('fidaty')
1803
+ logical_resource_id = 'ECSServiceFidatyQA'
1804
+ when stack_name.include?('skynet')
1805
+ logical_resource_id = 'ECSServiceSkynetQA'
1806
+ when stack_name.include?('roger')
1807
+ logical_resource_id = 'ECSServiceRogerQA'
1808
+ when stack_name.include?('activia')
1809
+ logical_resource_id = 'ECSServiceActiviaQA'
1810
+ when stack_name.include?('peano')
1811
+ logical_resource_id = 'ECSServicePeanoQA'
1812
+ when stack_name.include?('assange')
1813
+ logical_resource_id = 'ECSServiceAssangeQA'
1814
+ when stack_name.include?('borat')
1815
+ logical_resource_id = 'ECSServiceBorat'
1816
+ when stack_name.include?('leftorium')
1817
+ logical_resource_id = 'ECSServiceLeftoriumQA'
1818
+ when stack_name.include?('rachele')
1819
+ logical_resource_id = 'ECSServiceRacheleQA'
1820
+ when stack_name.include?('crash')
1821
+ logical_resource_id = 'ECSServiceCrashQA'
1822
+ when stack_name.include?('starsky')
1823
+ logical_resource_id = 'ECSServiceStarskyQA'
1824
+ when stack_name.include?('hutch')
1825
+ logical_resource_id = 'ECSServiceHutch'
1826
+ when stack_name.include?('maia')
1827
+ logical_resource_id = 'ECSServiceMaia'
1828
+ when stack_name.include?('legion')
1829
+ logical_resource_id = 'ECSServiceLegionQA'
1830
+ when stack_name.include?('vianello')
1831
+ logical_resource_id = 'ECSServiceVianelloQA'
1832
+ when stack_name.include?('domus')
1833
+ logical_resource_id = 'ECSServiceDomus'
1834
+ else
1835
+ raise "Service name non gestito per lo stack #{stack_name}"
1836
+ end
1837
+ resp = describe_stack_resource(stack_name, logical_resource_id)
1838
+ update_ecs_service(get_ecs_cluster_name, resp.stack_resource_detail.physical_resource_id, {minimum_healthy_percent: 0, maximum_percent: 100})
1839
+ end
1840
+
1841
+ def launch_lighthouse_test(url, device)
1842
+ @cloudflare.post("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {type: 'CNAME', name: "www-#{get_deploy_id}", content: url, proxied: true, ttl: 1}) unless get_lighthouse_dns()
1843
+
1844
+ @batch.submit_job({
1845
+ job_name: "lighthouse-#{device}-#{get_deploy_id}",
1846
+ job_queue: "tools-production",
1847
+ job_definition: describe_stack_resource('batch-job-lighthouse-production', 'JobDefinition').stack_resource_detail.physical_resource_id,
1848
+ container_overrides: {
1849
+ environment: [
1850
+ {
1851
+ name: "URL_TO_TEST",
1852
+ value: "https://www-#{get_deploy_id}.prima.it/?superprima"
1853
+ },
1854
+ {
1855
+ name: "DEVICE",
1856
+ value: device
1857
+ },
1858
+ {
1859
+ name: "BRANCH_NAME",
1860
+ value: @projects['prima']['name']
1861
+ },
1862
+ {
1863
+ name: "COMMITTER_EMAIL",
1864
+ value: @projects['prima']['committer']
1865
+ }
1866
+ ]
1867
+ }
1868
+ })
1869
+ end
1870
+
1871
+ def get_lighthouse_dns()
1872
+ dns_records = @cloudflare.get("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records", {per_page: 100, type: 'CNAME', name: "www-#{get_deploy_id}.prima.it"})
1873
+ if dns_records.body[:result_info][:count] > 0
1874
+ return dns_records.body[:result][0][:id]
1875
+ end
1876
+ false
1877
+ end
1878
+
1879
+ def delete_lighthouse_dns()
1880
+ dns_id = get_lighthouse_dns()
1881
+ @cloudflare.delete("zones/1fb634f19c43dfb0162cc4cb91915da2/dns_records/#{dns_id}") if dns_id
1882
+ end
1883
+
1884
+ def launch_bocelli_test(url)
1885
+ @batch.submit_job({
1886
+ job_name: "bocelli-test-#{get_deploy_id}",
1887
+ job_queue: "tools-production",
1888
+ job_definition: describe_stack_resource('batch-job-bocelli-production', 'JobDefinition').stack_resource_detail.physical_resource_id,
1889
+ container_overrides: {
1890
+ environment: [
1891
+ {
1892
+ name: "BATCH_COMMAND",
1893
+ value: "test"
1894
+ },
1895
+ {
1896
+ name: "QA_HOSTNAME",
1897
+ value: url
1898
+ },
1899
+ {
1900
+ name: "BRANCH_NAME",
1901
+ value: @projects['prima']['name']
1902
+ },
1903
+ {
1904
+ name: "COMMITTER_EMAIL",
1905
+ value: @projects['prima']['committer']
1906
+ }
1907
+ ]
1908
+ }
1909
+ })
1910
+ end
1911
+
1912
+ def deploy_vianello_or_domus?
1913
+ vianello_present = !@projects['vianello'].empty? && @projects['vianello'][:name] != 'master' && !@projects['vianello'][:default_branch]
1914
+ domus_present = !@projects['domus'].empty? && @projects['domus'][:name] != 'master' && !@projects['domus'][:default_branch]
1915
+ vianello_present || domus_present
1916
+ end
1917
+
1918
+ def git_checkout_version(project, revision)
1919
+ Dir.chdir "projects/#{project}"
1920
+ exec_step "git checkout -- . && git checkout #{revision}"
1921
+ Dir.chdir "../../"
1922
+ end
1923
+
1924
+ def create_asg_stack(stack_name, tags = [])
1925
+ stack_body = IO.read('cloudformation/stacks/asg/ecs-asg-allinone.yml')
1926
+ parameters = [
1927
+ {
1928
+ parameter_key: "Environment",
1929
+ parameter_value: "qa"
1930
+ },
1931
+ {
1932
+ parameter_key: "InstanceType",
1933
+ parameter_value: "t3a.xlarge"
1934
+ },
1935
+ {
1936
+ parameter_key: "ECSClusterName",
1937
+ parameter_value: get_ecs_cluster_name
1938
+ },
1939
+ {
1940
+ parameter_key: "AMIID",
1941
+ parameter_value: @ami_id
1942
+ }
1943
+ ]
1944
+ create_stack(stack_name, stack_body, parameters, tags, @cf_role)
1945
+ end
1946
+
1947
+ def create_cluster_stack(stack_name, tags = [])
1948
+ stack_body = IO.read('cloudformation/stacks/ecs-cluster.yml')
1949
+ create_stack(stack_name, stack_body, [], tags)
1950
+ end
1951
+
1952
+ def update_cluster_stack(stack_name, tags = [])
1953
+ stack_body = IO.read('cloudformation/stacks/ecs-cluster.yml')
1954
+ update_stack(stack_name, stack_body, [], tags)
1955
+ end
1956
+
1957
+ def create_alb_stack(stack_name, role, hash, environment = 'qa')
1958
+ stack_body = IO.read('cloudformation/stacks/elb/alb-public-qa.yml')
1959
+ parameters = [
1960
+ {
1961
+ parameter_key: "Environment",
1962
+ parameter_value: environment
1963
+ },
1964
+ {
1965
+ parameter_key: "Role",
1966
+ parameter_value: role
1967
+ },
1968
+ {
1969
+ parameter_key: "EnvHash",
1970
+ parameter_value: hash
1971
+ }
1972
+ ]
1973
+ create_stack(stack_name, stack_body, parameters, [], @cf_role)
1974
+ end
1975
+
1976
+ def import_redis_crash(qa_ip_address)
1977
+ output "Importo chiavi di Redis da staging\n".yellow
1978
+
1979
+ prefixes = ['CODICI', 'fun_with_flags']
1980
+ redis_qa = Redis.new(:url => "redis://#{qa_ip_address}:6379/10")
1981
+ redis_staging = Redis.new(:url => 'redis://staging.cache-1.prima.it:6379/10')
1982
+
1983
+ prefixes.each do |prefix|
1984
+ redis_staging.keys("#{prefix}*").each do |key|
1985
+ next unless redis_qa.keys(key).empty?
1986
+ output "Importo #{key} dal Redis di staging\n".yellow
1987
+ dump_staging = redis_staging.dump key
1988
+ redis_qa.restore key, 0, dump_staging
1989
+ end
1990
+ end
1991
+ end
1992
+
1993
+ def import_dbs(ip_address)
1994
+ overrides = {
1995
+ container_overrides: [
1996
+ {
1997
+ name: 'dbrestore',
1998
+ environment: [
1999
+ {
2000
+ name: 'EC2_IP_ADDRESS',
2001
+ value: ip_address
2002
+ }
2003
+ ]
2004
+ }
2005
+ ]
2006
+ }
2007
+ resp = run_ecs_task(get_ecs_cluster_name, @import_db_task, overrides, 1)
2008
+ return resp
2009
+ end
2010
+
2011
+ def wait_for_db_import(task)
2012
+ output "Attendo che i DB vengano importati...\n".yellow
2013
+ stopped_at = nil
2014
+ sleep 15 # altrimenti non trova il task appena avviato...
2015
+ while stopped_at.nil?
2016
+ if task.tasks[0].nil?
2017
+ pp get_ecs_cluster_name
2018
+ pp task
2019
+ stop_if true, "Task di import DB lanciato, ma risposta vuota!".red
2020
+ end
2021
+ task = describe_ecs_tasks(task.tasks[0].cluster_arn, [task.tasks[0].task_arn])
2022
+ stopped_at = task.tasks[0].stopped_at unless task.tasks[0].nil?
2023
+ sleep_seconds = 10
2024
+ seconds_elapsed = 0
2025
+ while true && stopped_at.nil?
2026
+ break if seconds_elapsed >= sleep_seconds
2027
+ print '.'.yellow; STDOUT.flush
2028
+ sleep 1
2029
+ seconds_elapsed += 1
2030
+ end
2031
+ end
2032
+ print "\n"
2033
+ end
2034
+
2035
+ def get_stacks()
2036
+ envs = {}
2037
+ stack_list = stack_list()
2038
+ stack_list.each do |stack|
2039
+ unless stack.stack_name.match(/spotfleet-allinone-qa-(\w+)$/)
2040
+ env_hash = stack.stack_name.match(/qa-(\w+)$/)[0]
2041
+ envs[env_hash] = stack.tags unless envs.has_key?(env_hash) || stack.tags.empty?
2042
+ end
2043
+ end
2044
+ return stack_list, envs
2045
+ end
2046
+
2047
+ def get_clusters()
2048
+ envs = {}
2049
+ cluster_list = cluster_list()
2050
+ cluster_list.each do |stack|
2051
+ unless stack.stack_name.match(/spotfleet-allinone-qa-(\w+)$/)
2052
+ env_hash = stack.stack_name.match(/qa-(\w+)$/)[0]
2053
+ envs[env_hash] = stack.tags unless envs.has_key?(env_hash) || stack.tags.empty?
2054
+ end
2055
+ end
2056
+ return cluster_list, envs
2057
+ end
2058
+
2059
+ def hostname_pattern_priority()
2060
+ (Time.now.to_i.to_s[-4..-1].to_i + Random.rand(40000)).to_s
2061
+ end
2062
+
2063
+ def launch_mimo(env_hash)
2064
+ resp = describe_stack_resource('batch-job-mimo', 'JobDefinition')
2065
+
2066
+ @batch.submit_job({
2067
+ job_name: "mimo-#{get_deploy_id}", # required
2068
+ job_queue: "tools-production", # required
2069
+ job_definition: resp.stack_resource_detail.physical_resource_id, # required
2070
+ container_overrides: {
2071
+ environment: [
2072
+ {
2073
+ name: 'ENV_HASH',
2074
+ value: env_hash
2075
+ },
2076
+ {
2077
+ name: 'APP_ENV',
2078
+ value: 'qa'
2079
+ },
2080
+ {
2081
+ name: 'CYPRESS_BASE_URL',
2082
+ value: "https://hutch-#{env_hash}.qa.colaster.com"
2083
+ },
2084
+ {
2085
+ name: 'CYPRESS_PEANO_BASE_URL',
2086
+ value: "http://peano-#{env_hash}.qa.colaster.com:10039/quotation"
2087
+ },
2088
+ {
2089
+ name: 'CYPRESS_API_BASE_URL',
2090
+ value: "https://#{get_route53_hostname("starsky")}/graphql"
2091
+ },
2092
+ {
2093
+ name: 'QA_NAME',
2094
+ value: @git_branch
2095
+ }
2096
+ ]
2097
+ }
2098
+ })
2099
+
2100
+ output "Mimo lanciato con successo!\n".green
2101
+ end
2102
+
2103
+ def get_currently_deployed_version(stack_name)
2104
+ parameters = get_stack_parameters(stack_name)
2105
+ currently_deployed_version = nil
2106
+ parameters.each do |parameter|
2107
+ if parameter.parameter_key == "ReleaseVersion"
2108
+ currently_deployed_version = parameter.parameter_value
2109
+ end
2110
+ end
2111
+ currently_deployed_version
2112
+ end
2113
+
2114
+ def get_ami_id(stack_name)
2115
+ get_stack_parameters(stack_name).each do |param|
2116
+ if param.parameter_key == "AMIID"
2117
+ return param.parameter_value
2118
+ end
2119
+ end
2120
+ end
2121
+ end
2122
+
2123
+ def help_content
2124
+ <<-HELP
2125
+
2126
+ twig-buils
2127
+ ===========
2128
+
2129
+ Manage qa cloudformation stack creation
2130
+
2131
+ Synopsis
2132
+ --------
2133
+
2134
+ twig build #command
2135
+
2136
+ Description
2137
+ -----------
2138
+
2139
+ #command #command description
2140
+
2141
+ HELP
2142
+ end
2143
+
2144
+ args = ARGV.dup
2145
+
2146
+ if args.include?('--help')
2147
+ puts help_content
2148
+ exit
2149
+ end
2150
+
2151
+ args.delete('no-gem-update')
2152
+
2153
+ Build.new().execute!(args)