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 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