cfn-status 0.4.6 → 0.6.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: d783959f733a3175c56612fc8b1f9be8124f4c21fc591d87df3fc2457b57040f
4
- data.tar.gz: c78bffbbfd322f25fa4b6c00ed8b0c98e386dac24042bfec825d409e2e4ea357
3
+ metadata.gz: 83ea64eefe541a908445abdcb961258dc4da1214975c4a0e757c8a54e689e554
4
+ data.tar.gz: f8d9d83fdf7d77b71f93ca9049f46c6d9a054adc4c7c64d8afe9b620e9f7df09
5
5
  SHA512:
6
- metadata.gz: a2a89727d0321574dda3f212dbdfeff7ffae32ae3621de889191f6632d8b1aae8c98dd5f8b16c32c80789864fe0d63665fca304831c07e2bc015c5db310e6c34
7
- data.tar.gz: e691c6788d1a5400d80e4e2ff01157dd80985f0464c58118cf78e04364bf055f24784cc662d93f72237d415f497c0d0eb1ec0b7a3c24872f903fec4eff5c6e43
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 "bundler", "~> 2.0"
28
- spec.add_development_dependency "rake", "~> 10.0"
29
- spec.add_development_dependency "rspec", "~> 3.0"
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
@@ -1,3 +1,3 @@
1
1
  class CfnStatus
2
- VERSION = "0.4.6"
2
+ VERSION = "0.6.0"
3
3
  end
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 "The current status for the stack #{@stack_name.color(:green)} is #{stack.stack_status.color(:green)}"
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
- return
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 last_event_status =~ /_FAILED/
78
+ if /_FAILED/.match?(last_event_status)
77
79
  puts "Stack failed: #{last_event_status}".color(:red)
78
- puts "Stack reason #{@events[0]["resource_status_reason"]}".color(:red)
79
- elsif last_event_status =~ /_ROLLBACK_/
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
- @events[0]["logical_resource_id"] == @stack_name &&
98
- @events[0]["resource_type"] == "AWS::CloudFormation::Stack"
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['TEST']
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].reverse.each do |e|
126
+ @events[0..i].reverse_each do |e|
123
127
  print_event(e)
124
128
  end
125
129
 
126
- @last_shown_event_id = @events[0]["event_id"]
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"] =~ /_FAILED/
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 e.message =~ /Stack .* does not exis/
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
- event["resource_status_reason"] == "User Initiated"
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[0]["resource_status"]
208
- %w[CREATE_COMPLETE UPDATE_COMPLETE].include?(resource_status)
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[0]["resource_status"] == "UPDATE_ROLLBACK_COMPLETE"
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
- event["resource_status_reason"] == "User Initiated"
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 =~ pattern
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.6
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: 2022-02-21 00:00:00.000000000 Z
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: '2.0'
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: '2.0'
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: '10.0'
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: '10.0'
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.2.32
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__)
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here