@@ -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
220250func getQuantity (node corev1.Node , property string ) * resource.Quantity {
0 commit comments