prima-twig 0.41.6 → 0.42.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1371ab780a4dc8d560ef47a40e45ab7702dbe491ab78f377d71bdde87b12378
4
- data.tar.gz: 6baaa2686dd392fd154438b1a3a6e6cfa91f9947f4792dc3a28eaf8fa479d43a
3
+ metadata.gz: 2bba0686dbbaea6743f6ae770b2337067e127f50d38c9659922f34d2b55aa38e
4
+ data.tar.gz: 61986a6d3dd0e96bda0063164212130b3020c54cb48794176b6af5fc1072f531
5
5
  SHA512:
6
- metadata.gz: 44cb5ba411398c8ae3d7837c9f7ac6b7dad85cb2561e677c635a805c7d18e4202a3f8a66173cc3f5e216a18a76b5d6de0decbfa9e13c57e96cd45d8c00bce98c
7
- data.tar.gz: fc6e5a40e2eaf32c42f983c1f8a3fa50af2f0ed739fe6036f6b7de3101d1c74503dc86f45f406964e6284a0268d060318dab91faed8f26f84a41117ed6fe37c8
6
+ metadata.gz: 84d9573bfa3aa39a9003336d7312e19187e4432da927087b1a9681666f05263fcc40bf379c2fb25e76d20157f5861ca134ed1090f2afe9eaa4c35c2b736aac95
7
+ data.tar.gz: 878c964e52e8e24f7ebbef73a60c8df821bd78427b9e99551e9d8e9d68f58a348ceaaddd0bd5f342b1e605c3112dc671ab655fc388dc136cc3032e8e209c41ef
data/bin/twig-feature CHANGED
@@ -2684,7 +2684,7 @@ class Release
2684
2684
  exec_step 'prepare-docker-compose --directory backoffice && cp docker-compose-qainit.yml docker-compose.yml'
2685
2685
  [
2686
2686
  "docker-compose build",
2687
- "docker-compose run -w $PWD -e PHANTOMJS_BIN=$PWD/node_modules/grunt-selenium-webdriver/node_modules/phantomjs/lib/phantom/bin/phantomjs web 'sed -i \"s/web-qa-url/#{web_qa_host}/g\" Gruntfile.js && sed -i \"s/web-qa-ri-url/#{webri_qa_host}/g\" Gruntfile.js && sed -i \"s/qa-ip/#{ip_qa_host}/g\" Gruntfile.js && sudo npm install -g puppeteer --unsafe-perm=true --allow-root && bower install --allow-root --config.interactive=false && grunt qa'"
2687
+ "docker-compose run -w $PWD -e PHANTOMJS_BIN=$PWD/node_modules/grunt-selenium-webdriver/node_modules/phantomjs/lib/phantom/bin/phantomjs web 'sed -i \"s/web-qa-url/#{web_qa_host}/g\" Gruntfile.js && sed -i \"s/web-qa-ri-url/#{webri_qa_host}/g\" Gruntfile.js && sed -i \"s/qa-ip/#{ip_qa_host}/g\" Gruntfile.js && npm install && bower install --allow-root --config.interactive=false && grunt qa'"
2688
2688
  ].each do |cmd|
2689
2689
  execute_command cmd
2690
2690
  end
data/bin/twig-update-ami CHANGED
@@ -15,68 +15,103 @@ class TwigUpdateAmi
15
15
  exec "gem update prima-twig && twig update-ami #{ARGV.join ' '}" unless `gem outdated`.lines.grep(/^prima-twig \(.*\)/).empty?
16
16
  @s3 = Aws::S3::Client.new
17
17
  @s3_bucket = 'prima-deploy'
18
- @instances_production = JSON.parse File.read('../twig-binaries/cloudformation_prod.json')
19
- @instances_staging = JSON.parse File.read('../twig-binaries/cloudformation_staging.json')
18
+ @templates_base_url = "https://s3-eu-west-1.amazonaws.com"
20
19
  end
21
20
 
22
21
  def execute!(args)
