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 +4 -4
- data/lib/cfn-events/runner.rb +81 -34
- data/lib/cfn-events/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 358efd35e035ae91fd12204079e37547d8debd5f
|
4
|
+
data.tar.gz: 28f2c4e7fa6b6089fe973995b985849582680722
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d5e69ecf7453a1e6c0127a0426484005a335e9e1879bdb1e11b243aace65735f094aaccb4bed029f715da0848a4e770ffad14235fb61f5ec6f475865182cc42
|
7
|
+
data.tar.gz: a5e20c7a1c228a03b3c33b1e8061867f3131cfa73142bbf01fad2d1079d23edf0eca13c3029309e51db7b74c4fde5afbac743b602607c1c65dd000d2ddff643f
|
data/lib/cfn-events/runner.rb
CHANGED
@@ -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).
|
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
|
27
|
-
@config.cfn_client.describe_stack_events(stack_name: @stack_id)
|
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(
|
31
|
-
|
32
|
-
|
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
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
if
|
40
|
-
|
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
|
-
|
115
|
+
# An assumption to make the logic easier:
|
116
|
+
# - there can never be zero events
|
72
117
|
|
73
|
-
if
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
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?(
|
133
|
+
while @config.forever or not steady_state?(most_recent_event)
|
82
134
|
$stdout.sync
|
83
135
|
sleep @config.poll_seconds
|
84
|
-
|
85
|
-
|
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
|
94
|
-
return 1 if
|
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
|
|
data/lib/cfn-events/version.rb
CHANGED
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.
|
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.
|
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
|