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:
		| @@ -212,7 +212,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"}] | ||||
| @@ -220,7 +225,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":[ | ||||
| @@ -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) | ||||
|  | ||||
|   | ||||
| @@ -382,23 +382,29 @@ Loop: | ||||
| // parseField scans a field until a terminator | ||||
| func (p *Parser) parseField(cur *ListNode) error { | ||||
| 	p.consumeText() | ||||
| 	var r rune | ||||
| 	for { | ||||
| 		r = p.next() | ||||
| 		if isTerminator(r) { | ||||
| 			p.backup() | ||||
| 			break | ||||
| 		} | ||||
| 	for p.advance() { | ||||
| 	} | ||||
| 	value := p.consumeText() | ||||
| 	if value == "*" { | ||||
| 		cur.append(newWildcard()) | ||||
| 	} else { | ||||
| 		cur.append(newField(value)) | ||||
| 		cur.append(newField(strings.Replace(value, "\\", "", -1))) | ||||
| 	} | ||||
| 	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) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Submit Queue
					Kubernetes Submit Queue