cfn-status 0.4.6 → 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 +14 -0
- data/cfn-status.gemspec +4 -3
- data/lib/cfn_status/version.rb +1 -1
- data/lib/cfn_status.rb +41 -25
- metadata +27 -15
- 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,20 @@
|
|
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
|
+
|
14
|
+
## [0.5.0] - 2023-12-17
|
15
|
+
- [#6](https://github.com/tongueroo/cfn-status/pull/6) Use events.dig instead of brackets
|
16
|
+
- [#7](https://github.com/tongueroo/cfn-status/pull/7) Add start_index_before_delete option
|
17
|
+
- add add_development_dependency nokogiri
|
18
|
+
- improve dev dependency version pins
|
19
|
+
|
6
20
|
## [0.4.6] - 2022-02-21
|
7
21
|
- show took time for deletion also
|
8
22
|
|
data/cfn-status.gemspec
CHANGED
@@ -24,7 +24,8 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_dependency "aws-sdk-cloudformation"
|
26
26
|
|
27
|
-
spec.add_development_dependency "
|
28
|
-
spec.add_development_dependency "
|
29
|
-
spec.add_development_dependency "
|
27
|
+
spec.add_development_dependency "nokogiri"
|
28
|
+
spec.add_development_dependency "bundler"
|
29
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
30
|
+
spec.add_development_dependency "rspec", ">= 3.0"
|
30
31
|
end
|
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
|
@@ -23,7 +23,7 @@ class CfnStatus
|
|
23
23
|
return true
|
24
24
|
end
|
25
25
|
|
26
|
-
puts "
|
26
|
+
puts "Stack #{@stack_name.color(:green)} Status: #{stack.stack_status.color(:green)}"
|
27
27
|
if in_progress?
|
28
28
|
puts "Stack events (tailing):"
|
29
29
|
# tail all events until done
|
@@ -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
|
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,20 +114,20 @@ 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
|
|
126
|
-
@last_shown_event_id = @events
|
130
|
+
@last_shown_event_id = @events.dig(0, "event_id")
|
127
131
|
# puts "@last_shown_event_id #{@last_shown_event_id.inspect}"
|
128
132
|
end
|
129
133
|
|
@@ -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
|
@@ -191,9 +194,14 @@ class CfnStatus
|
|
191
194
|
|
192
195
|
# Should always find a "User Initiated" stack event when @last_shown_index is not set
|
193
196
|
def start_index
|
197
|
+
start_index_before_delete = @options[:start_index_before_delete]
|
198
|
+
|
194
199
|
@events.find_index do |event|
|
200
|
+
skip = start_index_before_delete && event["resource_status"] == "DELETE_IN_PROGRESS"
|
201
|
+
|
195
202
|
event["resource_type"] == "AWS::CloudFormation::Stack" &&
|
196
|
-
|
203
|
+
event["resource_status_reason"] == "User Initiated" &&
|
204
|
+
!skip
|
197
205
|
end
|
198
206
|
end
|
199
207
|
|
@@ -204,18 +212,26 @@ class CfnStatus
|
|
204
212
|
end
|
205
213
|
|
206
214
|
def success?
|
207
|
-
resource_status = @events
|
208
|
-
|
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)
|
209
225
|
end
|
210
226
|
|
211
227
|
def update_rollback?
|
212
|
-
@events
|
228
|
+
@events.dig(0, "resource_status") == "UPDATE_ROLLBACK_COMPLETE"
|
213
229
|
end
|
214
230
|
|
215
231
|
def find_update_failed_event
|
216
232
|
i = @events.find_index do |event|
|
217
233
|
event["resource_type"] == "AWS::CloudFormation::Stack" &&
|
218
|
-
|
234
|
+
event["resource_status_reason"] == "User Initiated"
|
219
235
|
end
|
220
236
|
|
221
237
|
@events[0..i].reverse.find do |e|
|
@@ -231,7 +247,7 @@ class CfnStatus
|
|
231
247
|
|
232
248
|
reason = event["resource_status_reason"]
|
233
249
|
messages_map.each do |pattern, message|
|
234
|
-
if reason
|
250
|
+
if reason&.match?(pattern)
|
235
251
|
return message
|
236
252
|
end
|
237
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
|
@@ -24,46 +24,60 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- - "
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
47
|
+
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- - "
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- - "
|
59
|
+
- - ">="
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
61
|
+
version: 12.3.3
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- - "
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
68
|
+
version: 12.3.3
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rspec
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - "
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '3.0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - "
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '3.0'
|
69
83
|
description:
|
@@ -81,8 +95,6 @@ files:
|
|
81
95
|
- LICENSE.txt
|
82
96
|
- README.md
|
83
97
|
- Rakefile
|
84
|
-
- bin/console
|
85
|
-
- bin/setup
|
86
98
|
- cfn-status.gemspec
|
87
99
|
- lib/cfn-status.rb
|
88
100
|
- lib/cfn_status.rb
|
@@ -108,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
120
|
- !ruby/object:Gem::Version
|
109
121
|
version: '0'
|
110
122
|
requirements: []
|
111
|
-
rubygems_version: 3.
|
123
|
+
rubygems_version: 3.4.19
|
112
124
|
signing_key:
|
113
125
|
specification_version: 4
|
114
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__)
|