Skip to content

Commit fc8e24c

Browse files
committed
Add watchtools.Until for fetching watch events; Remove plain watch
1 parent 9c2330d commit fc8e24c

File tree

1 file changed

+122
-92
lines changed

1 file changed

+122
-92
lines changed

test/e2e/apps/deployment.go

Lines changed: 122 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ var _ = SIGDescribe("Deployment", func() {
157157
testDeploymentLabelSelectors := metav1.LabelSelector{
158158
MatchLabels: testDeploymentLabels,
159159
}
160+
w := &cache.ListWatch{
161+
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
162+
options.LabelSelector = testDeploymentLabelsFlat
163+
return f.ClientSet.AppsV1().Deployments(testNamespaceName).Watch(context.TODO(), options)
164+
},
165+
}
166+
deploymentsList, err := f.ClientSet.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{LabelSelector: testDeploymentLabelsFlat})
167+
framework.ExpectNoError(err, "failed to list Endpoints")
160168

161169
ginkgo.By("creating a Deployment")
162170
testDeployment := appsv1.Deployment{
@@ -180,36 +188,41 @@ var _ = SIGDescribe("Deployment", func() {
180188
},
181189
},
182190
}
183-
_, err := f.ClientSet.AppsV1().Deployments(testNamespaceName).Create(context.TODO(), &testDeployment, metav1.CreateOptions{})
191+
_, err = f.ClientSet.AppsV1().Deployments(testNamespaceName).Create(context.TODO(), &testDeployment, metav1.CreateOptions{})
184192
framework.ExpectNoError(err, "failed to create Deployment %v in namespace %v", testDeploymentName, testNamespaceName)
185193

