prima-twig 0.31.26 → 0.31.27

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e45bd533cec92beec5365e901c842ab76fa0722
4
- data.tar.gz: c9971919e628ce651e41bc2285f5d8841154978c
3
+ metadata.gz: 15d58488fd2bd1b8ace8507528e21c678ef199fe
4
+ data.tar.gz: c5507c00ab0af3c27c68632c1c114b2526f3bf6a
5
5
  SHA512:
6
- metadata.gz: 3147499cd46a41f1f09eaed8fa14574dd7919a1a85164a06f42e9e42006f6bab3098c848e040a0799a6d27302344b5b8c8f55f7c33dd386c7ae950c87fcf1983
7
- data.tar.gz: 4bb1a021366101b5f2372abc5b66371f67e99f719a1236fda0f43a13e86e08eb96d614e05ac616ad32a098d00547f8394b012f0ca5cb8d3330dfe28b901d701c
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['parameters']) if stack['stack_name']
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')
@@ -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
- ['CREATE_COMPLETE', 'UPDATE_COMPLETE', 'UPDATE_ROLLBACK_COMPLETE'].include? resp.stacks[0].stack_status
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.26
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-22 00:00:00.000000000 Z
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.14
217
+ rubygems_version: 2.6.12
218
218
  signing_key:
219
219
  specification_version: 4
220
220
  summary: The Prima twig toolbelt