diff --git a/test/e2e/controller-manager/test_suite_test.go b/test/e2e/controller-manager/test_suite_test.go index 96a1be746..c3e319951 100644 --- a/test/e2e/controller-manager/test_suite_test.go +++ b/test/e2e/controller-manager/test_suite_test.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "os" + "strings" "testing" "time" @@ -122,3 +123,30 @@ func setupControllerManagerE2ETest(t *testing.T) (context.Context, *clientset.Cl require.NoError(t, err, "Failed to create Kubernetes client") return ctx, kthenaClient, kubeClient } + +func waitForWebhookReady(t *testing.T, ctx context.Context, kthenaClient *clientset.Clientset, namespace string) { + t.Helper() + t.Log("Waiting for webhook server to accept requests") + + waitCtx, cancel := context.WithTimeout(ctx, 1*time.Minute) + defer cancel() + + err := wait.PollUntilContextCancel(waitCtx, 2*time.Second, true, func(ctx context.Context) (bool, error) { + probe := createValidModelBoosterForWebhookTest() + probe.Namespace = namespace + probe.Name = "webhook-ready-probe-" + utils.RandomString(5) + + _, err := kthenaClient.WorkloadV1alpha1().ModelBoosters(namespace).Create(ctx, probe, metav1.CreateOptions{DryRun: []string{"All"}}) + if err != nil { + errStr := err.Error() + if strings.Contains(errStr, "connect: connection refused") { + t.Logf("Webhook not ready yet (connection refused), retrying: %v", err) + return false, nil + } + return false, err + } + + return true, nil + }) + require.NoError(t, err, "Webhook did not become ready in time") +} diff --git a/test/e2e/controller-manager/webhook_test.go b/test/e2e/controller-manager/webhook_test.go index b1373d7e6..4ff8d7ef0 100644 --- a/test/e2e/controller-manager/webhook_test.go +++ b/test/e2e/controller-manager/webhook_test.go @@ -30,6 +30,9 @@ import ( func TestWebhook(t *testing.T) { ctx, kthenaClient, _ := setupControllerManagerE2ETest(t) + // waiting for webhook to be ready before running tests + waitForWebhookReady(t, ctx, kthenaClient, testNamespace) + testCases := []struct { name string resource metav1.Object