From e9d98543644b7b59b17c38a0af4ca500ab7e2644 Mon Sep 17 00:00:00 2001 From: Austin Abro Date: Mon, 6 Jan 2025 16:50:40 +0000 Subject: [PATCH] introduce test for status wait Signed-off-by: Austin Abro --- pkg/kube/statuswait.go | 8 ++++---- pkg/kube/statuswait_test.go | 33 +++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/pkg/kube/statuswait.go b/pkg/kube/statuswait.go index bb92ae74e..a4590aa42 100644 --- a/pkg/kube/statuswait.go +++ b/pkg/kube/statuswait.go @@ -75,7 +75,7 @@ func (w *statusWaiter) waitForDelete(ctx context.Context, resourceList ResourceL } eventCh := w.sw.Watch(cancelCtx, resources, watcher.Options{}) statusCollector := collector.NewResourceStatusCollector(resources) - go logResource(ctx, resources, statusCollector, status.NotFoundStatus, w.log) + go logResourceStatus(ctx, resources, statusCollector, status.NotFoundStatus, w.log) done := statusCollector.ListenWithObserver(eventCh, statusObserver(cancel, status.NotFoundStatus)) <-done @@ -128,7 +128,7 @@ func (w *statusWaiter) wait(ctx context.Context, resourceList ResourceList, wait } eventCh := w.sw.Watch(cancelCtx, resources, watcher.Options{}) statusCollector := collector.NewResourceStatusCollector(resources) - go logResource(cancelCtx, resources, statusCollector, status.CurrentStatus, w.log) + go logResourceStatus(cancelCtx, resources, statusCollector, status.CurrentStatus, w.log) done := statusCollector.ListenWithObserver(eventCh, statusObserver(cancel, status.CurrentStatus)) <-done @@ -168,7 +168,7 @@ func statusObserver(cancel context.CancelFunc, desired status.Status) collector. } } -func logResource(ctx context.Context, resources []object.ObjMetadata, sc *collector.ResourceStatusCollector, desiredStatus status.Status, log func(string, ...interface{})) { +func logResourceStatus(ctx context.Context, resources []object.ObjMetadata, sc *collector.ResourceStatusCollector, desiredStatus status.Status, log func(string, ...interface{})) { ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() for { @@ -179,7 +179,7 @@ func logResource(ctx context.Context, resources []object.ObjMetadata, sc *collec for _, id := range resources { rs := sc.ResourceStatuses[id] if rs.Status != desiredStatus { - log("waiting for resource, name: %s, kind: %s, desired status: %s, actual status: %s\n", rs.Identifier.Name, rs.Identifier.GroupKind.Kind, desiredStatus, rs.Status) + log("waiting for resource, name: %s, kind: %s, desired status: %s, actual status: %s", rs.Identifier.Name, rs.Identifier.GroupKind.Kind, desiredStatus, rs.Status) // only log one resource to not overwhelm the logs break } diff --git a/pkg/kube/statuswait_test.go b/pkg/kube/statuswait_test.go index 945131a5e..e94e13313 100644 --- a/pkg/kube/statuswait_test.go +++ b/pkg/kube/statuswait_test.go @@ -35,7 +35,11 @@ import ( "k8s.io/apimachinery/pkg/util/yaml" dynamicfake "k8s.io/client-go/dynamic/fake" "k8s.io/kubectl/pkg/scheme" + "sigs.k8s.io/cli-utils/pkg/kstatus/polling/collector" + "sigs.k8s.io/cli-utils/pkg/kstatus/polling/event" + "sigs.k8s.io/cli-utils/pkg/kstatus/status" "sigs.k8s.io/cli-utils/pkg/kstatus/watcher" + "sigs.k8s.io/cli-utils/pkg/object" "sigs.k8s.io/cli-utils/pkg/testutil" ) @@ -115,8 +119,29 @@ func getGVR(t *testing.T, mapper meta.RESTMapper, obj *unstructured.Unstructured require.NoError(t, err) return mapping.Resource } -func testLogger(message string, args ...interface{}) { - fmt.Printf(message, args...) + +func TestStatusLogger(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*1500) + defer cancel() + readyPod := object.ObjMetadata{ + Name: "readyPod", + GroupKind: schema.GroupKind{Kind: "Pod"}, + } + notReadyPod := object.ObjMetadata{ + Name: "notReadyPod", + GroupKind: schema.GroupKind{Kind: "Pod"}, + } + objs := []object.ObjMetadata{readyPod, notReadyPod} + resourceStatusCollector := collector.NewResourceStatusCollector(objs) + resourceStatusCollector.ResourceStatuses[readyPod] = &event.ResourceStatus{ + Identifier: readyPod, + Status: status.CurrentStatus, + } + expectedMessage := "waiting for resource, name: notReadyPod, kind: Pod, desired status: Current, actual status: Unknown" + testLogger := func(message string, args ...interface{}) { + assert.Equal(t, expectedMessage, fmt.Sprintf(message, args...)) + } + logResourceStatus(ctx, objs, resourceStatusCollector, status.CurrentStatus, testLogger) } func TestStatusWaitForDelete(t *testing.T) { @@ -155,7 +180,7 @@ func TestStatusWaitForDelete(t *testing.T) { statusWatcher := watcher.NewDefaultStatusWatcher(fakeClient, fakeMapper) statusWaiter := statusWaiter{ sw: statusWatcher, - log: testLogger, + log: t.Logf, } createdObjs := []runtime.Object{} for _, objYaml := range tt.objToCreate { @@ -252,7 +277,7 @@ func TestStatusWait(t *testing.T) { statusWatcher := watcher.NewDefaultStatusWatcher(fakeClient, fakeMapper) statusWaiter := statusWaiter{ sw: statusWatcher, - log: testLogger, + log: t.Logf, } objs := []runtime.Object{}