Skip to content

Commit 4361f8f

Browse files
committed
wait until /metrics are ready on e2e test
Some e2e tests depend on the controller-manager to expose metrics on the path /metrics. It may happen that when the test runs, the pod is not available or the URL not ready, causing it to fail. Previously, the test were waiting until the pod was running, but we need to wait until the /metrics URL is ready.
1 parent cb38560 commit 4361f8f

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

test/e2e/framework/metrics/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ go_library(
2828
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
2929
"//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library",
3030
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
31+
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
3132
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
3233
"//staging/src/k8s.io/component-base/metrics/testutil:go_default_library",
3334
"//test/e2e/framework/log:go_default_library",

test/e2e/framework/metrics/metrics_grabber.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ import (
2020
"context"
2121
"fmt"
2222
"sync"
23+
"time"
2324

2425
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2526
"k8s.io/apimachinery/pkg/fields"
27+
"k8s.io/apimachinery/pkg/util/wait"
2628
clientset "k8s.io/client-go/kubernetes"
2729
"k8s.io/kubernetes/pkg/master/ports"
2830
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
@@ -164,10 +166,27 @@ func (g *Grabber) GrabFromControllerManager() (ControllerManagerMetrics, error)
164166
return ControllerManagerMetrics{}, fmt.Errorf("Master's Kubelet is not registered. Skipping ControllerManager's metrics gathering")
165167
}
166168

169+
var err error
167170
podName := fmt.Sprintf("%v-%v", "kube-controller-manager", g.masterName)
168171
g.waitForControllerManagerReadyOnce.Do(func() {
169-
e2epod.WaitForPodNameRunningInNamespace(g.client, podName, metav1.NamespaceSystem)
172+
if runningErr := e2epod.WaitForPodNameRunningInNamespace(g.client, podName, metav1.NamespaceSystem); runningErr != nil {
173+
err = fmt.Errorf("error waiting for controller manager pod to be running: %w", err)
174+
return
175+
}
176+
177+
var lastMetricsFetchErr error
178+
if metricsWaitErr := wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
179+
_, lastMetricsFetchErr = g.getMetricsFromPod(g.client, podName, metav1.NamespaceSystem, ports.InsecureKubeControllerManagerPort)
180+
return lastMetricsFetchErr == nil, nil
181+
}); metricsWaitErr != nil {
182+
err = fmt.Errorf("error waiting for controller manager pod to expose metrics: %v; %v", err, lastMetricsFetchErr)
183+
return
184+
}
170185
})
186+
if err != nil {
187+
return ControllerManagerMetrics{}, err
188+
}
189+
171190
output, err := g.getMetricsFromPod(g.client, podName, metav1.NamespaceSystem, ports.InsecureKubeControllerManagerPort)
172191
if err != nil {
173192
return ControllerManagerMetrics{}, err

0 commit comments

Comments
 (0)