From b6d16d4e18e3319b840f24fe68501a128db2b231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20=C4=8Cern=C3=ADn?= Date: Thu, 14 Jan 2021 19:53:59 +1000 Subject: [PATCH] [jsonpath] fix wrong output when using jsonpath Fix range loop when using jsonpath Without patch: kubectl get -n openshift-oauth-apiserver po -o jsonpath='{range .items[?(.status.phase=="Running")]}{.metadata.name}{" is Running\n"}' apiserver-7d9cc97649-79c2x is Running apiserver-7d9cc97649-lgks6 is Running apiserver-7d9cc97649-qgkxn is Running is Running With patch: kubectl get -n openshift-oauth-apiserver po -o jsonpath='{range .items[?(.status.phase=="Running")]}{.metadata.name}{" is Running\n"}' apiserver-7d9cc97649-79c2x is Running apiserver-7d9cc97649-lgks6 is Running apiserver-7d9cc97649-qgkxn is Running Kubernetes-commit: 39cfe232325d66bcdbc935af7aaf7022562e7010 --- util/jsonpath/jsonpath.go | 3 ++ util/jsonpath/jsonpath_test.go | 58 ++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/util/jsonpath/jsonpath.go b/util/jsonpath/jsonpath.go index 49ecd146..0b1dc338 100644 --- a/util/jsonpath/jsonpath.go +++ b/util/jsonpath/jsonpath.go @@ -132,6 +132,9 @@ func (j *JSONPath) FindResults(data interface{}) ([][]reflect.Value, error) { } continue } + if len(results) == 0 { + break + } fullResult = append(fullResult, results) } return fullResult, nil diff --git a/util/jsonpath/jsonpath_test.go b/util/jsonpath/jsonpath_test.go index 34a0f9e7..58ad9384 100644 --- a/util/jsonpath/jsonpath_test.go +++ b/util/jsonpath/jsonpath_test.go @@ -760,6 +760,64 @@ func TestNegativeIndex(t *testing.T) { ) } +func TestRunningPodsJSONPathOutput(t *testing.T) { + var input = []byte(`{ + "kind": "List", + "items": [ + { + "kind": "Pod", + "metadata": { + "name": "pod1" + }, + "status": { + "phase": "Running" + } + }, + { + "kind": "Pod", + "metadata": { + "name": "pod2" + }, + "status": { + "phase": "Running" + } + }, + { + "kind": "Pod", + "metadata": { + "name": "pod3" + }, + "status": { + "phase": "Running" + } + }, + { + "resourceVersion": "", + "selfLink": "" + } + ] + }`) + var data interface{} + err := json.Unmarshal(input, &data) + if err != nil { + t.Fatal(err) + } + + testJSONPath( + []jsonpathTest{ + { + "when range is used in a certain way in script, additional line is printed", + `{range .items[?(.status.phase=="Running")]}{.metadata.name}{" is Running\n"}`, + data, + "pod1 is Running\npod2 is Running\npod3 is Running\n", + false, // expect no error + }, + }, + true, // allow missing keys + t, + ) +} + func TestStep(t *testing.T) { var input = []byte( `{