Skip to content

Commit

Permalink
Escape special characters in jsonpath field names.
Browse files Browse the repository at this point in the history
Example: `{.items[*].metadata.labels.kubernetes\.io/hostname}`

[Resolves kubernetes#31984]
  • Loading branch information
jmcarp authored and tallclair committed Oct 20, 2016
1 parent 312a9e1 commit 6597e76
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
16 changes: 14 additions & 2 deletions pkg/util/jsonpath/jsonpath_test.go
Expand Up @@ -212,15 +212,25 @@ 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"}]
}
},
{
"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":[
Expand Down Expand Up @@ -260,6 +270,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, false, t)

Expand Down
12 changes: 7 additions & 5 deletions pkg/util/jsonpath/parser.go
Expand Up @@ -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)
}
Expand Down

0 comments on commit 6597e76

Please sign in to comment.