prima-twig 0.41.6 → 0.42.0

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