Skip to content

Commit be44447

Browse files
authored
Merge pull request #1670 from marquiz/devel/flag-feature-errors
apis/nfd: no error on ops that never match
2 parents 828acaa + fbb7303 commit be44447

File tree

3 files changed

+62
-35
lines changed

3 files changed

+62
-35
lines changed

pkg/apis/nfd/nodefeaturerule/expression-api_test.go

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,35 +43,70 @@ func TestMatchKeys(t *testing.T) {
4343
}
4444

4545
tcs := []TC{
46-
{output: O{}, result: assert.True, err: assert.Nil},
47-
48-
{input: I{}, output: O{}, result: assert.True, err: assert.Nil},
49-
50-
{input: I{"foo": {}}, output: O{}, result: assert.True, err: assert.Nil},
51-
52-
{mes: `
46+
{
47+
name: "empty expression and nil input",
48+
output: O{},
49+
result: assert.True,
50+
err: assert.Nil,
51+
},
52+
{
53+
name: "empty expression and empty input",
54+
input: I{},
55+
output: O{},
56+
result: assert.True,
57+
err: assert.Nil,
58+
},
59+
{
60+
name: "empty expression with non-empty input",
61+
input: I{"foo": {}},
62+
output: O{},
63+
result: assert.True,
64+
err: assert.Nil,
65+
},
66+
{
67+
name: "expressions match",
68+
mes: `
5369
foo: { op: DoesNotExist }
5470
bar: { op: Exists }
5571
`,
5672
input: I{"bar": {}, "baz": {}, "buzz": {}},
5773
output: O{{"Name": "bar"}, {"Name": "foo"}},
58-
result: assert.True, err: assert.Nil},
59-
60-
{mes: `
74+
result: assert.True,
75+
err: assert.Nil,
76+
},
77+
{
78+
name: "expression does not match",
79+
mes: `
6180
foo: { op: DoesNotExist }
6281
bar: { op: Exists }
6382
`,
6483
input: I{"foo": {}, "bar": {}, "baz": {}},
6584
output: nil,
66-
result: assert.False, err: assert.Nil},
67-
68-
{mes: `
85+
result: assert.False,
86+
err: assert.Nil,
87+
},
88+
{
89+
name: "op that never matches",
90+
mes: `
6991
foo: { op: In, value: ["bar"] }
7092
bar: { op: Exists }
7193
`,
7294
input: I{"bar": {}, "baz": {}},
7395
output: nil,
74-
result: assert.False, err: assert.NotNil},
96+
result: assert.False,
97+
err: assert.Nil,
98+
},
99+
{
100+
name: "error in expression",
101+
mes: `
102+
foo: { op: Exists, value: ["bar"] }
103+
bar: { op: Exists }
104+
`,
105+
input: I{"bar": {}},
106+
output: nil,
107+
result: assert.False,
108+
err: assert.NotNil,
109+
},
75110
}
76111

77112
for _, tc := range tcs {

pkg/apis/nfd/nodefeaturerule/expression.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func evaluateMatchExpression(m *nfdv1alpha1.MatchExpression, valid bool, value i
6767
return !valid, nil
6868
}
6969

70-
if valid {
70+
if valid && value != nil {
7171
value := fmt.Sprintf("%v", value)
7272
switch m.Op {
7373
case nfdv1alpha1.MatchIn:
@@ -161,18 +161,10 @@ func evaluateMatchExpression(m *nfdv1alpha1.MatchExpression, valid bool, value i
161161

162162
// evaluateMatchExpressionKeys evaluates the MatchExpression against a set of keys.
163163
func evaluateMatchExpressionKeys(m *nfdv1alpha1.MatchExpression, name string, keys map[string]nfdv1alpha1.Nil) (bool, error) {
164-
matched := false
165-
166164
_, ok := keys[name]
167-
switch m.Op {
168-
case nfdv1alpha1.MatchAny:
169-
matched = true
170-
case nfdv1alpha1.MatchExists:
171-
matched = ok
172-
case nfdv1alpha1.MatchDoesNotExist:
173-
matched = !ok
174-
default:
175-
return false, fmt.Errorf("invalid Op %q when matching keys", m.Op)
165+
matched, err := evaluateMatchExpression(m, ok, nil)
166+
if err != nil {
167+
return false, err
176168
}
177169

178170
if klogV := klog.V(3); klogV.Enabled() {

pkg/apis/nfd/nodefeaturerule/expression_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -171,15 +171,15 @@ func TestEvaluateMatchExpressionKeys(t *testing.T) {
171171
{name: "7", op: nfdv1alpha1.MatchDoesNotExist, key: "foo", input: I{"bar": {}}, result: assert.True, err: assert.Nil},
172172
{name: "8", op: nfdv1alpha1.MatchDoesNotExist, key: "foo", input: I{"bar": {}, "foo": {}}, result: assert.False, err: assert.Nil},
173173

174-
// All other ops should return an error
175-
{name: "9", op: nfdv1alpha1.MatchIn, values: V{"foo"}, key: "foo", result: assert.False, err: assert.NotNil},
176-
{name: "10", op: nfdv1alpha1.MatchNotIn, values: V{"foo"}, key: "foo", result: assert.False, err: assert.NotNil},
177-
{name: "11", op: nfdv1alpha1.MatchInRegexp, values: V{"foo"}, key: "foo", result: assert.False, err: assert.NotNil},
178-
{name: "12", op: nfdv1alpha1.MatchGt, values: V{"1"}, key: "foo", result: assert.False, err: assert.NotNil},
179-
{name: "13", op: nfdv1alpha1.MatchLt, values: V{"1"}, key: "foo", result: assert.False, err: assert.NotNil},
180-
{name: "14", op: nfdv1alpha1.MatchGtLt, values: V{"1", "10"}, key: "foo", result: assert.False, err: assert.NotNil},
181-
{name: "15", op: nfdv1alpha1.MatchIsTrue, key: "foo", result: assert.False, err: assert.NotNil},
182-
{name: "16", op: nfdv1alpha1.MatchIsFalse, key: "foo", result: assert.False, err: assert.NotNil},
174+
// All other ops should be nop (and return false) for "key" features
175+
{name: "9", op: nfdv1alpha1.MatchIn, values: V{"foo"}, key: "foo", result: assert.False, err: assert.Nil},
176+
{name: "10", op: nfdv1alpha1.MatchNotIn, values: V{"foo"}, key: "foo", result: assert.False, err: assert.Nil},
177+
{name: "11", op: nfdv1alpha1.MatchInRegexp, values: V{"foo"}, key: "foo", result: assert.False, err: assert.Nil},
178+
{name: "12", op: nfdv1alpha1.MatchGt, values: V{"1"}, key: "foo", result: assert.False, err: assert.Nil},
179+
{name: "13", op: nfdv1alpha1.MatchLt, values: V{"1"}, key: "foo", result: assert.False, err: assert.Nil},
180+
{name: "14", op: nfdv1alpha1.MatchGtLt, values: V{"1", "10"}, key: "foo", result: assert.False, err: assert.Nil},
181+
{name: "15", op: nfdv1alpha1.MatchIsTrue, key: "foo", result: assert.False, err: assert.Nil},
182+
{name: "16", op: nfdv1alpha1.MatchIsFalse, key: "foo", result: assert.False, err: assert.Nil},
183183
}
184184

185185
for _, tc := range tcs {

0 commit comments

Comments
 (0)