prima-twig 0.54.235 → 0.55.0
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 +4 -4
- data/bin/twig-deploy +69 -14
- data/bin/twig-feature +2408 -48
- data/bin/twig-update-ami +29 -29
- data/lib/prima_aws_client.rb +1 -159
- data/lib/prima_twig.rb +2 -4
- metadata +5 -118
- data/bin/twig-build +0 -2152
data/bin/twig-update-ami
CHANGED
@@ -5,7 +5,7 @@ require_relative '../lib/prima_twig.rb'
|
|
5
5
|
require_relative '../lib/prima_aws_client.rb'
|
6
6
|
require 'launchy'
|
7
7
|
require 'json'
|
8
|
-
require 'aws-sdk
|
8
|
+
require 'aws-sdk'
|
9
9
|
|
10
10
|
class TwigUpdateAmi
|
11
11
|
include Command
|
@@ -29,8 +29,8 @@ class TwigUpdateAmi
|
|
29
29
|
Dir.chdir 'ami'
|
30
30
|
update_instance_name(ami_id, ami_name, ami_description, ami_template)
|
31
31
|
output 'running packer update (this could take some time)'.light_green
|
32
|
-
new_ami_id = update_packer(ami_template
|
33
|
-
# new_ami_id = 'ami-
|
32
|
+
new_ami_id = update_packer(ami_template)
|
33
|
+
# new_ami_id = 'ami-000e38f3a919824ae'
|
34
34
|
Dir.chdir '..'
|
35
35
|
stop_if(new_ami_id.to_s.empty?, 'Failed to generate AMI!'.red)
|
36
36
|
output "new ami id: #{new_ami_id}"
|
@@ -50,33 +50,33 @@ class TwigUpdateAmi
|
|
50
50
|
if stack.include?('qa')
|
51
51
|
output "skipping stack #{stack} because is a qa"
|
52
52
|
next
|
53
|
-
|
53
|
+
elsif stack.include?('batch')
|
54
|
+
stack_parameters = update_stack_parameters(get_stack_parameters(stack),
|
55
|
+
[
|
56
|
+
{ parameter_key: 'AMIID', parameter_value: new_ami_id }
|
57
|
+
]
|
58
|
+
)
|
59
|
+
update_stack(stack, get_stack_template(stack), stack_parameters)
|
60
|
+
elsif stack.include?('fleet')
|
54
61
|
stack_tags = tags_to_hashes(get_stack_tags(stack))
|
55
62
|
stack_tags['TemplateVersion'] = stack_tags['TemplateVersion'].to_i + 1
|
56
63
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
{ parameter_key: 'DesiredCapacity', parameter_value: get_desired_capacity(stack).to_s },
|
74
|
-
{ parameter_key: 'TemplateVersion', parameter_value: stack_tags['TemplateVersion'].to_s }
|
75
|
-
]
|
76
|
-
)
|
77
|
-
stack_template = File.read("./cloudformation/stacks/asg/#{stack.to_s.split("/")[1]}.yml")
|
78
|
-
end
|
79
|
-
update_stack(stack, stack_template, stack_parameters, hashes_to_tags(stack_tags))
|
64
|
+
stack_parameters = update_stack_parameters(get_stack_parameters(stack),
|
65
|
+
[
|
66
|
+
{ parameter_key: 'AMIID', parameter_value: new_ami_id },
|
67
|
+
{ parameter_key: 'DesiredCapacity', parameter_value: get_desired_capacity(stack).to_s },
|
68
|
+
{ parameter_key: 'TemplateVersion', parameter_value: stack_tags['TemplateVersion'].to_s }
|
69
|
+
]
|
70
|
+
)
|
71
|
+
update_stack(stack, get_stack_template(stack), stack_parameters, hashes_to_tags(stack_tags))
|
72
|
+
else # autoscaling group normali come ania-tools
|
73
|
+
stack_parameters = update_stack_parameters(get_stack_parameters(stack),
|
74
|
+
[
|
75
|
+
{ parameter_key: 'AMIID', parameter_value: new_ami_id },
|
76
|
+
{ parameter_key: 'DesiredCapacity', parameter_value: get_desired_capacity(stack).to_s }
|
77
|
+
]
|
78
|
+
)
|
79
|
+
update_stack(stack, get_stack_template(stack), stack_parameters)
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -149,8 +149,8 @@ class TwigUpdateAmi
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
-
def update_packer(json_filename
|
153
|
-
execute_command "
|
152
|
+
def update_packer(json_filename)
|
153
|
+
execute_command "packer build -var datadog_apikey=`biscuit get -f ../configs/secrets/common.yml common_production_apikey_datadog` -var github_token=`biscuit get -f ../configs/secrets/common.yml common_private_repo_github_token` -var drone_key=\"`biscuit get -f ../configs/secrets/common.yml drone_license_key`\" -machine-readable ./#{json_filename} | tee build.log"
|
154
154
|
`grep 'artifact,0,id' build.log | cut -d, -f6 | cut -d: -f2`.sub(/\n/, '')
|
155
155
|
end
|
156
156
|
|
data/lib/prima_aws_client.rb
CHANGED
@@ -1,11 +1,4 @@
|
|
1
|
-
require 'aws-sdk
|
2
|
-
require 'aws-sdk-batch'
|
3
|
-
require 'aws-sdk-cloudformation'
|
4
|
-
require 'aws-sdk-cloudfront'
|
5
|
-
require 'aws-sdk-ec2'
|
6
|
-
require 'aws-sdk-ecs'
|
7
|
-
require 'aws-sdk-elasticloadbalancingv2'
|
8
|
-
require 'aws-sdk-s3'
|
1
|
+
require 'aws-sdk'
|
9
2
|
require 'colorize'
|
10
3
|
#
|
11
4
|
module PrimaAwsClient
|
@@ -25,14 +18,6 @@ module PrimaAwsClient
|
|
25
18
|
@ec2 ||= Aws::EC2::Client.new
|
26
19
|
end
|
27
20
|
|
28
|
-
def alb_client
|
29
|
-
@alb ||= Aws::ElasticLoadBalancingV2::Client.new
|
30
|
-
end
|
31
|
-
|
32
|
-
def ecs_client
|
33
|
-
@ecs ||= Aws::ECS::Client.new
|
34
|
-
end
|
35
|
-
|
36
21
|
def stack_list
|
37
22
|
stacks = []
|
38
23
|
next_token = ''
|
@@ -219,24 +204,6 @@ module PrimaAwsClient
|
|
219
204
|
output "\nStack #{stack_name} pronto!\n".green
|
220
205
|
end
|
221
206
|
|
222
|
-
def wait_for_stack_removal(stack_name)
|
223
|
-
ready = false
|
224
|
-
sleep_seconds = 13
|
225
|
-
sleep 10
|
226
|
-
output "Attendo che lo stack #{stack_name} finisca di essere cancellato...\n".yellow
|
227
|
-
while !ready
|
228
|
-
ready = true if stack_deleted?(stack_name)
|
229
|
-
seconds_elapsed = 0
|
230
|
-
loop do
|
231
|
-
break if seconds_elapsed >= sleep_seconds
|
232
|
-
print '.'.yellow; STDOUT.flush
|
233
|
-
sleep 1
|
234
|
-
seconds_elapsed += 1
|
235
|
-
end
|
236
|
-
end
|
237
|
-
output "\nStack #{stack_name} eliminato!\n".green
|
238
|
-
end
|
239
|
-
|
240
207
|
def get_stack_tags(name)
|
241
208
|
begin
|
242
209
|
resp = cf_client.describe_stacks(stack_name: name)
|
@@ -300,23 +267,6 @@ module PrimaAwsClient
|
|
300
267
|
['CREATE_COMPLETE', 'UPDATE_COMPLETE', 'UPDATE_ROLLBACK_COMPLETE', 'ROLLBACK_COMPLETE'].include? stack_status
|
301
268
|
end
|
302
269
|
|
303
|
-
def stack_deleted?(stack_name, failed_statuses = ['ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_FAILED', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS'])
|
304
|
-
begin
|
305
|
-
resp = cf_client.describe_stacks(
|
306
|
-
stack_name: stack_name
|
307
|
-
)
|
308
|
-
stack_status = resp.stacks[0].stack_status
|
309
|
-
rescue Aws::CloudFormation::Errors::Throttling => e
|
310
|
-
print 'Throttling'.red; STDOUT.flush
|
311
|
-
return false
|
312
|
-
rescue Aws::CloudFormation::Errors::ValidationError => e
|
313
|
-
print 'Stack deleted'
|
314
|
-
return true
|
315
|
-
end
|
316
|
-
raise "The stack #{stack_name} errored out" if failed_statuses.include? stack_status
|
317
|
-
['DELETE_COMPLETE'].include? stack_status
|
318
|
-
end
|
319
|
-
|
320
270
|
def artifact_exists?(bucket, path)
|
321
271
|
resp = s3_client.list_objects(
|
322
272
|
bucket: bucket,
|
@@ -337,29 +287,6 @@ module PrimaAwsClient
|
|
337
287
|
output "#{s3_bucket}/#{destination_path} uploadato con successo!\n".green
|
338
288
|
end
|
339
289
|
|
340
|
-
def wait_for_artifact(bucket, path)
|
341
|
-
ready = artifact_exists?(bucket, path)
|
342
|
-
sleep_seconds = 13
|
343
|
-
output "Attendo che sia pronto l'artefatto #{path}...\n".yellow
|
344
|
-
retries = 0
|
345
|
-
while !ready
|
346
|
-
ready = true if artifact_exists?(bucket, path)
|
347
|
-
seconds_elapsed = 0
|
348
|
-
loop do
|
349
|
-
break if seconds_elapsed >= sleep_seconds
|
350
|
-
print '.'.yellow; STDOUT.flush
|
351
|
-
sleep 1
|
352
|
-
seconds_elapsed += 1
|
353
|
-
end
|
354
|
-
retries += 1
|
355
|
-
if retries > 150
|
356
|
-
output "\n Timeout raggiunto aspettando #{path}\n".red
|
357
|
-
exit
|
358
|
-
end
|
359
|
-
end
|
360
|
-
output "\nArtefatto #{path} creato!\n".green
|
361
|
-
end
|
362
|
-
|
363
290
|
def list_import_stacks(export_name)
|
364
291
|
stacks = []
|
365
292
|
next_token = ''
|
@@ -380,91 +307,6 @@ module PrimaAwsClient
|
|
380
307
|
stacks
|
381
308
|
end
|
382
309
|
|
383
|
-
def describe_stack_resource(cluster_stack_name, logical_resource_id)
|
384
|
-
begin
|
385
|
-
resp = cf_client.describe_stack_resource({stack_name: cluster_stack_name, logical_resource_id: logical_resource_id})
|
386
|
-
rescue Aws::CloudFormation::Errors::Throttling => e
|
387
|
-
output 'Throttling, retrying in 15 seconds'.red
|
388
|
-
sleep 15
|
389
|
-
resp = describe_stack_resource(cluster_stack_name, logical_resource_id)
|
390
|
-
end
|
391
|
-
end
|
392
|
-
|
393
|
-
def describe_instances(instance_ids)
|
394
|
-
begin
|
395
|
-
resp = ec2_client.describe_instances({instance_ids: instance_ids})
|
396
|
-
rescue Aws::CloudFormation::Errors::Throttling => e
|
397
|
-
output 'Throttling, retrying in 15 seconds'.red
|
398
|
-
sleep 15
|
399
|
-
resp = describe_instances(instance_ids)
|
400
|
-
end
|
401
|
-
end
|
402
|
-
|
403
|
-
def describe_auto_scaling_groups(auto_scaling_group_names, max_records)
|
404
|
-
begin
|
405
|
-
resp = asg_client.describe_auto_scaling_groups({
|
406
|
-
auto_scaling_group_names: auto_scaling_group_names,
|
407
|
-
max_records: max_records
|
408
|
-
})
|
409
|
-
rescue Aws::CloudFormation::Errors::Throttling => e
|
410
|
-
output 'Throttling, retrying in 15 seconds'.red
|
411
|
-
sleep 15
|
412
|
-
resp = describe_auto_scaling_groups(auto_scaling_group_names, max_records)
|
413
|
-
end
|
414
|
-
end
|
415
|
-
|
416
|
-
def describe_load_balancers(load_balancer_arns)
|
417
|
-
begin
|
418
|
-
resp = alb_client.describe_load_balancers({load_balancer_arns: load_balancer_arns})
|
419
|
-
rescue Aws::CloudFormation::Errors::Throttling => e
|
420
|
-
output 'Throttling, retrying in 15 seconds'.red
|
421
|
-
sleep 15
|
422
|
-
resp = describe_load_balancers(load_balancer_arns)
|
423
|
-
end
|
424
|
-
end
|
425
|
-
|
426
|
-
def update_ecs_service(cluster, service, deployment_configuration)
|
427
|
-
begin
|
428
|
-
resp = ecs_client.update_service(
|
429
|
-
cluster: cluster,
|
430
|
-
service: service,
|
431
|
-
deployment_configuration: deployment_configuration
|
432
|
-
)
|
433
|
-
rescue Aws::CloudFormation::Errors::Throttling => e
|
434
|
-
output 'Throttling, retrying in 15 seconds'.red
|
435
|
-
sleep 15
|
436
|
-
resp = update_ecs_service(cluster, service, deployment_configuration)
|
437
|
-
end
|
438
|
-
end
|
439
|
-
|
440
|
-
def describe_ecs_tasks(cluster, tasks)
|
441
|
-
begin
|
442
|
-
resp = ecs_client.describe_tasks({
|
443
|
-
cluster: cluster,
|
444
|
-
tasks: tasks
|
445
|
-
})
|
446
|
-
rescue Aws::CloudFormation::Errors::Throttling => e
|
447
|
-
output 'Throttling, retrying in 15 seconds'.red
|
448
|
-
sleep 15
|
449
|
-
resp = describe_ecs_tasks(cluster, tasks)
|
450
|
-
end
|
451
|
-
end
|
452
|
-
|
453
|
-
def run_ecs_task(cluster, task_definition, overrides, count)
|
454
|
-
begin
|
455
|
-
resp = ecs_client.run_task({
|
456
|
-
cluster: cluster,
|
457
|
-
task_definition: task_definition,
|
458
|
-
overrides: overrides,
|
459
|
-
count: count
|
460
|
-
})
|
461
|
-
rescue Aws::CloudFormation::Errors::Throttling => e
|
462
|
-
output 'Throttling, retrying in 15 seconds'.red
|
463
|
-
sleep 15
|
464
|
-
resp = run_ecs_task(cluster, task_definition, overrides, count)
|
465
|
-
end
|
466
|
-
end
|
467
|
-
|
468
310
|
def get_autoscaling_capacity(asg_name)
|
469
311
|
resp = asg_client.describe_auto_scaling_groups(auto_scaling_group_names: [asg_name])
|
470
312
|
resp.auto_scaling_groups[0].desired_capacity
|
data/lib/prima_twig.rb
CHANGED
@@ -4,7 +4,7 @@ require 'octokit'
|
|
4
4
|
require 'yaml'
|
5
5
|
require 'rugged'
|
6
6
|
require 'highline/import'
|
7
|
-
require 'aws-sdk
|
7
|
+
require 'aws-sdk'
|
8
8
|
require 'rubyflare'
|
9
9
|
|
10
10
|
class Prima
|
@@ -20,9 +20,7 @@ class Prima
|
|
20
20
|
@twig = Twig.new(:read_options => true, :max_days_old => 30)
|
21
21
|
unless has_config?
|
22
22
|
if File.exist?('../prima/twig.yml')
|
23
|
-
|
24
|
-
elsif File.exist?('/tmp/twig.yml')
|
25
|
-
`cp /tmp/twig.yml .`
|
23
|
+
`cp ../prima/twig.yml .`
|
26
24
|
else
|
27
25
|
generate_config
|
28
26
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prima-twig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.55.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matteo Giachino
|
@@ -14,122 +14,10 @@ authors:
|
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
|
-
date:
|
17
|
+
date: 2019-11-18 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
|
-
name: aws-sdk
|
21
|
-
requirement: !ruby/object:Gem::Requirement
|
22
|
-
requirements:
|
23
|
-
- - "~>"
|
24
|
-
- !ruby/object:Gem::Version
|
25
|
-
version: '1'
|
26
|
-
type: :runtime
|
27
|
-
prerelease: false
|
28
|
-
version_requirements: !ruby/object:Gem::Requirement
|
29
|
-
requirements:
|
30
|
-
- - "~>"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '1'
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: aws-sdk-batch
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '1'
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '1'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: aws-sdk-cloudformation
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - "~>"
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '1'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '1'
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: aws-sdk-cloudfront
|
63
|
-
requirement: !ruby/object:Gem::Requirement
|
64
|
-
requirements:
|
65
|
-
- - "~>"
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: '1'
|
68
|
-
type: :runtime
|
69
|
-
prerelease: false
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - "~>"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: '1'
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: aws-sdk-ec2
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - "~>"
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '1'
|
82
|
-
type: :runtime
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - "~>"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '1'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: aws-sdk-ecs
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
92
|
-
requirements:
|
93
|
-
- - "~>"
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '1'
|
96
|
-
type: :runtime
|
97
|
-
prerelease: false
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - "~>"
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '1'
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: aws-sdk-elasticloadbalancingv2
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '1'
|
110
|
-
type: :runtime
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - "~>"
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '1'
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: aws-sdk-s3
|
119
|
-
requirement: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - "~>"
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: '1'
|
124
|
-
type: :runtime
|
125
|
-
prerelease: false
|
126
|
-
version_requirements: !ruby/object:Gem::Requirement
|
127
|
-
requirements:
|
128
|
-
- - "~>"
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: '1'
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
-
name: aws-sdk-core
|
20
|
+
name: aws-sdk
|
133
21
|
requirement: !ruby/object:Gem::Requirement
|
134
22
|
requirements:
|
135
23
|
- - "~>"
|
@@ -285,7 +173,6 @@ dependencies:
|
|
285
173
|
description: Our tools to manage git and github
|
286
174
|
email: matteo.giachino@prima.it
|
287
175
|
executables:
|
288
|
-
- twig-build
|
289
176
|
- twig-circle
|
290
177
|
- twig-deploy
|
291
178
|
- twig-feature
|
@@ -297,7 +184,6 @@ executables:
|
|
297
184
|
extensions: []
|
298
185
|
extra_rdoc_files: []
|
299
186
|
files:
|
300
|
-
- bin/twig-build
|
301
187
|
- bin/twig-circle
|
302
188
|
- bin/twig-deploy
|
303
189
|
- bin/twig-feature
|
@@ -328,7 +214,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
328
214
|
- !ruby/object:Gem::Version
|
329
215
|
version: '0'
|
330
216
|
requirements: []
|
331
|
-
|
217
|
+
rubyforge_project:
|
218
|
+
rubygems_version: 2.7.8
|
332
219
|
signing_key:
|
333
220
|
specification_version: 4
|
334
221
|
summary: The Prima twig toolbelt
|