prima-twig 0.31.26 → 0.31.27
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-update-ami +74 -2
- data/lib/prima_aws_client.rb +20 -4
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 15d58488fd2bd1b8ace8507528e21c678ef199fe
|
|
4
|
+
data.tar.gz: c5507c00ab0af3c27c68632c1c114b2526f3bf6a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '0888937056a71663c941305db96cbc07c637e65d94ea46e7ab0ee991150138b82126a43ac76fd51347dd45d3b33235fddc8a4170c492a237fe32eff470b949d3'
|
|
7
|
+
data.tar.gz: 491142c43b2f111685cdd48dfce54f875d65aa4ee285137466dd49ad072ba4cc4c1f41159c53b0185bf8b6c5d5c06b911aae0bd90e90687e366e03463f53a5b0
|
data/bin/twig-update-ami
CHANGED
|
@@ -7,7 +7,6 @@ require 'launchy'
|
|
|
7
7
|
require 'json'
|
|
8
8
|
require 'aws-sdk'
|
|
9
9
|
|
|
10
|
-
#
|
|
11
10
|
class TwigUpdateAmi
|
|
12
11
|
include Command
|
|
13
12
|
include PrimaAwsClient
|
|
@@ -39,7 +38,13 @@ class TwigUpdateAmi
|
|
|
39
38
|
update_yml_files(new_ami_id, stack['yaml_filename'])
|
|
40
39
|
copy_yml_files_to_s3(stack['yaml_filename'], stack['s3_key'])
|
|
41
40
|
output 'updating stack on cloudformation'
|
|
42
|
-
update_stack_url(stack['stack_name'], stack['template_url'], stack['
|
|
41
|
+
update_stack_url(stack['stack_name'], stack['template_url'], get_stack_parameters(stack['stack_name'])) if stack['stack_name']
|
|
42
|
+
end
|
|
43
|
+
instance['batch_compute_environments'].each do |ce|
|
|
44
|
+
update_batch_compute_environment(ce, new_ami_id)
|
|
45
|
+
end
|
|
46
|
+
instance['stacks'].each do |stack|
|
|
47
|
+
wait_for_stack_ready(stack['stack_name'], ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS', 'UPDATE_ROLLBACK_COMPLETE', 'ROLLBACK_COMPLETE'])
|
|
43
48
|
end
|
|
44
49
|
end
|
|
45
50
|
end
|
|
@@ -98,6 +103,66 @@ class TwigUpdateAmi
|
|
|
98
103
|
)
|
|
99
104
|
end
|
|
100
105
|
|
|
106
|
+
def update_batch_compute_environment(stack, ami_id)
|
|
107
|
+
output 'updating ' + stack['yaml_filename'] + ' to add a new compute environment'
|
|
108
|
+
|
|
109
|
+
file_content = File.read stack['yaml_filename']
|
|
110
|
+
file_content.gsub!(/(\w+:\s+)!(\w+)/i, '\1QuaCeraUnPuntoEsclamativo\2')
|
|
111
|
+
file_content_original = file_content.clone
|
|
112
|
+
old_ce_name = file_content[/BatchComputeEnvironment[0-9]?+/]
|
|
113
|
+
new_ce_version = old_ce_name.sub('BatchComputeEnvironment', '').to_i + 1
|
|
114
|
+
new_ce_name = 'BatchComputeEnvironment' + new_ce_version.to_s
|
|
115
|
+
file_content.gsub!(old_ce_name, new_ce_name)
|
|
116
|
+
File.open stack['yaml_filename'] + 'new', 'w' do |f|
|
|
117
|
+
f.write file_content
|
|
118
|
+
end
|
|
119
|
+
update_yml_files(ami_id, stack['yaml_filename'] + 'new')
|
|
120
|
+
|
|
121
|
+
stack_body = YAML.load(file_content_original)
|
|
122
|
+
stack_body_new = YAML.load_file(stack['yaml_filename'] + 'new')
|
|
123
|
+
stack_body_merged = stack_body.deep_merge stack_body_new
|
|
124
|
+
File.open(stack['yaml_filename'], 'w') do |file|
|
|
125
|
+
file.write stack_body_merged.to_yaml.gsub('QuaCeraUnPuntoEsclamativo', '!')
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
output 'updating stack on cloudformation, (step 1)'
|
|
129
|
+
copy_yml_files_to_s3(stack['yaml_filename'], stack['s3_key'])
|
|
130
|
+
update_stack_url(stack['stack_name'], stack['template_url'], get_stack_parameters(stack['stack_name']))
|
|
131
|
+
wait_for_stack_ready(stack['stack_name'], ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS', 'UPDATE_ROLLBACK_COMPLETE', 'ROLLBACK_COMPLETE'])
|
|
132
|
+
|
|
133
|
+
output "retrieving the list of stacks that are currently using the stack #{stack['stack_name']}"
|
|
134
|
+
job_stacks = list_import_stacks old_ce_name + '-production'
|
|
135
|
+
job_stacks.each do |job_stack_name|
|
|
136
|
+
output "updating the stack #{job_stack_name} to use to the new compute environment"
|
|
137
|
+
stack_body = get_stack_template(job_stack_name)
|
|
138
|
+
stack_parameters = get_stack_parameters(job_stack_name).reject{ |k| k.parameter_key == 'ComputeEnvironmentExportName' }
|
|
139
|
+
stack_parameters.push(
|
|
140
|
+
{
|
|
141
|
+
parameter_key: "ComputeEnvironmentExportName",
|
|
142
|
+
parameter_value: new_ce_name
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
update_stack(job_stack_name, stack_body, stack_parameters)
|
|
146
|
+
end
|
|
147
|
+
job_stacks.each do |job_stack_name|
|
|
148
|
+
wait_for_stack_ready(job_stack_name, ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS', 'UPDATE_ROLLBACK_COMPLETE', 'ROLLBACK_COMPLETE'])
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
file_content = File.read stack['yaml_filename'] + 'new'
|
|
152
|
+
File.open stack['yaml_filename'], 'w' do |f|
|
|
153
|
+
f.write file_content.gsub('QuaCeraUnPuntoEsclamativo', '!')
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
output "updating stack #{stack['stack_name']} on cloudformation to remove the old compute environment"
|
|
157
|
+
copy_yml_files_to_s3(stack['yaml_filename'], stack['s3_key'])
|
|
158
|
+
update_stack_url(stack['stack_name'], stack['template_url'], get_stack_parameters(stack['stack_name']))
|
|
159
|
+
wait_for_stack_ready(stack['stack_name'], ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS', 'UPDATE_ROLLBACK_COMPLETE', 'ROLLBACK_COMPLETE'])
|
|
160
|
+
|
|
161
|
+
File.delete(stack['yaml_filename'] + 'new')
|
|
162
|
+
|
|
163
|
+
output "cloudformation stack update for #{stack['stack_name']} done!"
|
|
164
|
+
end
|
|
165
|
+
|
|
101
166
|
def help_content
|
|
102
167
|
<<-HELP
|
|
103
168
|
|
|
@@ -123,6 +188,13 @@ class TwigUpdateAmi
|
|
|
123
188
|
HELP
|
|
124
189
|
end
|
|
125
190
|
|
|
191
|
+
class ::Hash
|
|
192
|
+
def deep_merge(second)
|
|
193
|
+
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 }
|
|
194
|
+
self.merge(second.to_h, &merger)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
126
198
|
args = ARGV.dup
|
|
127
199
|
|
|
128
200
|
if args.include?('--help')
|
data/lib/prima_aws_client.rb
CHANGED
|
@@ -80,12 +80,12 @@ module PrimaAwsClient
|
|
|
80
80
|
output "Stack #{stack_name} spenta con successo\n".green
|
|
81
81
|
end
|
|
82
82
|
|
|
83
|
-
def wait_for_stack_ready(stack_name)
|
|
83
|
+
def wait_for_stack_ready(stack_name, failed_statuses = ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS'])
|
|
84
84
|
ready = false
|
|
85
85
|
sleep_seconds = 10
|
|
86
86
|
output "Attendo che lo stack #{stack_name} finisca di essere inizializzato...\n".yellow
|
|
87
87
|
while !ready
|
|
88
|
-
ready = true if stack_ready?(stack_name)
|
|
88
|
+
ready = true if stack_ready?(stack_name, failed_statuses)
|
|
89
89
|
seconds_elapsed = 0
|
|
90
90
|
loop do
|
|
91
91
|
break if seconds_elapsed >= sleep_seconds
|
|
@@ -112,11 +112,13 @@ module PrimaAwsClient
|
|
|
112
112
|
resp.template_body
|
|
113
113
|
end
|
|
114
114
|
|
|
115
|
-
def stack_ready?(stack_name)
|
|
115
|
+
def stack_ready?(stack_name, failed_statuses = ['CREATE_FAILED', 'ROLLBACK_IN_PROGRESS', 'ROLLBACK_FAILED', 'DELETE_IN_PROGRESS', 'DELETE_FAILED', 'DELETE_COMPLETE', 'UPDATE_ROLLBACK_FAILED', 'UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS'])
|
|
116
116
|
resp = cf_client.describe_stacks(
|
|
117
117
|
stack_name: stack_name
|
|
118
118
|
)
|
|
119
|
-
|
|
119
|
+
stack_status = resp.stacks[0].stack_status
|
|
120
|
+
raise "The stack #{stack_name} errored out" if failed_statuses.include? stack_status
|
|
121
|
+
['CREATE_COMPLETE', 'UPDATE_COMPLETE', 'UPDATE_ROLLBACK_COMPLETE', 'ROLLBACK_COMPLETE'].include? stack_status
|
|
120
122
|
end
|
|
121
123
|
|
|
122
124
|
def artifact_exists?(bucket, path)
|
|
@@ -136,4 +138,18 @@ module PrimaAwsClient
|
|
|
136
138
|
|
|
137
139
|
output "#{@s3_bucket}/#{destination_path} uploadato con successo!\n".green
|
|
138
140
|
end
|
|
141
|
+
|
|
142
|
+
def list_import_stacks(export_name)
|
|
143
|
+
stacks = []
|
|
144
|
+
next_token = ''
|
|
145
|
+
loop do
|
|
146
|
+
print '.'.yellow; STDOUT.flush
|
|
147
|
+
options = next_token != '' ? { export_name: export_name, next_token: next_token } : {export_name: export_name}
|
|
148
|
+
resp = cf_client.list_imports(options)
|
|
149
|
+
stacks += resp.imports
|
|
150
|
+
break unless resp.next_token
|
|
151
|
+
next_token = resp.next_token
|
|
152
|
+
end
|
|
153
|
+
stacks
|
|
154
|
+
end
|
|
139
155
|
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.31.
|
|
4
|
+
version: 0.31.27
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Matteo Giachino
|
|
@@ -13,7 +13,7 @@ authors:
|
|
|
13
13
|
autorequire:
|
|
14
14
|
bindir: bin
|
|
15
15
|
cert_chain: []
|
|
16
|
-
date: 2017-12-
|
|
16
|
+
date: 2017-12-23 00:00:00.000000000 Z
|
|
17
17
|
dependencies:
|
|
18
18
|
- !ruby/object:Gem::Dependency
|
|
19
19
|
name: aws-sdk
|
|
@@ -214,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
214
214
|
version: '0'
|
|
215
215
|
requirements: []
|
|
216
216
|
rubyforge_project:
|
|
217
|
-
rubygems_version: 2.6.
|
|
217
|
+
rubygems_version: 2.6.12
|
|
218
218
|
signing_key:
|
|
219
219
|
specification_version: 4
|
|
220
220
|
summary: The Prima twig toolbelt
|