23
- if args[3] == 'staging'
24
- update_amis args[0], args[1], args[2], [@instances_staging]
25
- else
26
- update_amis args[0], args[1], args[2], [@instances_production] #[@instances_staging, @instances_production]
27
- end
22
+ update_amis(args[0], args[1], args[2], args[3], args[4])
28
23
  end
29
24
 
30
25
  private
31
26
 
32
- def update_amis(ami_id, ami_name, ami_description, instances)
33
- instances.each do |instance_class|
34
- instance_class['amis'].each do |ami|
35
- output 'updating instance definition'.light_green
36
- Dir.chdir 'ami'
37
- update_instance_name(ami_id, ami_name, ami_description, ami['json'])
38
- output 'running packer update (this could take some time)'.light_green
39
- new_ami_id = update_packer ami['json']
40
- Dir.chdir '..'
41
- output 'new ami id: ' + new_ami_id
42
- stop_if new_ami_id.to_s.empty?, 'Failed to generate AMI!'
43
- unless ami['stacks'].nil?
44
- ami['stacks'].each do |stack|
45
- output 'updating ' + stack['yaml_filename'] + ' and copying onto s3'
46
- update_yml_files(new_ami_id, stack['yaml_filename'])
47
- copy_yml_files_to_s3(stack['yaml_filename'], stack['s3_key'])
48
- output 'updating stack on cloudformation'
49
- if stack['stack_name'] and stack_exists?(stack['stack_name'])
50
- stack_parameters = get_stack_parameters(stack['stack_name'])
51
- stack_parameters.each do |param|
52
- if param.parameter_key.eql?('DesiredCapacity')
53
- desired_capacity = get_desired_capacity(stack['stack_name'])
54
- desired_capacity.nil? ? break : param.parameter_value.sub!(/[0-9]+/, desired_capacity.to_s)
55
- break
56
- end
57
- end
58
- update_stack_url(stack['stack_name'], stack['template_url'], stack_parameters)
59
- else
60
- output "skipping #{stack['yaml_filename']} because is not active on cloudformation"
61
- end
62
- end
27
+ def update_amis(ami_template, ami_id, ami_name, ami_description, env)
28
+ output "updating instance definition #{ami_template}".light_green
29
+ Dir.chdir 'ami'
30
+ update_instance_name(ami_id, ami_name, ami_description, ami_template)
31
+ output 'running packer update (this could take some time)'.light_green
32
+ new_ami_id = update_packer(ami_template)
33
+ Dir.chdir '..'
34
+ stop_if(new_ami_id.to_s.empty?, 'Failed to generate AMI!'.red)
35
+ output "new ami id: #{new_ami_id}"
36
+
37
+ output 'searching for ami to update...'
38
+ ami_mappings = JSON.parse(@s3.get_object(bucket: @s3_bucket, key: "ami/ami-mappings.json")["body"].read())
39
+ old_amis = update_ami_mappings(ami_mappings, ami_template, env, new_ami_id)
40
+ stop_if(old_amis.empty?, "No ami to update! No #{ami_template} in env #{env}, exiting".yellow)
41
+
42
+ output 'retrieving stacks that uses old ami ids'
43
+ exports = list_exports()
44
+ stacks = get_stacks_from_exports(exports, old_amis)
45
+ stop_if(stacks.empty?, "No stack to update found! This means that ami-mapping file is not in sync, please check manually")
46
+
47
+ stacks.each do |stack|
48
+ output "stack to update: #{stack}"
49
+ if stack.include?('batch')
50
+ stack_parameters = update_stack_parameters(stack,
51
+ [
52
+ { parameter_key: 'AMIID', parameter_value: new_ami_id }
53
+ ]
54
+ )
55
+ update_batch_compute_environment(stack, get_stack_template(stack), stack_parameters, tags_to_hashes(get_stack_tags(stack)), env, old_amis)
56
+ else
57
+ stack_parameters = update_stack_parameters(stack,
58
+ [
59
+ { parameter_key: 'AMIID', parameter_value: new_ami_id },
60
+ { parameter_key: 'DesiredCapacity', parameter_value: get_desired_capacity(stack).to_s }
61
+ ]
62
+ )
63
+ if stack.include?('spotfleet')
64
+ update_spotfleet(stack, get_stack_template(stack), stack_parameters, tags_to_hashes(get_stack_tags(stack)))
65
+ else
66
+ update_stack(stack, get_stack_template(stack), stack_parameters)
63
67
  end
