mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 13:37:30 +00:00
Merge pull request #33901 from jmcarp/issue-31984
Automatic merge from submit-queue Escape special characters in jsonpath field names. There may be a better way to do this, but this seemed like the simplest possible version. Example: `{.items[*].metadata.labels.kubernetes\.io/hostname}` [Resolves #31984]
This commit is contained in:
commit
f98c06b1bb
@ -212,7 +212,12 @@ func TestKubernetes(t *testing.T) {
|
|||||||
"items":[
|
"items":[
|
||||||
{
|
{
|
||||||
"kind":"None",
|
"kind":"None",
|
||||||
"metadata":{"name":"127.0.0.1"},
|
"metadata":{
|
||||||
|
"name":"127.0.0.1",
|
||||||
|
"labels":{
|
||||||
|
"kubernetes.io/hostname":"127.0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"status":{
|
"status":{
|
||||||
"capacity":{"cpu":"4"},
|
"capacity":{"cpu":"4"},
|
||||||
"addresses":[{"type": "LegacyHostIP", "address":"127.0.0.1"}]
|
"addresses":[{"type": "LegacyHostIP", "address":"127.0.0.1"}]
|
||||||
@ -220,7 +225,12 @@ func TestKubernetes(t *testing.T) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"kind":"None",
|
"kind":"None",
|
||||||
"metadata":{"name":"127.0.0.2"},
|
"metadata":{
|
||||||
|
"name":"127.0.0.2",
|
||||||
|
"labels":{
|
||||||
|
"kubernetes.io/hostname":"127.0.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"status":{
|
"status":{
|
||||||
"capacity":{"cpu":"8"},
|
"capacity":{"cpu":"8"},
|
||||||
"addresses":[
|
"addresses":[
|
||||||
@ -260,6 +270,8 @@ func TestKubernetes(t *testing.T) {
|
|||||||
{"range nodes capacity", `{range .items[*]}[{.metadata.name}, {.status.capacity}] {end}`, nodesData,
|
{"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]] "},
|
"[127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]] "},
|
||||||
{"user password", `{.users[?(@.name=="e2e")].user.password}`, &nodesData, "secret"},
|
{"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)
|
testJSONPath(nodesTests, false, t)
|
||||||
|
|
||||||
|
@ -382,23 +382,29 @@ Loop:
|
|||||||
// parseField scans a field until a terminator
|
// parseField scans a field until a terminator
|
||||||
func (p *Parser) parseField(cur *ListNode) error {
|
func (p *Parser) parseField(cur *ListNode) error {
|
||||||
p.consumeText()
|
p.consumeText()
|
||||||
var r rune
|
for p.advance() {
|
||||||
for {
|
|
||||||
r = p.next()
|
|
||||||
if isTerminator(r) {
|
|
||||||
p.backup()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
value := p.consumeText()
|
value := p.consumeText()
|
||||||
if value == "*" {
|
if value == "*" {
|
||||||
cur.append(newWildcard())
|
cur.append(newWildcard())
|
||||||
} else {
|
} else {
|
||||||
cur.append(newField(value))
|
cur.append(newField(strings.Replace(value, "\\", "", -1)))
|
||||||
}
|
}
|
||||||
return p.parseInsideAction(cur)
|
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.
|
// isTerminator reports whether the input is at valid termination character to appear after an identifier.
|
||||||
func isTerminator(r rune) bool {
|
func isTerminator(r rune) bool {
|
||||||
if isSpace(r) || isEndOfLine(r) {
|
if isSpace(r) || isEndOfLine(r) {
|
||||||
|
Loading…
Reference in New Issue
Block a user