cfn-status 0.5.0 → 0.6.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 +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/cfn_status/version.rb +1 -1
- data/lib/cfn_status.rb +35 -24
- metadata +3 -5
- data/bin/console +0 -14
- data/bin/setup +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83ea64eefe541a908445abdcb961258dc4da1214975c4a0e757c8a54e689e554
|
4
|
+
data.tar.gz: f8d9d83fdf7d77b71f93ca9049f46c6d9a054adc4c7c64d8afe9b620e9f7df09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8944265098682315726a329935fea5ab71e6ccef3b02ef786714802d6eae13ab484957d9de132b433e1a8978a18f2deedf79126a7aab6a5e1c1fe704ff234b9
|
7
|
+
data.tar.gz: 2ae96f538b6af56ddcbf48fcc630e3270ae4ad40d61668578e3c69f87e08924d338649e8d5be3e783978306cdecd3ff698793f58eb72d2c5b7c48acd675edc82
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,14 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *loosely* adheres to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [0.6.0] - 2024-04-15
|
7
|
+
- [#8](https://github.com/tongueroo/cfn-status/pull/8) Fix success return
|
8
|
+
- fix success after delete
|
9
|
+
- fix success return after wait
|
10
|
+
- remove bin scripts
|
11
|
+
- @hide_time_took fix
|
12
|
+
- show took false by default
|
13
|
+
|
6
14
|
## [0.5.0] - 2023-12-17
|
7
15
|
- [#6](https://github.com/tongueroo/cfn-status/pull/6) Use events.dig instead of brackets
|
8
16
|
- [#7](https://github.com/tongueroo/cfn-status/pull/7) Add start_index_before_delete option
|
data/lib/cfn_status/version.rb
CHANGED
data/lib/cfn_status.rb
CHANGED
@@ -8,7 +8,7 @@ class CfnStatus
|
|
8
8
|
include AwsService
|
9
9
|
|
10
10
|
attr_reader :events, :stack
|
11
|
-
def initialize(stack_name, options={})
|
11
|
+
def initialize(stack_name, options = {})
|
12
12
|
@stack_name = stack_name
|
13
13
|
@options = options
|
14
14
|
@cfn = options[:cfn] # allow use of different cfn client. can be useful multiple cfn clients and with different regions
|
@@ -53,13 +53,13 @@ class CfnStatus
|
|
53
53
|
def wait
|
54
54
|
# Check for in progress again in case .wait is called from other libraries like s3-antivirus
|
55
55
|
# Showing the event messages when will show old messages which can be confusing.
|
56
|
-
return unless in_progress?
|
56
|
+
return success? unless in_progress?
|
57
57
|
|
58
58
|
puts "Waiting for stack to complete"
|
59
59
|
start_time = Time.now
|
60
60
|
|
61
61
|
refresh_events
|
62
|
-
until completed || @stack_deletion_completed
|
62
|
+
until completed? || @stack_deletion_completed
|
63
63
|
show_events(final: false)
|
64
64
|
end
|
65
65
|
show_events(final: true) # show the final event
|
@@ -67,35 +67,39 @@ class CfnStatus
|
|
67
67
|
if @stack_deletion_completed
|
68
68
|
puts "Stack #{@stack_name} deleted."
|
69
69
|
show_took(start_time)
|
70
|
-
|
70
|
+
# Cant use success? because the stack is deleted and the describe stack errors
|
71
|
+
# For deletion, always return true once describe_stack fails to return the stack
|
72
|
+
return true
|
71
73
|
end
|
72
74
|
|
73
75
|
# Never gets beyond here when deleting a stack because the describe stack returns nothing
|
74
76
|
# once the stack is deleted. Gets here for stack create and update though.
|
75
77
|
|
76
|
-
if
|
78
|
+
if /_FAILED/.match?(last_event_status)
|
77
79
|
puts "Stack failed: #{last_event_status}".color(:red)
|
78
|
-
puts "Stack reason #{@events.dig(0,"resource_status_reason")}".color(:red)
|
79
|
-
elsif
|
80
|
+
puts "Stack reason #{@events.dig(0, "resource_status_reason")}".color(:red)
|
81
|
+
elsif /_ROLLBACK_/.match?(last_event_status)
|
80
82
|
puts "Stack rolled back: #{last_event_status}".color(:red)
|
81
83
|
else # success
|
82
84
|
puts "Stack success status: #{last_event_status}".color(:green)
|
83
85
|
end
|
84
86
|
|
85
|
-
return if @hide_time_took # set in run
|
86
87
|
show_took(start_time)
|
87
88
|
success?
|
88
89
|
end
|
89
90
|
|
90
91
|
def show_took(start_time)
|
92
|
+
# @hide_time_took set in run
|
93
|
+
return if @hide_time_took
|
94
|
+
return unless @options[:show_took]
|
91
95
|
took = Time.now - start_time
|
92
96
|
puts "Time took: #{pretty_time(took).color(:green)}"
|
93
97
|
end
|
94
98
|
|
95
|
-
def completed
|
99
|
+
def completed?
|
96
100
|
last_event_status =~ /(_COMPLETE|_FAILED)$/ &&
|
97
|
-
|
98
|
-
|
101
|
+
@events.dig(0, "logical_resource_id") == @stack_name &&
|
102
|
+
@events.dig(0, "resource_type") == "AWS::CloudFormation::Stack"
|
99
103
|
end
|
100
104
|
|
101
105
|
def last_event_status
|
@@ -110,16 +114,16 @@ class CfnStatus
|
|
110
114
|
else
|
111
115
|
i = last_shown_index
|
112
116
|
# puts "last_shown index #{i}"
|
113
|
-
print_events(i-1) unless i == 0
|
117
|
+
print_events(i - 1) unless i == 0
|
114
118
|
end
|
115
119
|
|
116
120
|
return if final
|
117
|
-
sleep 5 unless ENV[
|
121
|
+
sleep 5 unless ENV["TEST"]
|
118
122
|
refresh_events
|
119
123
|
end
|
120
124
|
|
121
125
|
def print_events(i)
|
122
|
-
@events[0..i].
|
126
|
+
@events[0..i].reverse_each do |e|
|
123
127
|
print_event(e)
|
124
128
|
end
|
125
129
|
|
@@ -135,7 +139,7 @@ class CfnStatus
|
|
135
139
|
e["logical_resource_id"],
|
136
140
|
e["resource_status_reason"]
|
137
141
|
].join(" ")
|
138
|
-
message = message.color(:red) if e["resource_status"]
|
142
|
+
message = message.color(:red) if /_FAILED/.match?(e["resource_status"])
|
139
143
|
puts message
|
140
144
|
end
|
141
145
|
|
@@ -160,9 +164,8 @@ class CfnStatus
|
|
160
164
|
else
|
161
165
|
add_events_pages(resp, :start_index)
|
162
166
|
end
|
163
|
-
|
164
167
|
rescue Aws::CloudFormation::Errors::ValidationError => e
|
165
|
-
if
|
168
|
+
if /Stack .* does not exis/.match?(e.message)
|
166
169
|
@stack_deletion_completed = true
|
167
170
|
else
|
168
171
|
raise
|
@@ -197,8 +200,8 @@ class CfnStatus
|
|
197
200
|
skip = start_index_before_delete && event["resource_status"] == "DELETE_IN_PROGRESS"
|
198
201
|
|
199
202
|
event["resource_type"] == "AWS::CloudFormation::Stack" &&
|
200
|
-
|
201
|
-
|
203
|
+
event["resource_status_reason"] == "User Initiated" &&
|
204
|
+
!skip
|
202
205
|
end
|
203
206
|
end
|
204
207
|
|
@@ -209,18 +212,26 @@ class CfnStatus
|
|
209
212
|
end
|
210
213
|
|
211
214
|
def success?
|
212
|
-
resource_status = @events.dig(0,"resource_status")
|
213
|
-
|
215
|
+
resource_status = @events.dig(0, "resource_status")
|
216
|
+
if resource_status.nil? # not called as a part of wait
|
217
|
+
resp = cfn.describe_stacks(stack_name: @stack_name)
|
218
|
+
status = resp.stacks.first.stack_status
|
219
|
+
else
|
220
|
+
status = resource_status
|
221
|
+
end
|
222
|
+
|
223
|
+
successes = %w[CREATE_COMPLETE UPDATE_COMPLETE]
|
224
|
+
successes.include?(status)
|
214
225
|
end
|
215
226
|
|
216
227
|
def update_rollback?
|
217
|
-
@events.dig(0,"resource_status") == "UPDATE_ROLLBACK_COMPLETE"
|
228
|
+
@events.dig(0, "resource_status") == "UPDATE_ROLLBACK_COMPLETE"
|
218
229
|
end
|
219
230
|
|
220
231
|
def find_update_failed_event
|
221
232
|
i = @events.find_index do |event|
|
222
233
|
event["resource_type"] == "AWS::CloudFormation::Stack" &&
|
223
|
-
|
234
|
+
event["resource_status_reason"] == "User Initiated"
|
224
235
|
end
|
225
236
|
|
226
237
|
@events[0..i].reverse.find do |e|
|
@@ -236,7 +247,7 @@ class CfnStatus
|
|
236
247
|
|
237
248
|
reason = event["resource_status_reason"]
|
238
249
|
messages_map.each do |pattern, message|
|
239
|
-
if reason
|
250
|
+
if reason&.match?(pattern)
|
240
251
|
return message
|
241
252
|
end
|
242
253
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfn-status
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-cloudformation
|
@@ -95,8 +95,6 @@ files:
|
|
95
95
|
- LICENSE.txt
|
96
96
|
- README.md
|
97
97
|
- Rakefile
|
98
|
-
- bin/console
|
99
|
-
- bin/setup
|
100
98
|
- cfn-status.gemspec
|
101
99
|
- lib/cfn-status.rb
|
102
100
|
- lib/cfn_status.rb
|
@@ -122,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
120
|
- !ruby/object:Gem::Version
|
123
121
|
version: '0'
|
124
122
|
requirements: []
|
125
|
-
rubygems_version: 3.4.
|
123
|
+
rubygems_version: 3.4.19
|
126
124
|
signing_key:
|
127
125
|
specification_version: 4
|
128
126
|
summary: CloudFormation status library
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "cfn_status"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|