From be3f556b77bc9fba33aa5484b4754bd117556030 Mon Sep 17 00:00:00 2001 From: Joshua Carp Date: Sun, 2 Oct 2016 23:54:13 -0400 Subject: [PATCH 1/3] Escape special characters in jsonpath field names. Example: `{.items[*].metadata.labels.kubernetes\.io/hostname}` [Resolves #31984] --- pkg/util/jsonpath/jsonpath_test.go | 16 ++++++++++++++-- pkg/util/jsonpath/parser.go | 12 +++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/pkg/util/jsonpath/jsonpath_test.go b/pkg/util/jsonpath/jsonpath_test.go index 8e1532834f3..f05a9739982 100644 --- a/pkg/util/jsonpath/jsonpath_test.go +++ b/pkg/util/jsonpath/jsonpath_test.go @@ -206,7 +206,12 @@ func TestKubernetes(t *testing.T) { "items":[ { "kind":"None", - "metadata":{"name":"127.0.0.1"}, + "metadata":{ + "name":"127.0.0.1", + "labels":{ + "kubernetes.io/hostname":"127.0.0.1" + } + }, "status":{ "capacity":{"cpu":"4"}, "addresses":[{"type": "LegacyHostIP", "address":"127.0.0.1"}] @@ -214,7 +219,12 @@ func TestKubernetes(t *testing.T) { }, { "kind":"None", - "metadata":{"name":"127.0.0.2"}, + "metadata":{ + "name":"127.0.0.2", + "labels":{ + "kubernetes.io/hostname":"127.0.0.2" + } + }, "status":{ "capacity":{"cpu":"8"}, "addresses":[ @@ -254,6 +264,8 @@ func TestKubernetes(t *testing.T) { {"range nodes capacity", `{range .items[*]}[{.metadata.name}, {.status.capacity}] {end}`, nodesData, "[127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] "}, {"user password", `{.users[?(@.name=="e2e")].user.password}`, &nodesData, "secret"}, + {"hostname", `{.items[0].metadata.labels.kubernetes\.io/hostname}`, &nodesData, "127.0.0.1"}, + {"hostname filter", `{.items[?(@.metadata.labels.kubernetes\.io/hostname=="127.0.0.1")].kind}`, &nodesData, "None"}, } testJSONPath(nodesTests, t) diff --git a/pkg/util/jsonpath/parser.go b/pkg/util/jsonpath/parser.go index 1ff82a3b9cb..2883f7897fb 100644 --- a/pkg/util/jsonpath/parser.go +++ b/pkg/util/jsonpath/parser.go @@ -382,19 +382,21 @@ Loop: // parseField scans a field until a terminator func (p *Parser) parseField(cur *ListNode) error { p.consumeText() - var r rune +Loop: for { - r = p.next() - if isTerminator(r) { + switch r := p.next(); { + case r == '\\': + p.next() + case isTerminator(r): p.backup() - break + break Loop } } value := p.consumeText() if value == "*" { cur.append(newWildcard()) } else { - cur.append(newField(value)) + cur.append(newField(strings.Replace(value, "\\", "", -1))) } return p.parseInsideAction(cur) } From 6787b671525e773357caf9ba094123020516a4b1 Mon Sep 17 00:00:00 2001 From: Joshua Carp Date: Mon, 3 Oct 2016 22:43:22 -0400 Subject: [PATCH 2/3] Factor advance logic into helper function. h/t @brendandburns --- pkg/util/jsonpath/parser.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/pkg/util/jsonpath/parser.go b/pkg/util/jsonpath/parser.go index 2883f7897fb..fd13affdfbc 100644 --- a/pkg/util/jsonpath/parser.go +++ b/pkg/util/jsonpath/parser.go @@ -382,16 +382,7 @@ Loop: // parseField scans a field until a terminator func (p *Parser) parseField(cur *ListNode) error { p.consumeText() -Loop: - for { - switch r := p.next(); { - case r == '\\': - p.next() - case isTerminator(r): - p.backup() - break Loop - } - } + for p.advance() {} value := p.consumeText() if value == "*" { cur.append(newWildcard()) @@ -401,6 +392,18 @@ Loop: return p.parseInsideAction(cur) } +// advance scans until next non-escaped terminator +func (p *Parser) advance() bool { + r := p.next() + if r == '\\' { + p.next() + } else if isTerminator(r) { + p.backup() + return false + } + return true +} + // isTerminator reports whether the input is at valid termination character to appear after an identifier. func isTerminator(r rune) bool { if isSpace(r) || isEndOfLine(r) { From b48deebc7a67f86c091f6e03437d73f5327689b7 Mon Sep 17 00:00:00 2001 From: Joshua Carp Date: Fri, 14 Oct 2016 00:35:44 -0400 Subject: [PATCH 3/3] Run gofmt. --- pkg/util/jsonpath/parser.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/util/jsonpath/parser.go b/pkg/util/jsonpath/parser.go index fd13affdfbc..7dc38d31fc3 100644 --- a/pkg/util/jsonpath/parser.go +++ b/pkg/util/jsonpath/parser.go @@ -382,7 +382,8 @@ Loop: // parseField scans a field until a terminator func (p *Parser) parseField(cur *ListNode) error { p.consumeText() - for p.advance() {} + for p.advance() { + } value := p.consumeText() if value == "*" { cur.append(newWildcard())