From 83dd38543091da144b6515e0387550f4310474cf Mon Sep 17 00:00:00 2001 From: rick <1450685+LinuxSuRen@users.noreply.github.com> Date: Wed, 26 Apr 2023 03:14:26 +0800 Subject: [PATCH 1/2] feat: support to verify specific k8s resources count --- pkg/runner/kubernetes/client.go | 15 +++++++++++++++ pkg/runner/kubernetes/verify_test.go | 7 ++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pkg/runner/kubernetes/client.go b/pkg/runner/kubernetes/client.go index 88bb7722..35c94cce 100644 --- a/pkg/runner/kubernetes/client.go +++ b/pkg/runner/kubernetes/client.go @@ -76,6 +76,8 @@ func GetClient() *http.Client { // ResourceValidator represents a generic resource validator type ResourceValidator interface { Exist() bool + Count() int + ExpectCount(int) bool ExpectField(value interface{}, fields ...string) bool } @@ -92,6 +94,19 @@ func (v *defaultResourceValidator) Exist() bool { return v.data != nil && len(v.data) > 0 } +func (v *defaultResourceValidator) Count() int { + val, ok, err := unstructured.NestedField(v.data, "items") + if ok && err == nil { + items := val.([]interface{}) + return len(items) + } + return -1 +} + +func (v *defaultResourceValidator) ExpectCount(expect int) bool { + return expect == v.Count() +} + func (v *defaultResourceValidator) ExpectField(value interface{}, fields ...string) (result bool) { val, ok, err := unstructured.NestedField(v.data, fields...) if !ok || err != nil { diff --git a/pkg/runner/kubernetes/verify_test.go b/pkg/runner/kubernetes/verify_test.go index fa324078..455206ed 100644 --- a/pkg/runner/kubernetes/verify_test.go +++ b/pkg/runner/kubernetes/verify_test.go @@ -70,6 +70,11 @@ func TestKubernetesValidatorFunc(t *testing.T) { expression: `k8s("daemonsets", "ns", "foo").Exist()`, prepare: prepareDaemonset, expectBool: true, + }, { + name: "daemonset count", + expression: `k8s("daemonsets", "ns", "foo").ExpectCount(0)`, + prepare: prepareDaemonset, + expectBool: true, }, { name: "no kind", expression: `k8s({"foo": "bar"}, "ns", "foo").Exist()`, @@ -121,7 +126,7 @@ func prepareDaemonset() { Get("/apis/apps/v1/namespaces/ns/daemonsets/foo"). MatchHeader("Authorization", defaultToken). Reply(http.StatusOK). - JSON(`{"kind":"daemonset"}`) + JSON(`{"kind":"daemonset","items":[]}`) } func prepareCRDVM() { From d11657d5813a96e4b6248954edfd530be6366e9c Mon Sep 17 00:00:00 2001 From: rick <1450685+LinuxSuRen@users.noreply.github.com> Date: Wed, 26 Apr 2023 03:15:59 +0800 Subject: [PATCH 2/2] feat: support to verify specific k8s resources count --- pkg/runner/kubernetes/client.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/runner/kubernetes/client.go b/pkg/runner/kubernetes/client.go index 35c94cce..caa06339 100644 --- a/pkg/runner/kubernetes/client.go +++ b/pkg/runner/kubernetes/client.go @@ -86,6 +86,7 @@ type defaultResourceValidator struct { err error } +// Exist returns true if the specific resource exist func (v *defaultResourceValidator) Exist() bool { if v.err != nil { fmt.Println(v.err) @@ -94,6 +95,7 @@ func (v *defaultResourceValidator) Exist() bool { return v.data != nil && len(v.data) > 0 } +// Count returns the count of the specific resources func (v *defaultResourceValidator) Count() int { val, ok, err := unstructured.NestedField(v.data, "items") if ok && err == nil { @@ -103,10 +105,12 @@ func (v *defaultResourceValidator) Count() int { return -1 } +// ExpectCount returns true if there are specific number of the target k8s resources func (v *defaultResourceValidator) ExpectCount(expect int) bool { return expect == v.Count() } +// ExpectField verify the specific field and value func (v *defaultResourceValidator) ExpectField(value interface{}, fields ...string) (result bool) { val, ok, err := unstructured.NestedField(v.data, fields...) if !ok || err != nil {