@@ -16,8 +16,7 @@ package main
16
16
17
17
import (
18
18
"k8s.io/kubernetes/pkg/api"
19
- client "k8s.io/kubernetes/pkg/client/unversioned"
20
- "log"
19
+ "k8s.io/kubernetes/pkg/types"
21
20
"strings"
22
21
)
23
22
@@ -30,48 +29,73 @@ import (
30
29
var FailedReasonPartials = []string {"failed" , "err" , "exceeded" , "invalid" , "unhealthy" ,
31
30
"mismatch" , "insufficient" , "conflict" , "outof" , "nil" }
32
31
33
- // GetPodsEventWarnings returns warning pod events based on given list of pods.
32
+ // GetPodsEventWarnings returns warning pod events by filtering out events targeting only given pods
34
33
// TODO(floreks) : Import and use Set instead of custom function to get rid of duplicates
35
- func GetPodsEventWarnings (client client.Interface , pods []api.Pod ) (result []Event , err error ) {
34
+ func GetPodsEventWarnings (eventList * api.EventList , pods []api.Pod ) []Event {
35
+ result := make ([]Event , 0 )
36
+ if eventList == nil {
37
+ return result
38
+ }
39
+
40
+ // Filter out only warning events
41
+ events := getWarningEvents (eventList )
42
+ failedPods := make ([]api.Pod , 0 )
43
+
44
+ // Filter out only 'failed' pods
36
45
for _ , pod := range pods {
37
46
if ! isRunningOrSucceeded (pod ) {
38
- log .Printf ("Getting warning events from pod: %s" , pod .Name )
39
- events , err := GetPodEvents (client , pod )
47
+ failedPods = append (failedPods , pod )
48
+ }
49
+ }
40
50
41
- if err != nil {
42
- return nil , err
43
- }
51
+ // Filter events by failed pods UID
52
+ events = filterEventsByPodsUID ( events , failedPods )
53
+ events = removeDuplicates ( events )
44
54
45
- result = getPodsEventWarnings (events )
46
- }
55
+ for _ , event := range events {
56
+ result = append (result , Event {
57
+ Message : event .Message ,
58
+ Reason : event .Reason ,
59
+ Type : event .Type ,
60
+ })
47
61
}
48
62
49
- return removeDuplicates ( result ), nil
63
+ return result
50
64
}
51
65
52
- // Returns list of Pod Event model objects based on kubernetes API event list object
53
- // Event list object is filtered to get only warning events.
54
- func getPodsEventWarnings (eventList * api.EventList ) []Event {
55
- result := make ([]Event , 0 )
66
+ // Returns filtered list of event objects.
67
+ // Events list is filtered to get only events targeting pods on the list.
68
+ func filterEventsByPodsUID (events []api.Event , pods []api.Pod ) []api.Event {
69
+ result := make ([]api.Event , 0 )
70
+ podEventMap := make (map [types.UID ]bool , 0 )
56
71
57
- var events []api.Event
58
- if ! isTypeFilled (eventList .Items ) {
59
- eventList .Items = fillEventsType (eventList .Items )
72
+ if len (pods ) == 0 || len (events ) == 0 {
73
+ return result
60
74
}
61
75
62
- events = filterEventsByType (eventList .Items , api .EventTypeWarning )
76
+ for _ , pod := range pods {
77
+ podEventMap [pod .UID ] = true
78
+ }
63
79
64
80
for _ , event := range events {
65
- result = append (result , Event {
66
- Message : event .Message ,
67
- Reason : event .Reason ,
68
- Type : event .Type ,
69
- })
81
+ if _ , exists := podEventMap [event .InvolvedObject .UID ]; exists {
82
+ result = append (result , event )
83
+ }
70
84
}
71
85
72
86
return result
73
87
}
74
88
89
+ // Returns filtered list of event objects.
90
+ // Event list object is filtered to get only warning events.
91
+ func getWarningEvents (eventList * api.EventList ) []api.Event {
92
+ if ! isTypeFilled (eventList .Items ) {
93
+ eventList .Items = fillEventsType (eventList .Items )
94
+ }
95
+
96
+ return filterEventsByType (eventList .Items , api .EventTypeWarning )
97
+ }
98
+
75
99
// Filters kubernetes API event objects based on event type.
76
100
// Empty string will return all events.
77
101
func filterEventsByType (events []api.Event , eventType string ) []api.Event {
@@ -131,9 +155,9 @@ func fillEventsType(events []api.Event) []api.Event {
131
155
}
132
156
133
157
// Removes duplicate strings from the slice
134
- func removeDuplicates (slice []Event ) []Event {
158
+ func removeDuplicates (slice []api. Event ) []api. Event {
135
159
visited := make (map [string ]bool , 0 )
136
- result := make ([]Event , 0 )
160
+ result := make ([]api. Event , 0 )
137
161
138
162
for _ , elem := range slice {
139
163
if ! visited [elem .Reason ] {
0 commit comments