Skip to content

node-expr fails on valid labels #120

Open
@jabbrwcky

Description

@jabbrwcky

the nexpression parser used for node-expr fails - or even worse panics - on several classes of valid node labels, e.g.

draino-enabled=true, kubernetes.io/os=linux ordraino="true". (Examples below)

So either a different expression parser would be nice or at least adding a caveat to the documentation.

Some snippts to try in nodefilter_test.go:

{
	name: "ParseBoolean",
	obj: &core.Node{
		ObjectMeta: meta.ObjectMeta{
			Name:   nodeName,
			Labels: map[string]string{"metadata.labels.draino-enabled": "true"},
		},
	},
	expression:   "metadata.labels.draino-enabled == 'true'",
	passesFilter: true,
},

blows up completely

Running tool: /opt/homebrew/bin/go test -timeout 30s -run ^TestNodeLabelFilter$ github.com/planetlabs/draino/internal/kubernetes

2021-10-04T18:08:40.204+0200	ERROR	kubernetes/nodefilters.go:62	Could not parse expression: invalid operation: string - <nil> (1:23)
 | metadata.labels.draino-enabled == 'true'
 | ......................^
github.com/planetlabs/draino/internal/kubernetes.NewNodeLabelFilter.func1
	/Users/jenshausherr/src/draino/internal/kubernetes/nodefilters.go:62
github.com/planetlabs/draino/internal/kubernetes.TestNodeLabelFilter.func1
	/Users/jenshausherr/src/draino/internal/kubernetes/nodefilters_test.go:235
testing.tRunner
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1259
--- FAIL: TestNodeLabelFilter (0.00s)
    --- FAIL: TestNodeLabelFilter/Panics (0.00s)
panic: interface conversion: interface {} is nil, not bool [recovered]
	panic: interface conversion: interface {} is nil, not bool

goroutine 6 [running]:
testing.tRunner.func1.2({0x101122d60, 0x1400041f4d0})
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1209 +0x258
testing.tRunner.func1(0x1400044a1a0)
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1212 +0x284
panic({0x101122d60, 0x1400041f4d0})
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/runtime/panic.go:1038 +0x21c
github.com/planetlabs/draino/internal/kubernetes.NewNodeLabelFilter.func1({0x1012192e0, 0x140002e3340})
	/Users/jenshausherr/src/draino/internal/kubernetes/nodefilters.go:64 +0x238
github.com/planetlabs/draino/internal/kubernetes.TestNodeLabelFilter.func1(0x1400044a1a0)
	/Users/jenshausherr/src/draino/internal/kubernetes/nodefilters_test.go:235 +0xc8
testing.tRunner(0x1400044a1a0, 0x1400000e918)
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1259 +0x104
created by testing.(*T).Run
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1306 +0x328
FAIL	github.com/planetlabs/draino/internal/kubernetes	0.119s
FAIL

as well as

{
	name: "AlsoPanics",
	obj: &core.Node{
		ObjectMeta: meta.ObjectMeta{
			Name:   nodeName,
			Labels: map[string]string{"metadata.labels.kubernetes.io/os": "linux"},
		},
	},
	expression:   "metadata.labels.kubernetes.io/os == 'linux'",
	passesFilter: true,
},
Running tool: /opt/homebrew/bin/go test -timeout 30s -run ^TestNodeLabelFilter$ github.com/planetlabs/draino/internal/kubernetes

2021-10-04T18:10:38.596+0200	ERROR	kubernetes/nodefilters.go:62	Could not parse expression: invalid operation: int(string) (1:28)
 | metadata.labels.kubernetes.io/os == 'linux'
 | ...........................^
github.com/planetlabs/draino/internal/kubernetes.NewNodeLabelFilter.func1
	/Users/jenshausherr/src/draino/internal/kubernetes/nodefilters.go:62
github.com/planetlabs/draino/internal/kubernetes.TestNodeLabelFilter.func1
	/Users/jenshausherr/src/draino/internal/kubernetes/nodefilters_test.go:246
testing.tRunner
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1259
--- FAIL: TestNodeLabelFilter (0.00s)
    --- FAIL: TestNodeLabelFilter/AlsoPanics (0.00s)
panic: interface conversion: interface {} is nil, not bool [recovered]
	panic: interface conversion: interface {} is nil, not bool

goroutine 6 [running]:
testing.tRunner.func1.2({0x101502d60, 0x140004054a0})
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1209 +0x258
testing.tRunner.func1(0x140004301a0)
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1212 +0x284
panic({0x101502d60, 0x140004054a0})
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/runtime/panic.go:1038 +0x21c
github.com/planetlabs/draino/internal/kubernetes.NewNodeLabelFilter.func1({0x1015f92e0, 0x14000249340})
	/Users/jenshausherr/src/draino/internal/kubernetes/nodefilters.go:64 +0x238
github.com/planetlabs/draino/internal/kubernetes.TestNodeLabelFilter.func1(0x140004301a0)
	/Users/jenshausherr/src/draino/internal/kubernetes/nodefilters_test.go:246 +0xc8
testing.tRunner(0x140004301a0, 0x1400000e918)
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1259 +0x104
created by testing.(*T).Run
	/opt/homebrew/Cellar/go/1.17.1/libexec/src/testing/testing.go:1306 +0x328
FAIL	github.com/planetlabs/draino/internal/kubernetes	0.403s
FAIL
{
	name: "ParseBoolean",
	obj: &core.Node{
		ObjectMeta: meta.ObjectMeta{
			Name:   nodeName,
			Labels: map[string]string{"metadata.labels.draino": "true"},
		},
	},
	expression:   "metadata.labels.draino == 'true'",
	passesFilter: true,
},

also fails:

Running tool: /opt/homebrew/bin/go test -timeout 30s -run ^TestNodeLabelFilter$ github.com/planetlabs/draino/internal/kubernetes

--- FAIL: TestNodeLabelFilter (0.00s)
    --- FAIL: TestNodeLabelFilter/ParseBoolean (0.00s)
        /Users/jenshausherr/src/draino/internal/kubernetes/nodefilters_test.go:236: 
            	Error Trace:	nodefilters_test.go:236
            	Error:      	Not equal: 
            	            	expected: true
            	            	actual  : false
            	Test:       	TestNodeLabelFilter/ParseBoolean
FAIL
FAIL	github.com/planetlabs/draino/internal/kubernetes	0.118s
FAIL

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions