mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +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:
		@@ -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) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user