cloudformation-tool 1.5.21 → 1.5.23

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: 2b03dcf87c0e2624b175617f9be7bdb7fa578ad2e6456dbca5c0c322f79cd986
4
- data.tar.gz: 65f22b87544bf8ddb4eda12547b6e8573a80c3b51941589cb694fe798e006532
3
+ metadata.gz: 87a66ee7654d39788f1151140758db55e1b4683e6961c396077ac7b8d39e70a0
4
+ data.tar.gz: 01d507f67d198d3802e81909393dba0aaadb479251d08d0331489c5c11f1fa00
5
5
  SHA512:
6
- metadata.gz: fab50d710540eea00057c76adf1dd21851fbf8b4cd02e42c8aab0f0308b718bd95ab526fa27c9e1e4ca6f5bb649cb269d85c72f8fb49946821197cdc1d8eb72a
7
- data.tar.gz: c53f91ac78233d6ada769a856dc4b7e8a66dfd1003cdc33e48e823e71a222ff574028f91e8534af05d72322de7749b3a594520435e91ba01ee77bbd64909a3ce
6
+ metadata.gz: e39a2d3e1c8ec9e45f3065d7f17ebf15c261141ff49c109674cb5b5409005cb1ce64afea6f1a552eda58b448f03c74d62d6e3684c5896f3addb6b839cbe38835
7
+ data.tar.gz: 74e10ab19344214e8ffe8bbd237f50b7648426e48df5338f1694e581f0a72f7718706442cc085497781fda9c4c5734047452610666f579f3b20d9f71fcc36415
@@ -24,7 +24,7 @@ module CloudFormationTool
24
24
  end
25
25
 
26
26
  def region
27
- @region
27
+ @region || super
28
28
  end
29
29
 
30
30
  def delete
@@ -86,6 +86,47 @@ module CloudFormationTool
86
86
  end
87
87
  end
88
88
 
89
+ def preview_changes(template, params = {})
90
+ @template = CloudFormation.parse(template).to_yaml(params)
91
+ url = upload(make_filename('yaml'), @template, gzip: false)
92
+ log "Previewing stack changes for '#{name}' from '#{template}' params #{params.inspect}"
93
+ valid_check do
94
+ resp = awscf.create_change_set({
95
+ stack_name: @name,
96
+ template_url: url,
97
+ capabilities: %w(CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND),
98
+ on_stack_failure: "DO_NOTHING", ##"ROLLBACK",
99
+ parameters: params.collect do |k,v|
100
+ {
101
+ parameter_key: k.to_s,
102
+ parameter_value: v.to_s,
103
+ use_previous_value: false,
104
+ }
105
+ end,
106
+ change_set_name: "preview-#{@name}-dryrun"
107
+ })
108
+ change_set_id = resp.id
109
+ loop do
110
+ resp = awscf.describe_change_set({change_set_name: change_set_id })
111
+ break unless %w( CREATE_PENDING CREATE_IN_PROGRESS ).include? resp.status
112
+ end
113
+
114
+ puts "Update preview for '#{name}':"
115
+ puts "Status: #{resp.execution_status} | #{resp.status} | #{resp.status_reason}"
116
+ puts "---"
117
+ puts "Resource Changes:"
118
+ resp.changes.each do |change|
119
+ puts format_resource(change.resource_change, %w(
120
+ resource_type:40
121
+ logical_resource_id:42
122
+ action
123
+ )).join(" ") + " => " + change.resource_change.details.collect { |d| "#{d.evaluation}:#{d.target}" }.join(", ")
124
+ end
125
+
126
+ awscf.delete_change_set({ change_set_name: change_set_id })
127
+ end
128
+ end
129
+
89
130
  def stack_id
90
131
  @stack_id ||= awscf.describe_stacks(stack_name: @name).stacks.first.stack_id
91
132
  end
@@ -198,19 +239,11 @@ module CloudFormationTool
198
239
  until done
199
240
  reverse_each do |ev|
200
241
  next if @seenev.add?(ev.event_id).nil?
201
- text = "#{ev.timestamp.strftime "%Y-%m-%d %H:%M:%S"}| " + %w(
242
+ text = "#{ev.timestamp.strftime "%Y-%m-%d %H:%M:%S"}| " + format_resource(ev, %w(
202
243
  resource_type:40
203
244
  logical_resource_id:42
204
245
  resource_status
205
- ).collect { |field|
206
- (name,size) = field.split(":")
207
- size ||= 1
208
- (if name == 'logical_resource_id' and ev.stack_name != self.name
209
- logical_nested_stack_name(ev.stack_name) + "|"
210
- else
211
- ''
212
- end + ev.send(name.to_sym)).ljust(size.to_i, ' ')
213
- }.join(" ")
246
+ )).join(" ")
214
247
  text += " " + ev.resource_status_reason if ev.resource_status =~ /_FAILED/
215
248
  if start_time.nil? or start_time < ev.timestamp
216
249
  puts text
@@ -225,6 +258,18 @@ module CloudFormationTool
225
258
  end
226
259
  end
227
260
 
261
+ def format_resource(res, columns)
262
+ columns.collect { |field|
263
+ (name,size) = field.split(":")
264
+ size ||= 1
265
+ (if name == 'logical_resource_id' and res.respond_to?(:stack_name) and res.stack_name != self.name
266
+ logical_nested_stack_name(res.stack_name) + "|"
267
+ else
268
+ ''
269
+ end + res.send(name.to_sym)).ljust(size.to_i, ' ')
270
+ }
271
+ end
272
+
228
273
  def logical_nested_stack_name(phys_name)
229
274
  @nested_stacks[phys_name] || 'unknown'
230
275
  end
@@ -1,3 +1,3 @@
1
1
  module CloudFormationTool
2
- VERSION = '1.5.21'
2
+ VERSION = '1.5.23'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudformation-tool
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.21
4
+ version: 1.5.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oded Arbel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-08-03 00:00:00.000000000 Z
11
+ date: 2025-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64