cfn-events 0.1.3 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0780631b52643fdb0237dd4884ba8191116b7712
4
- data.tar.gz: f64043ef2a1d1ffe05f5bff0fdadb9b9987b108a
3
+ metadata.gz: 358efd35e035ae91fd12204079e37547d8debd5f
4
+ data.tar.gz: 28f2c4e7fa6b6089fe973995b985849582680722
5
5
  SHA512:
6
- metadata.gz: 94309fa22a5b82fcb00b92c28c720b632e3b1cdec940ccab3b9e9b44f6074b25c8fcfc34670a74c7cc2361c1662fabdde1885bbcd3dbec9d64ddbc24cedc2bfd
7
- data.tar.gz: 6347ee295e8a8b8b01d490e3434e650a449e82f9777f35e6f99c22afe504971cece5ad9ff976633a95ca4f78515da542e98189afc58316817300531a9efe2021
6
+ metadata.gz: 3d5e69ecf7453a1e6c0127a0426484005a335e9e1879bdb1e11b243aace65735f094aaccb4bed029f715da0848a4e770ffad14235fb61f5ec6f475865182cc42
7
+ data.tar.gz: a5e20c7a1c228a03b3c33b1e8061867f3131cfa73142bbf01fad2d1079d23edf0eca13c3029309e51db7b74c4fde5afbac743b602607c1c65dd000d2ddff643f
@@ -1,3 +1,5 @@
1
+ require 'json'
2
+
1
3
  module CfnEvents
2
4
 
3
5
  class Runner
@@ -11,36 +13,78 @@ module CfnEvents
11
13
  end
12
14
  end
13
15
 
14
- def core_v2_options
15
- i
16
- end
17
-
18
16
  def resolve_stack(stack_name_or_id)
19
- ans = @config.cfn_client.describe_stacks(stack_name: stack_name_or_id).data.stacks[0].stack_id
17
+ ans = @config.cfn_client.describe_stacks(stack_name: stack_name_or_id).stacks[0].stack_id
20
18
  if ans != stack_name_or_id
21
19
  $stderr.puts "Resolved #{stack_name_or_id} to #{ans}"
22
20
  end
23
21
  ans
24
22
  end
25
23
 
26
- def all_events
27
- @config.cfn_client.describe_stack_events(stack_name: @stack_id).data.stack_events.reverse
24
+ def all_events_so_far
25
+ r = @config.cfn_client.describe_stack_events(stack_name: @stack_id)
26
+ events = r.each_page.flat_map {|page| page.stack_events}.reverse
27
+
28
+ if events.empty?
29
+ raise "Stack has no events! Please raise this as a cfn-events bug."
30
+ end
31
+
32
+ [ events, events.last ]
28
33
  end
29
34
 
30
- def events_since_time(events, t)
31
- # There may be a more efficient algorithm
32
- events.select {|e| e.timestamp > t }
35
+ def events_since_time(t)
36
+ r = @config.cfn_client.describe_stack_events(stack_name: @stack_id)
37
+
38
+ # If there are no events since the given time, show none, and return the
39
+ # most recent event. Sort of an edge case.
40
+ if r.stack_events.first.timestamp <= t
41
+ return [ [], r.stack_events.first ]
42
+ end
43
+
44
+ events = []
45
+ loop do
46
+ cutoff = r.stack_events.index {|event| event.timestamp <= t}
47
+ if cutoff
48
+ # We can stop looking
49
+ events.concat r.stack_events[0..cutoff-1]
50
+ events.reverse!
51
+ return [ events, events.last ]
52
+ end
53
+
54
+ events.concat r.stack_events
55
+ r.next_page? or break
56
+ r = r.next_page
57
+ end
58
+
59
+ # ALL the available events are since the given time
60
+ events.reverse!
61
+ return [ events, events.last ]
33
62
  end
34
63
 
35
- def events_since_id(id)
36
- # There may be a more efficient algorithm
37
- events = all_events
38
- i = events.index {|e| e.event_id == id }
39
- if i < 0
40
- events
41
- else
42
- events[i+1..-1]
64
+ def events_since_event(since_event)
65
+ r = @config.cfn_client.describe_stack_events(stack_name: @stack_id)
66
+
67
+ # Sort of a special case: no new events
68
+ if r.stack_events.first.event_id == since_event.event_id
69
+ return [ [], since_event ]
43
70
  end
71
+
72
+ events = []
73
+ r.each_page do |page|
74
+ cutoff = page.stack_events.index {|e| e.event_id == since_event.event_id}
75
+
76
+ if cutoff
77
+ events.concat page.stack_events[0..cutoff-1]
78
+ return [ events.reverse, events.first ]
79
+ end
80
+
81
+ events.concat r.stack_events
82
+ end
83
+
84
+ # Unable to join what we've seen so far to what we can see now
85
+ $stderr.puts "Last-seen stack event is no longer returned by AWS. Please raise this as a cfn-events bug."
86
+
87
+ return [ events.reverse, events.first ]
44
88
  end
45
89
 
46
90
  def show_events(events)
@@ -68,30 +112,33 @@ module CfnEvents
68
112
  def run
69
113
  @stack_id = resolve_stack(@config.stack_name_or_id)
70
114
 
71
- events = all_events
115
+ # An assumption to make the logic easier:
116
+ # - there can never be zero events
72
117
 
73
- if @config.since
74
- show_events(events_since_time(events, @config.since))
75
- else
76
- show_events(events)
77
- end
118
+ # (The closest we seem to get to this is if a stack is created via a
119
+ # change set, then the stack entity is created with a single event,
120
+ # "AWS::CloudFormation::Stack <the stack name> REVIEW_IN_PROGRESS").
121
+
122
+ # Therefore there is always a most_recent_event.
123
+
124
+ events_to_show, most_recent_event = if @config.since
125
+ events_since_time @config.since
126
+ else
127
+ all_events_so_far
128
+ end
129
+ show_events events_to_show
78
130
 
79
131
  return 0 unless @config.forever or @config.wait
80
132
 
81
- while @config.forever or not steady_state?(events.last)
133
+ while @config.forever or not steady_state?(most_recent_event)
82
134
  $stdout.sync
83
135
  sleep @config.poll_seconds
84
-
85
- new_events = events_since_id(events.last.event_id)
86
-
87
- unless new_events.empty?
88
- show_events(new_events)
89
- events = new_events
90
- end
136
+ events_to_show, most_recent_event = events_since_event most_recent_event
137
+ show_events events_to_show
91
138
  end
92
139
 
93
- return 2 if events.last.resource_status.match /FAILED/
94
- return 1 if events.last.resource_status.match /ROLLBACK/
140
+ return 2 if most_recent_event.resource_status.match /FAILED/
141
+ return 1 if most_recent_event.resource_status.match /ROLLBACK/
95
142
  return 0
96
143
  end
97
144
 
@@ -1,3 +1,3 @@
1
1
  module CfnEvents
2
- VERSION = '0.1.3'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfn-events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rachel Evans
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
27
41
  description: "\n cfn-events reads the events for an AWS CloudFormation stack. It
28
42
  can\n be used to \"tail\" the log, and to wait until a stack update is resolved,\n
29
43
  \ successfully or otherwise.\n\n Defaults to eu-west-1, or whatever $AWS_REGION
@@ -60,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
74
  version: '0'
61
75
  requirements: []
62
76
  rubyforge_project:
63
- rubygems_version: 2.5.1
77
+ rubygems_version: 2.6.13
64
78
  signing_key:
65
79
  specification_version: 4
66
80
  summary: Watch AWS CloudFormation stack events and wait for completion