68
+ end
69
+ end
64
70
 
65
- unless ami['batch_compute_environments'].nil?
66
- ami['batch_compute_environments'].each do |ce|
67
- update_batch_compute_environment(ce, new_ami_id)
68
- end
69
- end
71
+ stacks.each do |stack|
72
+ wait_for_stack_ready(stack, ['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'])
73
+ end
74
+
75
+ output 'writing new ami mapping'
76
+ File.open("ami/ami-mappings.json", 'w+') do |f|
77
+ mapping_file = JSON.pretty_generate(ami_mappings)
78
+ f.write(mapping_file)
79
+ @s3.put_object(bucket: @s3_bucket, key: "ami/ami-mappings.json", body: mapping_file)
80
+ end
70
81
 
71
- unless ami['stacks'].nil?
72
- ami['stacks'].each do |stack|
73
- if stack['stack_name'] and stack_exists?(stack['stack_name'])
74
- 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'])
75
- end
76
- end
82
+ output 'Update finished! ( ͡° ͜ʖ ͡°)'
83
+ end
84
+
85
+ def get_stacks_from_exports(exports, old_amis)
86
+ stacks = []
87
+ old_amis.each do |old_ami|
88
+ exports.each do |export|
89
+ if export.value.eql?(old_ami)
90
+ stacks.insert(0,export.exporting_stack_id)
77
91
  end
78
92
  end
79
93
  end
94
+ stacks
95
+ end
96
+
97
+ def update_ami_mappings(mappings, ami_template, env, new_ami_id)
98
+ old_values = []
99
+ mappings.each do |item|
100
+ if item['ami_template'].eql?(ami_template) and item['env'].eql?(env)
101
+ old_values.insert(0,item['ami_id'])
102
+ item['ami_id'] = new_ami_id
103
+ end
104
+ end
105
+ old_values.uniq
106
+ end
107
+
108
+ def update_stack_parameters(stack_name, new_parameters)
109
+ stack_parameters = get_stack_parameters(stack_name)
110
+ new_parameters.each do |new_param|
111
+ stack_parameters.reject{ |k| k["parameter_key"] == new_param["parameter_key"] }
112
+ stack_parameters.push(new_param)
113
+ end
114
+ stack_parameters
80
115
  end
81
116
 
82
117
  def update_instance_name(ami_id, ami_name, ami_description, ecs_json_path)
@@ -108,108 +143,91 @@ class TwigUpdateAmi
108
143
  `grep 'artifact,0,id' build.log | cut -d, -f6 | cut -d: -f2`.sub(/\n/, '')
109
144
  end
110
145
 
111
- def update_yml_files(ami_id, yaml_filename)
112
- file_content = File.read yaml_filename
113
- file_content.sub!(/ami-[0-9a-z]{8,17}/, ami_id)
114
- File.open yaml_filename, 'w' do |f|
115
- f.write file_content
116
- end
146
+ def update_body_and_tags(stack_body, stack_tags, old_amis = [])
147
+ if stack_tags['ArtemideTemplatePath'].include?('spotfleet')
148
+ if stack_tags['ArtemideTemplatePath'].include?('ci')
149
+ return
150
+ end
117
151
 
118
- if yaml_filename.include? 'spotfleet'
119
- old_handle = (File.read yaml_filename)[/InstanceReadyWaitHandleUpdate[0-9]+/]
120
- if old_handle
121
- handle_version = old_handle.sub('InstanceReadyWaitHandleUpdate', '').to_i + 1
152
+ stack_tags['SpotFleetHandleVersion'] = stack_tags['SpotFleetHandleVersion'].to_i + 1
153
+ stack_body.gsub!(/InstanceReadyWaitHandleUpdate[0-9]*/, 'InstanceReadyWaitHandleUpdate' + stack_tags['SpotFleetHandleVersion'].to_s)
154
+ stack_body.gsub!(/InstanceReadyWaitConditionUpdate[0-9]*/, 'InstanceReadyWaitConditionUpdate' + stack_tags['SpotFleetHandleVersion'].to_s)
122
155
 
