Skip to content

Commit 92b0e24

Browse files
committed
address comments & update implementation
Signed-off-by: Britania Rodriguez Reyes <britaniar@microsoft.com>
1 parent 9d4979c commit 92b0e24

File tree

8 files changed

+79
-77
lines changed

8 files changed

+79
-77
lines changed

cmd/memberagent/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ var (
9191
driftDetectionInterval = flag.Int("drift-detection-interval", 15, "The interval in seconds between attempts to detect configuration drifts in the cluster.")
9292
watchWorkWithPriorityQueue = flag.Bool("enable-watch-work-with-priority-queue", false, "If set, the apply_work controller will watch/reconcile work objects that are created new or have recent updates")
9393
watchWorkReconcileAgeMinutes = flag.Int("watch-work-reconcile-age", 60, "maximum age (in minutes) of work objects for apply_work controller to watch/reconcile")
94+
deletionWaitTime = flag.Int("deletion-wait-time", 5, "The time the work-applier will wait for work object to be deleted before updating the applied work owner reference")
9495
enablePprof = flag.Bool("enable-pprof", false, "enable pprof profiling")
9596
pprofPort = flag.Int("pprof-port", 6065, "port for pprof profiling")
9697
hubPprofPort = flag.Int("hub-pprof-port", 6066, "port for hub pprof profiling")
@@ -395,6 +396,7 @@ func Start(ctx context.Context, hubCfg, memberConfig *rest.Config, hubOpts, memb
395396
parallelizer.DefaultNumOfWorkers,
396397
time.Second*time.Duration(*availabilityCheckInterval),
397398
time.Second*time.Duration(*driftDetectionInterval),
399+
time.Minute*time.Duration(*deletionWaitTime),
398400
*watchWorkWithPriorityQueue,
399401
*watchWorkReconcileAgeMinutes,
400402
)

pkg/controllers/internalmembercluster/v1beta1/member_suite_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ var _ = BeforeSuite(func() {
379379

380380
// This controller is created for testing purposes only; no reconciliation loop is actually
381381
// run.
382-
workApplier1 = workapplier.NewReconciler(hubClient, member1ReservedNSName, nil, nil, nil, nil, 0, 1, time.Second*5, time.Second*5, true, 60)
382+
workApplier1 = workapplier.NewReconciler(hubClient, member1ReservedNSName, nil, nil, nil, nil, 0, 1, time.Second*5, time.Second*5, time.Minute, true, 60)
383383

384384
propertyProvider1 = &manuallyUpdatedProvider{}
385385
member1Reconciler, err := NewReconciler(ctx, hubClient, member1Cfg, member1Client, workApplier1, propertyProvider1)
@@ -402,7 +402,7 @@ var _ = BeforeSuite(func() {
402402

403403
// This controller is created for testing purposes only; no reconciliation loop is actually
404404
// run.
405-
workApplier2 = workapplier.NewReconciler(hubClient, member2ReservedNSName, nil, nil, nil, nil, 0, 1, time.Second*5, time.Second*5, true, 60)
405+
workApplier2 = workapplier.NewReconciler(hubClient, member2ReservedNSName, nil, nil, nil, nil, 0, 1, time.Second*5, time.Second*5, time.Minute, true, 60)
406406

407407
member2Reconciler, err := NewReconciler(ctx, hubClient, member2Cfg, member2Client, workApplier2, nil)
408408
Expect(err).NotTo(HaveOccurred())

pkg/controllers/workapplier/apply.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -517,10 +517,7 @@ func validateOwnerReferences(
517517
// expected AppliedWork object. For safety reasons, Fleet will still do a sanity check.
518518
found := false
519519
for _, ownerRef := range inMemberClusterObjOwnerRefs {
520-
if ownerRef.UID == expectedAppliedWorkOwnerRef.UID &&
521-
ownerRef.Name == expectedAppliedWorkOwnerRef.Name &&
522-
ownerRef.Kind == expectedAppliedWorkOwnerRef.Kind &&
523-
ownerRef.APIVersion == expectedAppliedWorkOwnerRef.APIVersion {
520+
if ownerRefEqualsExpected(&ownerRef, expectedAppliedWorkOwnerRef) {
524521
found = true
525522
break
526523
}

pkg/controllers/workapplier/controller.go

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ type Reconciler struct {
197197

198198
availabilityCheckRequeueAfter time.Duration
199199
driftCheckRequeueAfter time.Duration
200+
deletionWaitTime time.Duration
200201
}
201202

202203
func NewReconciler(
@@ -207,6 +208,7 @@ func NewReconciler(
207208
workerCount int,
208209
availabilityCheckRequestAfter time.Duration,
209210
driftCheckRequestAfter time.Duration,
211+
deletionWaitTime time.Duration,
210212
watchWorkWithPriorityQueue bool,
211213
watchWorkReconcileAgeMinutes int,
212214
) *Reconciler {
@@ -236,6 +238,7 @@ func NewReconciler(
236238
joined: atomic.NewBool(false),
237239
availabilityCheckRequeueAfter: acRequestAfter,
238240
driftCheckRequeueAfter: dcRequestAfter,
241+
deletionWaitTime: deletionWaitTime,
239242
}
240243
}
241244

@@ -470,74 +473,78 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
470473
return ctrl.Result{RequeueAfter: r.driftCheckRequeueAfter}, nil
471474
}
472475

473-
// garbageCollectAppliedWork deletes the appliedWork and all the manifests associated with it from the cluster.
474476
func (r *Reconciler) garbageCollectAppliedWork(ctx context.Context, work *fleetv1beta1.Work) (ctrl.Result, error) {
475477
deletePolicy := metav1.DeletePropagationForeground
476478
if !controllerutil.ContainsFinalizer(work, fleetv1beta1.WorkFinalizer) {
477479
return ctrl.Result{}, nil
478480
}
479-
// Delete the appliedWork which will remove all the manifests associated with it, unless they have
480-
// other owner references.
481-
appliedWork := fleetv1beta1.AppliedWork{
481+
appliedWork := &fleetv1beta1.AppliedWork{
482482
ObjectMeta: metav1.ObjectMeta{Name: work.Name},
483483
}
484484
// Get the AppliedWork object
485-
if err := r.spokeClient.Get(ctx, types.NamespacedName{Name: work.Name}, &appliedWork); err != nil {
485+
if err := r.spokeClient.Get(ctx, types.NamespacedName{Name: work.Name}, appliedWork); err != nil {
486486
if apierrors.IsNotFound(err) {
487487
klog.V(2).InfoS("The appliedWork is already deleted, removing the finalizer from the work", "appliedWork", work.Name)
488488
return r.removeWorkFinalizer(ctx, work)
489489
}
490490
klog.ErrorS(err, "Failed to get AppliedWork", "appliedWork", work.Name)
491-
return ctrl.Result{Requeue: true}, controller.NewAPIServerError(false, err)
491+
return ctrl.Result{}, controller.NewAPIServerError(false, err)
492492
}
493493

494-
// Delete the appliedWork object.
495-
if appliedWork.DeletionTimestamp.IsZero() {
496-
// Update the owner reference in the AppliedWork object.
497-
if err := r.updateOwnerReference(ctx, &appliedWork); err != nil {
498-
klog.ErrorS(err, "Failed to update owner reference in the appliedWork", "appliedWork", work.Name)
494+
// Handle stuck deletion after 5 minutes where the other owner references might not exist or are invalid.
495+
if !appliedWork.DeletionTimestamp.IsZero() && time.Since(appliedWork.DeletionTimestamp.Time) >= r.deletionWaitTime {
496+
klog.V(2).InfoS("AppliedWork deletion appears stuck; attempting to patch owner references", "appliedWork", work.Name)
497+
if err := r.updateOwnerReference(ctx, work, appliedWork); err != nil {
498+
klog.ErrorS(err, "Failed to update owner references for AppliedWork", "appliedWork", work.Name)
499499
return ctrl.Result{}, controller.NewAPIServerError(false, err)
500500
}
501-
klog.V(2).InfoS("Deleting the appliedWork", "appliedWork", work.Name)
502-
if err := r.spokeClient.Delete(ctx, &appliedWork, &client.DeleteOptions{PropagationPolicy: &deletePolicy}); err != nil {
503-
if apierrors.IsNotFound(err) {
504-
klog.V(2).InfoS("The appliedWork is already deleted", "appliedWork", work.Name)
505-
return r.removeWorkFinalizer(ctx, work)
506-
}
507-
klog.V(2).ErrorS(err, "Failed to delete the appliedWork", "appliedWork", work.Name)
508-
return ctrl.Result{}, controller.NewAPIServerError(false, err)
501+
}
502+
503+
if err := r.spokeClient.Delete(ctx, appliedWork, &client.DeleteOptions{PropagationPolicy: &deletePolicy}); err != nil {
504+
if apierrors.IsNotFound(err) {
505+
klog.V(2).InfoS("AppliedWork already deleted", "appliedWork", work.Name)
506+
return r.removeWorkFinalizer(ctx, work)
509507
}
508+
klog.V(2).ErrorS(err, "Failed to delete the appliedWork", "appliedWork", work.Name)
509+
return ctrl.Result{}, controller.NewAPIServerError(false, err)
510510
}
511+
511512
klog.V(2).InfoS("AppliedWork deletion in progress", "appliedWork", work.Name)
512-
return ctrl.Result{Requeue: true}, fmt.Errorf("AppliedWork %s is being deleted, waiting for the deletion to complete", work.Name)
513+
return ctrl.Result{}, fmt.Errorf("AppliedWork %s is being deleted, waiting for the deletion to complete", work.Name)
513514
}
514515

515516
// updateOwnerReference updates the AppliedWork owner reference in the manifest objects.
516-
// It changes the `blockOwnerDeletion` field to true, so that the AppliedWork can be deleted in cases where
517+
// It changes the blockOwnerDeletion field to false, so that the AppliedWork can be deleted in cases where
517518
// the other owner references do not exist or are invalid.
518519
// https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/#owner-references-in-object-specifications
519-
func (r *Reconciler) updateOwnerReference(ctx context.Context, appliedWork *fleetv1beta1.AppliedWork) error {
520+
func (r *Reconciler) updateOwnerReference(ctx context.Context, work *fleetv1beta1.Work, appliedWork *fleetv1beta1.AppliedWork) error {
520521
appliedWorkOwnerRef := &metav1.OwnerReference{
521522
APIVersion: fleetv1beta1.GroupVersion.String(),
522523
Kind: "AppliedWork",
523524
Name: appliedWork.Name,
524525
UID: appliedWork.UID,
525526
}
526527

527-
for _, res := range appliedWork.Status.AppliedResources {
528+
if err := r.hubClient.Get(ctx, types.NamespacedName{Name: work.Name, Namespace: work.Namespace}, work); err != nil {
529+
if apierrors.IsNotFound(err) {
530+
klog.V(2).InfoS("Work object not found, skipping owner reference update", "work", work.Name, "namespace", work.Namespace)
531+
return nil
532+
}
533+
klog.ErrorS(err, "Failed to get Work object for owner reference update", "work", work.Name, "namespace", work.Namespace)
534+
return controller.NewAPIServerError(false, err)
535+
}
536+
537+
for _, cond := range work.Status.ManifestConditions {
538+
res := cond.Identifier
528539
gvr := schema.GroupVersionResource{
529540
Group: res.Group,
530541
Version: res.Version,
531542
Resource: res.Resource,
532543
}
544+
533545
var obj *unstructured.Unstructured
534546
var err error
535-
if res.Namespace != "" {
536-
obj, err = r.spokeDynamicClient.Resource(gvr).Namespace(res.Namespace).Get(ctx, res.Name, metav1.GetOptions{})
537-
} else {
538-
obj, err = r.spokeDynamicClient.Resource(gvr).Get(ctx, res.Name, metav1.GetOptions{})
539-
}
540-
if err != nil {
547+
if obj, err = r.spokeDynamicClient.Resource(gvr).Namespace(res.Namespace).Get(ctx, res.Name, metav1.GetOptions{}); err != nil {
541548
if apierrors.IsNotFound(err) {
542549
continue
543550
}
@@ -548,37 +555,20 @@ func (r *Reconciler) updateOwnerReference(ctx context.Context, appliedWork *flee
548555
// Otherwise, at least one other owner reference exists, and we need to leave resource alone.
549556
if len(obj.GetOwnerReferences()) > 1 {
550557
ownerRefs := obj.GetOwnerReferences()
551-
552-
// Re-build the owner reference; update the blockOwnerDeletion field to false.
553558
updated := false
554559
for idx := range ownerRefs {
555-
if ownerRefs[idx].UID == appliedWorkOwnerRef.UID &&
556-
ownerRefs[idx].Name == appliedWorkOwnerRef.Name &&
557-
ownerRefs[idx].Kind == appliedWorkOwnerRef.Kind &&
558-
ownerRefs[idx].APIVersion == appliedWorkOwnerRef.APIVersion &&
559-
*ownerRefs[idx].BlockOwnerDeletion {
560+
if ownerRefEqualsExpected(&ownerRefs[idx], appliedWorkOwnerRef) {
560561
ownerRefs[idx].BlockOwnerDeletion = ptr.To(false)
561562
updated = true
562563
}
563564
}
564565
if updated {
565566
obj.SetOwnerReferences(ownerRefs)
566-
567-
if res.Namespace != "" {
568-
_, err = r.spokeDynamicClient.Resource(gvr).Namespace(res.Namespace).Update(ctx, obj, metav1.UpdateOptions{})
569-
if err != nil {
570-
klog.ErrorS(err, "Failed to update manifest owner references", "gvr", gvr, "name", res.Name, "namespace", res.Namespace)
571-
return err
572-
}
573-
klog.V(4).InfoS("Updated manifest owner references", "gvr", gvr, "name", res.Name, "namespace", res.Namespace)
574-
} else {
575-
_, err = r.spokeDynamicClient.Resource(gvr).Update(ctx, obj, metav1.UpdateOptions{})
576-
if err != nil {
577-
klog.ErrorS(err, "Failed to update manifest owner references", "gvr", gvr, "name", res.Name)
578-
return err
579-
}
580-
klog.V(4).InfoS("Updated manifest owner references", "gvr", gvr, "name", res.Name)
567+
if _, err = r.spokeDynamicClient.Resource(gvr).Namespace(obj.GetNamespace()).Update(ctx, obj, metav1.UpdateOptions{}); err != nil {
568+
klog.ErrorS(err, "Failed to update manifest owner references", "gvr", gvr, "name", res.Name, "namespace", res.Namespace)
569+
return err
581570
}
571+
klog.V(4).InfoS("Patched manifest owner references", "gvr", gvr, "name", res.Name, "namespace", res.Namespace)
582572
}
583573
}
584574
}

pkg/controllers/workapplier/controller_integration_test.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -475,9 +475,13 @@ func workRemovedActual(workName string) func() error {
475475
// Wait for the removal of the Work object.
476476
return func() error {
477477
work := &fleetv1beta1.Work{}
478-
if err := hubClient.Get(ctx, client.ObjectKey{Name: workName, Namespace: memberReservedNSName}, work); !errors.IsNotFound(err) {
478+
if err := hubClient.Get(ctx, client.ObjectKey{Name: workName, Namespace: memberReservedNSName}, work); !errors.IsNotFound(err) && err != nil {
479479
return fmt.Errorf("work object still exists or an unexpected error occurred: %w", err)
480480
}
481+
if controllerutil.ContainsFinalizer(work, fleetv1beta1.WorkFinalizer) {
482+
// The Work object is being deleted, but the finalizer is still present.
483+
return fmt.Errorf("work object is being deleted, but the finalizer is still present")
484+
}
481485
return nil
482486
}
483487
}
@@ -1672,10 +1676,13 @@ var _ = Describe("work applier garbage collection", func() {
16721676
}
16731677
return nil
16741678
}, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to start deleting the AppliedWork object")
1679+
1680+
// Explicitly wait a minute to let the deletion timestamp progress
1681+
time.Sleep(1 * time.Minute) // Adjust based on your real-world scenario
16751682
})
16761683

16771684
It("should update owner reference from the Deployment object", func() {
1678-
// Ensure that the Deployment object has been updated to remove the owner reference.
1685+
// Ensure that the Deployment object has been updated applied owner reference with blockOwnerDeletion to false.
16791686
Eventually(func() error {
16801687
// Retrieve the Deployment object again.
16811688
gotDeploy := &appsv1.Deployment{}
@@ -1694,7 +1701,7 @@ var _ = Describe("work applier garbage collection", func() {
16941701
}
16951702
}
16961703
return nil
1697-
}, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove owner reference from Deployment")
1704+
}, 3*eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove owner reference from Deployment")
16981705
})
16991706

17001707
AfterAll(func() {
@@ -1707,7 +1714,7 @@ var _ = Describe("work applier garbage collection", func() {
17071714
Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object")
17081715

17091716
workRemovedActual := workRemovedActual(workName)
1710-
Eventually(workRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the Work object")
1717+
Eventually(workRemovedActual, 3*time.Minute, eventuallyInterval).Should(Succeed(), "Failed to remove the Work object")
17111718

17121719
// Ensure that the Deployment object still exists.
17131720
Consistently(func() error {
@@ -1985,6 +1992,9 @@ var _ = Describe("work applier garbage collection", func() {
19851992
}
19861993
return nil
19871994
}, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to start deleting the AppliedWork object")
1995+
1996+
// Explicitly wait a minute to let the deletion timestamp progress
1997+
time.Sleep(1 * time.Minute) // Adjust based on your real-world scenario
19881998
})
19891999

19902000
It("should update owner reference from the ClusterRole object", func() {
@@ -2007,7 +2017,7 @@ var _ = Describe("work applier garbage collection", func() {
20072017
}
20082018

20092019
return nil
2010-
}, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove owner reference from ClusterRole")
2020+
}, 3*eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove owner reference from ClusterRole")
20112021
})
20122022

20132023
AfterAll(func() {
@@ -2024,7 +2034,7 @@ var _ = Describe("work applier garbage collection", func() {
20242034
Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object")
20252035

20262036
workRemovedActual := workRemovedActual(workName)
2027-
Eventually(workRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the Work object")
2037+
Eventually(workRemovedActual, 3*time.Minute, eventuallyInterval).Should(Succeed(), "Failed to remove the Work object")
20282038

20292039
// Ensure that the ClusterRole object still exists.
20302040
Consistently(func() error {
@@ -2300,6 +2310,9 @@ var _ = Describe("work applier garbage collection", func() {
23002310
}
23012311
return nil
23022312
}, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to start deleting the AppliedWork object")
2313+
2314+
// Explicitly wait a minute to let the deletion timestamp progress
2315+
time.Sleep(1 * time.Minute) // Adjust based on your real-world scenario
23032316
})
23042317

23052318
It("should update owner reference from the Deployment object", func() {
@@ -2321,7 +2334,7 @@ var _ = Describe("work applier garbage collection", func() {
23212334
}
23222335
}
23232336
return nil
2324-
}, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove owner reference from Deployment")
2337+
}, 3*eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove owner reference from Deployment")
23252338
})
23262339

23272340
AfterAll(func() {
@@ -2338,7 +2351,7 @@ var _ = Describe("work applier garbage collection", func() {
23382351
Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object")
23392352

23402353
workRemovedActual := workRemovedActual(workName)
2341-
Eventually(workRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the Work object")
2354+
Eventually(workRemovedActual, 3*time.Minute, eventuallyInterval).Should(Succeed(), "Failed to remove the Work object")
23422355

23432356
// Ensure that the Deployment object still exists.
23442357
Consistently(func() error {

pkg/controllers/workapplier/preprocess.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -543,10 +543,7 @@ func isInMemberClusterObjectDerivedFromManifestObj(inMemberClusterObj *unstructu
543543
// Verify if the owner reference still stands.
544544
curOwners := inMemberClusterObj.GetOwnerReferences()
545545
for idx := range curOwners {
546-
if curOwners[idx].UID == expectedAppliedWorkOwnerRef.UID &&
547-
curOwners[idx].Name == expectedAppliedWorkOwnerRef.Name &&
548-
curOwners[idx].Kind == expectedAppliedWorkOwnerRef.Kind &&
549-
curOwners[idx].APIVersion == expectedAppliedWorkOwnerRef.APIVersion {
546+
if ownerRefEqualsExpected(&curOwners[idx], expectedAppliedWorkOwnerRef) {
550547
return true
551548
}
552549
}
@@ -560,14 +557,19 @@ func removeOwnerRef(obj *unstructured.Unstructured, expectedAppliedWorkOwnerRef
560557

561558
// Re-build the owner references; remove the given one from the list.
562559
for idx := range ownerRefs {
563-
if ownerRefs[idx].UID == expectedAppliedWorkOwnerRef.UID &&
564-
ownerRefs[idx].Name == expectedAppliedWorkOwnerRef.Name &&
565-
ownerRefs[idx].Kind == expectedAppliedWorkOwnerRef.Kind &&
566-
ownerRefs[idx].APIVersion == expectedAppliedWorkOwnerRef.APIVersion {
560+
if ownerRefEqualsExpected(&ownerRefs[idx], expectedAppliedWorkOwnerRef) {
567561
// Skip the expected owner reference.
568562
continue
569563
}
570564
updatedOwnerRefs = append(updatedOwnerRefs, ownerRefs[idx])
571565
}
572566
obj.SetOwnerReferences(updatedOwnerRefs)
573567
}
568+
569+
// ownerRefEquals returns true if two owner references are equal based on UID, Name, Kind, and APIVersion.
570+
func ownerRefEqualsExpected(a, b *metav1.OwnerReference) bool {
571+
return a.UID == b.UID &&
572+
a.Name == b.Name &&
573+
a.Kind == b.Kind &&
574+
a.APIVersion == b.APIVersion
575+
}

pkg/controllers/workapplier/process.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -356,10 +356,7 @@ func canApplyWithOwnership(inMemberClusterObj *unstructured.Unstructured, expect
356356
// Verify if the object is owned by Fleet.
357357
curOwners := inMemberClusterObj.GetOwnerReferences()
358358
for idx := range curOwners {
359-
if curOwners[idx].UID == expectedAppliedWorkOwnerRef.UID &&
360-
curOwners[idx].Name == expectedAppliedWorkOwnerRef.Name &&
361-
curOwners[idx].Kind == expectedAppliedWorkOwnerRef.Kind &&
362-
curOwners[idx].APIVersion == expectedAppliedWorkOwnerRef.APIVersion {
359+
if ownerRefEqualsExpected(&curOwners[idx], expectedAppliedWorkOwnerRef) {
363360
return true
364361
}
365362
}

pkg/controllers/workapplier/suite_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ var _ = BeforeSuite(func() {
165165
workerCount,
166166
time.Second*5,
167167
time.Second*5,
168+
time.Minute,
168169
true,
169170
60,
170171
)

0 commit comments

Comments
 (0)