Skip to content

Commit 47e715a

Browse files
committed
Don't panic when parsing resources, return error
1 parent 2787cf3 commit 47e715a

File tree

2 files changed

+104
-25
lines changed

2 files changed

+104
-25
lines changed

pkg/analyze/node_resources.go

Lines changed: 54 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,19 @@ func analyzeNodeResources(analyzer *troubleshootv1beta1.NodeResources, getCollec
9494
return result, nil
9595
}
9696

97-
func compareNodeResourceConditionalToActual(conditional string, matchingNodes []corev1.Node, totalNodeCount int) (bool, error) {
97+
func compareNodeResourceConditionalToActual(conditional string, matchingNodes []corev1.Node, totalNodeCount int) (res bool, err error) {
98+
res = false
99+
err = nil
100+
101+
defer func() {
102+
if r := recover(); r != nil {
103+
err = errors.Errorf("failed to evaluate %q: %v", conditional, r)
104+
}
105+
}()
106+
98107
if conditional == "" {
99-
return true, nil
108+
res = true
109+
return
100110
}
101111

102112
parts := strings.Fields(strings.TrimSpace(conditional))
@@ -106,7 +116,8 @@ func compareNodeResourceConditionalToActual(conditional string, matchingNodes []
106116
}
107117

108118
if len(parts) != 3 {
109-
return false, errors.New("unable to parse nodeResources conditional")
119+
err = errors.New("unable to parse nodeResources conditional")
120+
return
110121
}
111122

112123
operator := parts[1]
@@ -117,6 +128,8 @@ func compareNodeResourceConditionalToActual(conditional string, matchingNodes []
117128
parsedDesiredValue, err := strconv.Atoi(parts[2])
118129
if err == nil {
119130
desiredValue = parsedDesiredValue
131+
} else {
132+
err = nil // try parsing as a resource
120133
}
121134

122135
reg := regexp.MustCompile(`(?P<function>.*)\((?P<property>.*)\)`)
@@ -128,7 +141,8 @@ func compareNodeResourceConditionalToActual(conditional string, matchingNodes []
128141
}
129142

130143
if match == nil || len(match) != 3 {
131-
return false, errors.New("conditional does not match pattern of function(property?)")
144+
err = errors.New("conditional does not match pattern of function(property?)")
145+
return
132146
}
133147

134148
function := match[1]
@@ -151,70 +165,86 @@ func compareNodeResourceConditionalToActual(conditional string, matchingNodes []
151165
case "=", "==", "===":
152166
if _, ok := actualValue.(int); ok {
153167
if _, ok := desiredValue.(int); ok {
154-
return actualValue.(int) == desiredValue.(int), nil
168+
res = actualValue.(int) == desiredValue.(int)
169+
return
155170
}
156171
}
157172

158173
if _, ok := desiredValue.(string); ok {
159-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 0, nil
174+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 0
175+
return
160176
}
161177

162-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 0, nil
178+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 0
179+
return
163180

164181
case "<":
165182
if _, ok := actualValue.(int); ok {
166183
if _, ok := desiredValue.(int); ok {
167-
return actualValue.(int) < desiredValue.(int), nil
184+
res = actualValue.(int) < desiredValue.(int)
185+
return
168186
}
169187
}
170188
if _, ok := desiredValue.(string); ok {
171-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == -1, nil
189+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == -1
190+
return
172191
}
173192

174-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == -1, nil
193+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == -1
194+
return
175195

176196
case ">":
177197
if _, ok := actualValue.(int); ok {
178198
if _, ok := desiredValue.(int); ok {
179-
return actualValue.(int) > desiredValue.(int), nil
199+
res = actualValue.(int) > desiredValue.(int)
200+
return
180201
}
181202
}
182203
if _, ok := desiredValue.(string); ok {
183-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 1, nil
204+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 1
205+
return
184206
}
185207

186-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 1, nil
208+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 1
209+
return
187210

188211
case "<=":
189212
if _, ok := actualValue.(int); ok {
190213
if _, ok := desiredValue.(int); ok {
191-
return actualValue.(int) <= desiredValue.(int), nil
214+
res = actualValue.(int) <= desiredValue.(int)
215+
return
192216
}
193217
}
194218
if _, ok := desiredValue.(string); ok {
195-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 0 ||
196-
actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == -1, nil
219+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 0 ||
220+
actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == -1
221+
return
197222
}
198223

199-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 0 ||
200-
actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == -1, nil
224+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 0 ||
225+
actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == -1
226+
return
201227

202228
case ">=":
203229
if _, ok := actualValue.(int); ok {
204230
if _, ok := desiredValue.(int); ok {
205-
return actualValue.(int) >= desiredValue.(int), nil
231+
res = actualValue.(int) >= desiredValue.(int)
232+
return
206233
}
207234
}
208235
if _, ok := desiredValue.(string); ok {
209-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 0 ||
210-
actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 1, nil
236+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 0 ||
237+
actualValue.(*resource.Quantity).Cmp(resource.MustParse(desiredValue.(string))) == 1
238+
return
211239
}
212240

213-
return actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 0 ||
214-
actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 1, nil
241+
res = actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 0 ||
242+
actualValue.(*resource.Quantity).Cmp(resource.MustParse(strconv.Itoa(desiredValue.(int)))) == 1
243+
return
215244
}
216245

217-
return false, errors.New("unexpected conditional in nodeResources")
246+
err = errors.New("unexpected conditional in nodeResources")
247+
return
218248
}
219249

220250
func getQuantity(node corev1.Node, property string) *resource.Quantity {

0 commit comments

Comments
 (0)