123
- old_condition = (File.read yaml_filename)[/InstanceReadyWaitConditionUpdate[0-9]+/]
124
- condition_version = old_condition.sub('InstanceReadyWaitConditionUpdate', '').to_i + 1
156
+ File.open stack_tags['ArtemideTemplatePath'], 'w' do |f|
157
+ f.write(stack_body)
158
+ @s3.put_object(body: stack_body, bucket: @s3_bucket, key: stack_tags['ArtemideTemplatePath'])
159
+ end
125
160
 
126
- file_content = File.read yaml_filename
127
- file_content.gsub!(old_handle, 'InstanceReadyWaitHandleUpdate' + handle_version.to_s)
128
- file_content.gsub!(old_condition, 'InstanceReadyWaitConditionUpdate' + condition_version.to_s)
161
+ elsif stack_tags['ArtemideTemplatePath'].include?('batch')
162
+ stack_body.gsub!(/(\w+:\s+)!(\w+)/i, '\1QuaCeraUnPuntoEsclamativo\2')
163
+ stack_body_original = stack_body.clone
164
+ ce_name = stack_tags['ComputeEnvironment'].sub(/[0-9]+/, '')
165
+ new_ce_version = stack_tags['ComputeEnvironment'].sub(/[a-zA-Z]*/, '').to_i + 1
166
+ new_ce_name = ce_name + new_ce_version.to_s
167
+ stack_body.gsub!(/#{ce_name}[0-9]*/, new_ce_name)
168
+ stack_body_original.gsub!("QuaCeraUnPuntoEsclamativoRef AMIID", old_amis[0])
169
+ stack_tags['OldComputeEnvironment'] = stack_tags['ComputeEnvironment']
170
+ stack_tags['ComputeEnvironment'] = new_ce_name
171
+
172
+ File.open stack_tags['ArtemideTemplatePath'] + 'new', 'w' do |f|
173
+ f.write(stack_body)
174
+ end
129
175
 
130
- File.open yaml_filename, 'w' do |f|
131
- f.write file_content
132
- end
176
+ yaml_stack_body = YAML.load(stack_body_original)
177
+ yaml_stack_body_new = YAML.load(stack_body)
178
+ yaml_stack_body_merged = (yaml_stack_body.deep_merge(yaml_stack_body_new)).to_yaml.gsub('QuaCeraUnPuntoEsclamativo', '!')
179
+
180
+ File.open(stack_tags['ArtemideTemplatePath'], 'w') do |file|
181
+ file.write yaml_stack_body_merged
182
+ @s3.put_object(body: yaml_stack_body_merged, bucket: @s3_bucket, key: stack_tags['ArtemideTemplatePath'])
133
183
  end
134
184
  end
135
185
  end
136
186
 
137
- def copy_yml_files_to_s3(source, s3_key)
138
- body = File.read source
139
- @s3.put_object(
140
- body: body,
141
- bucket: @s3_bucket,
142
- key: s3_key
143
- )
187
+ def update_spotfleet(stack_name, stack_template, stack_parameters, stack_tags)
188
+ update_body_and_tags(stack_template, stack_tags)
189
+ update_stack_url(stack_name, "#{@templates_base_url}/#{@s3_bucket}/#{stack_tags['ArtemideTemplatePath']}", stack_parameters, hashes_to_tags(stack_tags))
144
190
  end
145
191
 
146
- def update_batch_compute_environment(stack, ami_id)
147
- output 'updating ' + stack['yaml_filename'] + ' to add a new compute environment'
148
-
149
- file_content = File.read stack['yaml_filename']
150
- file_content.gsub!(/(\w+:\s+)!(\w+)/i, '\1QuaCeraUnPuntoEsclamativo\2')
151
- file_content_original = file_content.clone
152
- old_ce_name = file_content[/#{stack['label']}[0-9]*/]
153
- new_ce_version = old_ce_name.sub(stack['label'], '').to_i + 1
154
- new_ce_name = stack['label'] + new_ce_version.to_s
155
- file_content.gsub!(old_ce_name, new_ce_name)
156
- File.open stack['yaml_filename'] + 'new', 'w' do |f|
157
- f.write file_content
158
- end
159
- update_yml_files(ami_id, stack['yaml_filename'] + 'new')
192
+ def update_batch_compute_environment(stack_name, stack_body, stack_parameters, stack_tags, env, old_amis)
193
+ output "updating #{stack_name} to add a new compute environment"
194
+ update_body_and_tags(stack_body, stack_tags, old_amis)
195
+ output 'updating stack on cloudformation (step 1)'
196
+ update_stack_url(stack_name, "#{@templates_base_url}/#{@s3_bucket}/#{stack_tags['ArtemideTemplatePath']}", stack_parameters, hashes_to_tags(stack_tags))
197
+ wait_for_stack_ready(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
198
 
161
- stack_body = YAML.load(file_content_original)
162
- stack_body_new = YAML.load_file(stack['yaml_filename'] + 'new')
163
- stack_body_merged = stack_body.deep_merge stack_body_new
164
- File.open(stack['yaml_filename'], 'w') do |file|
165
- file.write stack_body_merged.to_yaml.gsub('QuaCeraUnPuntoEsclamativo', '!')
166
- end
167
-
168
- output 'updating stack on cloudformation, (step 1)'
169
- copy_yml_files_to_s3(stack['yaml_filename'], stack['s3_key'])
170
- if not stack['stack_name'] or not stack_exists?(stack['stack_name'])
171
- return false
172
- end
173
-
174
- update_stack_url(stack['stack_name'], stack['template_url'], get_stack_parameters(stack['stack_name']))
175
- 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'])
176
-
177
- output "retrieving the list of stacks that are currently using the stack #{stack['stack_name']}"
178
- if stack['stack_name'].include?('staging')
179
- job_stacks = list_import_stacks old_ce_name + '-staging'
180
- else
181
- job_stacks = list_import_stacks old_ce_name + '-production'
182
- end
183
- job_stacks = list_import_stacks old_ce_name + '-production'
199
+ output "retrieving the list of stacks that are currently using the stack #{stack_name}"
200
+ job_stacks = list_import_stacks(stack_tags['OldComputeEnvironment'] + "-" + env)
184
201
  job_stacks.each do |job_stack_name|
185
202
  output "updating the stack #{job_stack_name} to use to the new compute environment"
186
- stack_body = get_stack_template(job_stack_name)
187
- stack_parameters = get_stack_parameters(job_stack_name).reject{ |k| k.parameter_key == 'ComputeEnvironmentExportName' }
188
- stack_parameters.push(
189
- {
190
- parameter_key: "ComputeEnvironmentExportName",
191
- parameter_value: new_ce_name
192
- }
203
+ job_stack_parameters = update_stack_parameters(job_stack_name,
204
+ [
205
+ {
206
+ parameter_key: "ComputeEnvironmentExportName",
207
+ parameter_value: stack_tags['ComputeEnvironment']
208
+ }
209
+ ]
193
210
  )
194
- update_stack(job_stack_name, stack_body, stack_parameters)
211
+ update_stack(job_stack_name, get_stack_template(job_stack_name), job_stack_parameters)
195
212
  end
196
213
  job_stacks.each do |job_stack_name|
197
214
  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'])
198
215
  end
199
216
 
200
- file_content = File.read stack['yaml_filename'] + 'new'
201
- File.open stack['yaml_filename'], 'w' do |f|
202
- f.write file_content.gsub('QuaCeraUnPuntoEsclamativo', '!')
217
+ stack_body = File.read(stack_tags['ArtemideTemplatePath'] + 'new').gsub('QuaCeraUnPuntoEsclamativo', '!')
218
+ File.open stack_tags['ArtemideTemplatePath'], 'w' do |f|
219
+ f.write stack_body
220
+ @s3.put_object(body: stack_body, bucket: @s3_bucket, key: stack_tags['ArtemideTemplatePath'])
203
221
  end
222
+ stack_tags.delete('OldComputeEnvironment')
204
223
 
205
- output "updating stack #{stack['stack_name']} on cloudformation to remove the old compute environment"
206
- copy_yml_files_to_s3(stack['yaml_filename'], stack['s3_key'])
207
- update_stack_url(stack['stack_name'], stack['template_url'], get_stack_parameters(stack['stack_name']))
208
- 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'])
224
+ output "updating stack #{stack_name} on cloudformation to remove the old compute environment"
225
+ update_stack_url(stack_name, "#{@templates_base_url}/#{@s3_bucket}/#{stack_tags['ArtemideTemplatePath']}", stack_parameters, hashes_to_tags(stack_tags))
226
+ wait_for_stack_ready(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'])
209
227
 
210
- File.delete(stack['yaml_filename'] + 'new')
228
+ File.delete(stack_tags['ArtemideTemplatePath'] + 'new')
211
229
 
212
- output "cloudformation stack update for #{stack['stack_name']} done!"
230
+ output "cloudformation stack update for #{stack_name} done!"
213
231
  end
214
232
 
215
233
  def help_content
@@ -229,7 +247,7 @@ class TwigUpdateAmi
229
247
  -----------
230
248
 
231
249
  from artemide main folder run
232
- `twig-update-ami ${AMI_ID} ${AMI_NAME} ${AMI_DESCRIPTION}`
250
+ `twig-update-ami ${AMI_TEMPLATE} ${AMI_ID} ${AMI_NAME} ${AMI_DESCRIPTION} ${ENV}`
233
251
 
234
252
  Subcommand for Twig: <http://rondevera.github.io/twig/>
235
253
  Author: Eugenio Laghi <https://github.com/eugeniolaghi>
@@ -40,6 +40,27 @@ module PrimaAwsClient
40
40
  stacks
41
41
  end
42
42
 
43
+ def list_exports
44
+ exports = []
45
+ next_token = ''
46
+ loop do
47
+ print '.'.yellow; STDOUT.flush
48
+ options = next_token != '' ? { next_token: next_token } : {}
49
+ begin
50
+ resp = cf_client.list_exports(options)
51
+ rescue Aws::CloudFormation::Errors::Throttling => e
52
+ output 'Throttling, retrying in 15 seconds'.red
53
+ sleep 15
54
+ resp = cf_client.list_exports(options)
55
+ end
56
+ exports += resp.exports
57
+ break unless resp.next_token
58
+ next_token = resp.next_token
59
+ end
60
+ puts '.'.yellow; STDOUT.flush
61
+ exports
62
+ end
63
+
43
64
  def create_stack(stack_name, stack_body, parameters = [], tags = [], role = nil)
44
65
  cf_args = {
45
66
  stack_name: stack_name,
@@ -273,4 +294,21 @@ module PrimaAwsClient
273
294
  resp = appscaling_client.describe_scalable_targets(service_namespace: 'ec2', resource_ids: ["spot-fleet-request/#{fleet_arn}"])
274
295
  resp.scalable_targets[0].min_capacity
275
296
  end
297
+
298
+ def hashes_to_tags(hashes)
299
+ tags = []
300
+ hkeys = hashes.keys
301
+ hkeys.each do |hkey|
302
+ tags.insert(0, { key: hkey, value: hashes[hkey].to_s })
303
+ end
304
+ tags
305
+ end
306
+
307
+ def tags_to_hashes(tags)
308
+ hash = Hash.new
309
+ tags.each do |tags_obj|
310
+ hash[tags_obj.key] = tags_obj.value
311
+ end
312
+ hash
313
+ end
276
314
  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.41.6
4
+ version: 0.42.0
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: 2018-10-23 00:00:00.000000000 Z
16
+ date: 2018-10-18 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: aws-sdk