186-
ginkgo.By("watching for the Deployment to be added")
187-
dplmtWatchTimeoutSeconds := int64(180)
188-
dplmtWatch, err := f.ClientSet.AppsV1().Deployments(testNamespaceName).Watch(context.TODO(), metav1.ListOptions{LabelSelector: testDeploymentLabelsFlat, TimeoutSeconds: &dplmtWatchTimeoutSeconds})
189-
framework.ExpectNoError(err, "Failed to setup watch on newly created Deployment")
190-
191-
foundEvent := false
192-
dplmtWatchChan := dplmtWatch.ResultChan()
193-
for event := range dplmtWatchChan {
194-
if event.Type == watch.Added {
195-
foundEvent = true
196-
break
194+
ginkgo.By("waiting for Deployment to be created")
195+
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
196+
defer cancel()
197+
_, err = watchtools.Until(ctx, deploymentsList.ResourceVersion, w, func(event watch.Event) (bool, error) {
198+
switch event.Type {
199+
case watch.Added:
200+
if deployment, ok := event.Object.(*appsv1.Deployment); ok {
201+
found := deployment.ObjectMeta.Name == testDeployment.Name &&
202+
deployment.Labels["test-deployment-static"] == "true"
203+
return found, nil
204+
}
205+
default:
206+
framework.Logf("observed event type %v", event.Type)
197207
}
198-
}
199-
framework.ExpectEqual(foundEvent, true, "failed to find watch event %v", watch.Added)
208+
return false, nil
209+
})
210+
framework.ExpectNoError(err, "failed to see %v event", watch.Added)
200211

201212
ginkgo.By("waiting for all Replicas to be Ready")
202-
foundEvent = false
203-
for event := range dplmtWatchChan {
204-
deployment, ok := event.Object.(*appsv1.Deployment)
205-
framework.ExpectEqual(ok, true, "unable to convert event.Object type")
206-
if deployment.Status.AvailableReplicas == testDeploymentDefaultReplicas &&
207-
deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas {
208-
foundEvent = true
209-
break
213+
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
214+
defer cancel()
215+
_, err = watchtools.Until(ctx, deploymentsList.ResourceVersion, w, func(event watch.Event) (bool, error) {
216+
if deployment, ok := event.Object.(*appsv1.Deployment); ok {
217+
found := deployment.ObjectMeta.Name == testDeployment.Name &&
218+
deployment.Labels["test-deployment-static"] == "true" &&
219+
deployment.Status.AvailableReplicas == testDeploymentDefaultReplicas &&
220+
deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas
221+
return found, nil
210222
}
211-
}
212-
framework.ExpectEqual(foundEvent, true, "failed to see scale of replicas")
223+
return false, nil
224+
})
225+
framework.ExpectNoError(err, "failed to see replicas of %v in namespace %v scale to requested amount of %v", testDeployment.Name, testNamespaceName, testDeploymentDefaultReplicas)
213226

214227
ginkgo.By("patching the Deployment")
215228
deploymentPatch, err := json.Marshal(map[string]interface{}{
@@ -233,30 +246,23 @@ var _ = SIGDescribe("Deployment", func() {
233246
_, err = f.ClientSet.AppsV1().Deployments(testNamespaceName).Patch(context.TODO(), testDeploymentName, types.StrategicMergePatchType, []byte(deploymentPatch), metav1.PatchOptions{})
234247
framework.ExpectNoError(err, "failed to patch Deployment")
235248

236-
foundEvent = false
237-
for event := range dplmtWatchChan {
238-
if event.Type == watch.Modified {
239-
foundEvent = true
240-
break
241-
}
242-
}
243-
framework.ExpectEqual(foundEvent, true, "failed to see scale of replicas")
244-
245249
ginkgo.By("waiting for Replicas to scale")
246-
foundEvent = false
247-
for event := range dplmtWatchChan {
248-
deployment, ok := event.Object.(*appsv1.Deployment)
249-
framework.ExpectEqual(ok, true, "unable to convert event.Object type")
250-
if deployment.Status.AvailableReplicas == testDeploymentMinimumReplicas &&
251-
deployment.Status.ReadyReplicas == testDeploymentMinimumReplicas {
252-
foundEvent = true
253-
break
250+
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
251+
defer cancel()
252+
_, err = watchtools.Until(ctx, deploymentsList.ResourceVersion, w, func(event watch.Event) (bool, error) {
253+
if deployment, ok := event.Object.(*appsv1.Deployment); ok {
254+
found := deployment.ObjectMeta.Name == testDeployment.Name &&
255+
deployment.Labels["test-deployment-static"] == "true" &&
256+
deployment.Status.AvailableReplicas == testDeploymentMinimumReplicas &&
257+
deployment.Status.ReadyReplicas == testDeploymentMinimumReplicas
258+
return found, nil
254259
}
255-
}
256-
framework.ExpectEqual(foundEvent, true, "failed to see scale of replicas")
260+
return false, nil
261+
})
262+
framework.ExpectNoError(err, "failed to see replicas of %v in namespace %v scale to requested amount of %v", testDeployment.Name, testNamespaceName, testDeploymentMinimumReplicas)
257263

258264
ginkgo.By("listing Deployments")
259-
deploymentsList, err := f.ClientSet.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{LabelSelector: testDeploymentLabelsFlat})
265+
deploymentsList, err = f.ClientSet.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{LabelSelector: testDeploymentLabelsFlat})
260266
framework.ExpectNoError(err, "failed to list Deployments")
261267
foundDeployment := false
262268
for _, deploymentItem := range deploymentsList.Items {
@@ -285,14 +291,22 @@ var _ = SIGDescribe("Deployment", func() {
285291
// currently this hasn't been able to hit the endpoint replaceAppsV1NamespacedDeploymentStatus
286292
_, err = dc.Resource(deploymentResource).Namespace(testNamespaceName).Update(context.TODO(), &testDeploymentUpdateUnstructured, metav1.UpdateOptions{}) //, "status")
287293
framework.ExpectNoError(err, "failed to update the DeploymentStatus")
288-
foundEvent = false
289-
for event := range dplmtWatchChan {
290-
if event.Type == watch.Modified {
291-
foundEvent = true
292-
break
294+
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
295+
defer cancel()
296+
_, err = watchtools.Until(ctx, deploymentsList.ResourceVersion, w, func(event watch.Event) (bool, error) {
297+
switch event.Type {
298+
case watch.Modified:
299+
if deployment, ok := event.Object.(*appsv1.Deployment); ok {
300+
found := deployment.ObjectMeta.Name == testDeployment.Name &&
301+
deployment.Labels["test-deployment-static"] == "true"
302+
return found, nil
303+
}
304+
default:
305+
framework.Logf("observed event type %v", event.Type)
293306
}
294-
}
295-
framework.ExpectEqual(foundEvent, true, "failed to find watch event %v", watch.Modified)
307+
return false, nil
308+
})
309+
framework.ExpectNoError(err, "failed to see %v event", watch.Modified)
296310

297311
ginkgo.By("fetching the DeploymentStatus")
298312
deploymentGetUnstructured, err := dc.Resource(deploymentResource).Namespace(testNamespaceName).Get(context.TODO(), testDeploymentName, metav1.GetOptions{}, "status")
@@ -302,25 +316,20 @@ var _ = SIGDescribe("Deployment", func() {
302316
framework.ExpectNoError(err, "failed to convert the unstructured response to a Deployment")
303317
framework.ExpectEqual(deploymentGet.Spec.Template.Spec.Containers[0].Image, testDeploymentUpdateImage, "failed to update image")
304318
framework.ExpectEqual(deploymentGet.ObjectMeta.Labels["test-deployment"], "updated", "failed to update labels")
305-
foundEvent = false
306-
for event := range dplmtWatchChan {
307-
if event.Type == watch.Modified {
308-
foundEvent = true
309-
break
310-
}
311-
}
312-
framework.ExpectEqual(foundEvent, true, "failed to find watch event %v", watch.Modified)
313-
314-
foundEvent = false
315-
for event := range dplmtWatchChan {
316-
deployment, ok := event.Object.(*appsv1.Deployment)
317-
framework.ExpectEqual(ok, true, "unable to convert event.Object type")
318-
if deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas {
319-
foundEvent = true
320-
break
319+
320+
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
321+
defer cancel()
322+
_, err = watchtools.Until(ctx, deploymentsList.ResourceVersion, w, func(event watch.Event) (bool, error) {
323+
if deployment, ok := event.Object.(*appsv1.Deployment); ok {
324+
found := deployment.ObjectMeta.Name == testDeployment.Name &&
325+
deployment.Labels["test-deployment-static"] == "true" &&
326+
deployment.Status.AvailableReplicas == testDeploymentDefaultReplicas &&
327+
deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas
328+
return found, nil
321329
}
322-
}
323-
framework.ExpectEqual(foundEvent, true, "failed to see scale of replicas")
330+
return false, nil
331+
})
332+
framework.ExpectNoError(err, "failed to see replicas of %v in namespace %v scale to requested amount of %v", testDeployment.Name, testNamespaceName, testDeploymentDefaultReplicas)
324333

325334
ginkgo.By("patching the DeploymentStatus")
326335
deploymentStatusPatch, err := json.Marshal(map[string]interface{}{
@@ -333,6 +342,22 @@ var _ = SIGDescribe("Deployment", func() {
333342
})
334343
framework.ExpectNoError(err, "failed to Marshal Deployment JSON patch")
335344
dc.Resource(deploymentResource).Namespace(testNamespaceName).Patch(context.TODO(), testDeploymentName, types.StrategicMergePatchType, []byte(deploymentStatusPatch), metav1.PatchOptions{}, "status")
345+
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
346+
defer cancel()
347+
_, err = watchtools.Until(ctx, deploymentsList.ResourceVersion, w, func(event watch.Event) (bool, error) {
348+
switch event.Type {
349+
case watch.Modified:
350+
if deployment, ok := event.Object.(*appsv1.Deployment); ok {
351+
found := deployment.ObjectMeta.Name == testDeployment.Name &&
352+
deployment.Labels["test-deployment-static"] == "true"
353+
return found, nil
354+
}
355+
default:
356+
framework.Logf("observed event type %v", event.Type)
357+
}
358+
return false, nil
359+
})
360+
framework.ExpectNoError(err, "failed to see %v event", watch.Modified)
336361

337362
ginkgo.By("fetching the DeploymentStatus")
338363
deploymentGetUnstructured, err = dc.Resource(deploymentResource).Namespace(testNamespaceName).Get(context.TODO(), testDeploymentName, metav1.GetOptions{}, "status")
@@ -342,36 +367,41 @@ var _ = SIGDescribe("Deployment", func() {
342367
framework.ExpectNoError(err, "failed to convert the unstructured response to a Deployment")
343368
framework.ExpectEqual(deploymentGet.Spec.Template.Spec.Containers[0].Image, testDeploymentUpdateImage, "failed to update image")
344369
framework.ExpectEqual(deploymentGet.ObjectMeta.Labels["test-deployment"], "updated", "failed to update labels")
345-
foundEvent = false
346-
for event := range dplmtWatchChan {
347-
if event.Type == watch.Modified {
348-
foundEvent = true
349-
break
370+
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
371+
defer cancel()
372+
_, err = watchtools.Until(ctx, deploymentsList.ResourceVersion, w, func(event watch.Event) (bool, error) {
373+
if deployment, ok := event.Object.(*appsv1.Deployment); ok {
374+
found := deployment.ObjectMeta.Name == testDeployment.Name &&
375+
deployment.Labels["test-deployment-static"] == "true" &&
376+
deployment.Status.AvailableReplicas == testDeploymentDefaultReplicas &&
377+
deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas &&
378+
deployment.Spec.Template.Spec.Containers[0].Image == testDeploymentUpdateImage
379+
return found, nil
350380
}
351-
}
352-
framework.ExpectEqual(foundEvent, true, "failed to find watch event %v", watch.Modified)
353-
for event := range dplmtWatchChan {
354-
deployment, ok := event.Object.(*appsv1.Deployment)
355-
framework.ExpectEqual(ok, true, "unable to convert event.Object type")
356-
if deployment.Status.ReadyReplicas == testDeploymentDefaultReplicas {
357-
break
358-
}
359-
}
381+
return false, nil
382+
})
383+
framework.ExpectNoError(err, "failed to see replicas of %v in namespace %v scale to requested amount of %v", testDeployment.Name, testNamespaceName, testDeploymentDefaultReplicas)
360384

361385
ginkgo.By("deleting the Deployment")
362386
err = f.ClientSet.AppsV1().Deployments(testNamespaceName).DeleteCollection(context.TODO(), metav1.DeleteOptions{}, metav1.ListOptions{LabelSelector: testDeploymentLabelsFlat})
363387
framework.ExpectNoError(err, "failed to delete Deployment via collection")
364388

365-
foundEvent = false
366-
for event := range dplmtWatchChan {
367-
deployment, ok := event.Object.(*appsv1.Deployment)
368-
framework.ExpectEqual(ok, true, "unable to convert event.Object type")
369-
if event.Type == watch.Deleted && deployment.ObjectMeta.Name == testDeploymentName {
370-
foundEvent = true
371-
break
389+
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
390+
defer cancel()
391+
_, err = watchtools.Until(ctx, deploymentsList.ResourceVersion, w, func(event watch.Event) (bool, error) {
392+
switch event.Type {
393+
case watch.Deleted:
394+
if deployment, ok := event.Object.(*appsv1.Deployment); ok {
395+
found := deployment.ObjectMeta.Name == testDeployment.Name &&
396+
deployment.Labels["test-deployment-static"] == "true"
397+
return found, nil
398+
}
399+
default:
400+
framework.Logf("observed event type %v", event.Type)
372401
}
373-
}
374-
framework.ExpectEqual(foundEvent, true, "failed to find watch event %v", watch.Deleted)
402+
return false, nil
403+
})
404+
framework.ExpectNoError(err, "failed to see %v event", watch.Deleted)
375405
})
376406
})
377407

0 commit comments

Comments
 (0)