Skip to content

Commit 46ff919

Browse files
authored
[chore] Fix flaky test (#1722)
Explicitly wait for CRDs creation and namespace deletion
1 parent 7c98c3c commit 46ff919

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

functional_tests/functional/functional_test.go

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
corev1 "k8s.io/api/core/v1"
3535
appextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3636
"k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
37+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
3738
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3839
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3940
k8sruntime "k8s.io/apimachinery/pkg/runtime"
@@ -147,6 +148,20 @@ func deployChartsAndApps(t *testing.T, testKubeConfig string) {
147148
crd, err := apiExtensions.Create(context.Background(), crd, metav1.CreateOptions{})
148149
require.NoError(t, err)
149150
t.Logf("Deployed CRD %s", crd.Name)
151+
152+
// Wait for CRD to be Established before moving on
153+
require.EventuallyWithT(t, func(tt *assert.CollectT) {
154+
latest, getErr := apiExtensions.Get(context.Background(), crd.Name, metav1.GetOptions{})
155+
assert.NoError(tt, getErr)
156+
established := false
157+
for _, cond := range latest.Status.Conditions {
158+
if cond.Type == appextensionsv1.Established && cond.Status == appextensionsv1.ConditionTrue {
159+
established = true
160+
}
161+
}
162+
assert.True(tt, established)
163+
}, 3*time.Minute, 3*time.Second, "CRD %s not established", crd.Name)
164+
150165
for _, version := range crd.Spec.Versions {
151166
sch.AddKnownTypeWithName(
152167
schema.GroupVersionKind{
@@ -162,28 +177,19 @@ func deployChartsAndApps(t *testing.T, testKubeConfig string) {
162177

163178
codecs := serializer.NewCodecFactory(sch)
164179
crdDecode := codecs.UniversalDeserializer().Decode
180+
165181
// Prometheus pod monitor
166182
stream, err = os.ReadFile(filepath.Join(testDir, manifestsDir, "pod_monitor.yaml"))
167183
require.NoError(t, err)
168-
169184
podMonitor, _, err := crdDecode(stream, nil, nil)
170185
require.NoError(t, err)
171186
g := schema.GroupVersionResource{
172187
Group: "monitoring.coreos.com",
173188
Version: "v1",
174189
Resource: "podmonitors",
175190
}
176-
// CRDs sometimes take time to register. We retry deploying the pod monitor until such a time all CRDs are deployed.
177-
require.EventuallyWithT(t, func(tt *assert.CollectT) {
178-
_, err = dynamicClient.Resource(g).Namespace("default").Create(context.Background(), podMonitor.(*unstructured.Unstructured), metav1.CreateOptions{})
179-
if err != nil {
180-
_, err2 := dynamicClient.Resource(g).Namespace("default").Update(context.Background(), podMonitor.(*unstructured.Unstructured), metav1.UpdateOptions{})
181-
assert.NoError(tt, err2)
182-
if err2 != nil {
183-
assert.NoError(tt, err)
184-
}
185-
}
186-
}, 1*time.Minute, 5*time.Second)
191+
_, err = dynamicClient.Resource(g).Namespace("default").Create(context.Background(), podMonitor.(*unstructured.Unstructured), metav1.CreateOptions{})
192+
assert.NoError(t, err)
187193

188194
chart := internal.LoadCollectorChart(t)
189195

@@ -361,13 +367,8 @@ func deployChartsAndApps(t *testing.T, testKubeConfig string) {
361367
Resource: "servicemonitors",
362368
}
363369
_, err = dynamicClient.Resource(g).Namespace("default").Create(context.Background(), serviceMonitor.(*unstructured.Unstructured), metav1.CreateOptions{})
364-
if err != nil {
365-
_, err2 := dynamicClient.Resource(g).Namespace("default").Update(context.Background(), serviceMonitor.(*unstructured.Unstructured), metav1.UpdateOptions{})
366-
assert.NoError(t, err2)
367-
if err2 != nil {
368-
require.NoError(t, err)
369-
}
370-
}
370+
assert.NoError(t, err)
371+
371372
// Read jobs
372373
jobstream, err := os.ReadFile(filepath.Join(testDir, manifestsDir, "test_jobs.yaml"))
373374
require.NoError(t, err)
@@ -526,6 +527,10 @@ func teardown(t *testing.T, testKubeConfig string) {
526527
_ = nmClient.Delete(context.Background(), nm.Name, metav1.DeleteOptions{
527528
GracePeriodSeconds: &waitTime,
528529
})
530+
require.Eventually(t, func() bool {
531+
_, err := client.CoreV1().Namespaces().Get(context.Background(), nm.Name, metav1.GetOptions{})
532+
return k8serrors.IsNotFound(err)
533+
}, 3*time.Minute, 3*time.Second, "namespace %s not removed in time", nm.Name)
529534
}
530535
actionConfig := new(action.Configuration)
531536
if err := actionConfig.Init(kube.GetConfig(testKubeConfig, "", "default"), "default", os.Getenv("HELM_DRIVER"), func(format string, v ...interface{}) {

0 commit comments

Comments
 (0)