Skip to content

Commit 96820fa

Browse files
authored
🌱 fix flaky unit-tests (#1459)
1 parent 6b0031a commit 96820fa

10 files changed

+96
-53
lines changed

controllers/controllers_suite_test.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"sigs.k8s.io/controller-runtime/pkg/controller"
3535

3636
infrav1 "github.com/syself/cluster-api-provider-hetzner/api/v1beta1"
37-
hcloudclient "github.com/syself/cluster-api-provider-hetzner/pkg/services/hcloud/client"
3837
"github.com/syself/cluster-api-provider-hetzner/test/helpers"
3938
)
4039

@@ -45,10 +44,9 @@ const (
4544
)
4645

4746
var (
48-
testEnv *helpers.TestEnvironment
49-
hcloudClient hcloudclient.Client
50-
ctx = ctrl.SetupSignalHandler()
51-
wg sync.WaitGroup
47+
testEnv *helpers.TestEnvironment
48+
ctx = ctrl.SetupSignalHandler()
49+
wg sync.WaitGroup
5250

5351
defaultPlacementGroupName = "caph-placement-group"
5452
defaultFailureDomain = "fsn1"
@@ -64,7 +62,6 @@ var _ = BeforeSuite(func() {
6462
utilruntime.Must(clusterv1.AddToScheme(scheme.Scheme))
6563

6664
testEnv = helpers.NewTestEnvironment()
67-
hcloudClient = testEnv.HCloudClientFactory.NewClient("")
6865

6966
wg.Add(1)
7067

controllers/hcloudmachine_controller_test.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20-
"fmt"
2120
"testing"
22-
"time"
2321

2422
"github.com/hetznercloud/hcloud-go/v2/hcloud"
2523
. "github.com/onsi/ginkgo/v2"
@@ -36,6 +34,7 @@ import (
3634
"sigs.k8s.io/controller-runtime/pkg/predicate"
3735

3836
infrav1 "github.com/syself/cluster-api-provider-hetzner/api/v1beta1"
37+
hcloudclient "github.com/syself/cluster-api-provider-hetzner/pkg/services/hcloud/client"
3938
"github.com/syself/cluster-api-provider-hetzner/pkg/utils"
4039
)
4140

@@ -320,7 +319,10 @@ var _ = Describe("HCloudMachineReconciler", func() {
320319

321320
Context("Basic test", func() {
322321
Context("correct server", func() {
322+
var hcloudClient hcloudclient.Client
323+
323324
BeforeEach(func() {
325+
hcloudClient = testEnv.ResetAndGetGlobalHCloudClient()
324326
// remove bootstrap infos
325327
capiMachine.Spec.Bootstrap = clusterv1.Bootstrap{}
326328
Expect(testEnv.Create(ctx, capiMachine)).To(Succeed())
@@ -365,26 +367,23 @@ var _ = Describe("HCloudMachineReconciler", func() {
365367
}, timeout).Should(BeTrue())
366368
})
367369

368-
It("creates the HCloud machine in Hetzner 1 (flaky)", func() {
370+
It("creates the HCloud machine in Hetzner 1", func() {
369371
By("checking that no servers exist")
370372

371-
Eventually(func(start time.Time) bool {
373+
Eventually(func() bool {
372374
servers, err := hcloudClient.ListServers(ctx, hcloud.ServerListOpts{
373375
ListOpts: hcloud.ListOpts{
374376
LabelSelector: utils.LabelsToLabelSelector(map[string]string{hetznerCluster.ClusterTagKey(): "owned"}),
375377
},
376378
})
377379
if err != nil {
378-
fmt.Printf("flaky test. ListServers failed: %s\n", err.Error())
379380
return false
380381
}
381382
if len(servers) != 0 {
382-
fmt.Printf("flaky test. There are still servers: %+v\n", servers)
383383
return false
384384
}
385-
fmt.Printf("flaky test. OK after %s\n", time.Since(start).String())
386385
return true
387-
}, 2*timeout, interval).WithArguments(time.Now()).Should(BeTrue())
386+
}, timeout, interval).Should(BeTrue())
388387

389388
By("checking that bootstrap condition is not ready")
390389

@@ -517,7 +516,10 @@ var _ = Describe("HCloudMachineReconciler", func() {
517516
})
518517

519518
Context("without network", func() {
519+
var hcloudClient hcloudclient.Client
520+
520521
BeforeEach(func() {
522+
hcloudClient = testEnv.ResetAndGetGlobalHCloudClient()
521523
hetznerCluster.Spec.HCloudNetwork.Enabled = false
522524
Expect(testEnv.Create(ctx, hetznerCluster)).To(Succeed())
523525
Expect(testEnv.Create(ctx, hcloudMachine)).To(Succeed())
@@ -543,7 +545,10 @@ var _ = Describe("HCloudMachineReconciler", func() {
543545
})
544546

545547
Context("without placement groups", func() {
548+
var hcloudClient hcloudclient.Client
549+
546550
BeforeEach(func() {
551+
hcloudClient = testEnv.ResetAndGetGlobalHCloudClient()
547552
hetznerCluster.Spec.HCloudPlacementGroups = nil
548553
Expect(testEnv.Create(ctx, hetznerCluster)).To(Succeed())
549554

@@ -609,7 +614,9 @@ var _ = Describe("HCloudMachineReconciler", func() {
609614
})
610615

611616
Context("with public network specs", func() {
617+
var hcloudClient hcloudclient.Client
612618
BeforeEach(func() {
619+
hcloudClient = testEnv.ResetAndGetGlobalHCloudClient()
613620
hcloudMachine.Spec.PublicNetwork = &infrav1.PublicNetworkSpec{
614621
EnableIPv4: false,
615622
EnableIPv6: false,

controllers/hcloudremediation_controller_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"sigs.k8s.io/controller-runtime/pkg/client"
3131

3232
infrav1 "github.com/syself/cluster-api-provider-hetzner/api/v1beta1"
33+
hcloudclient "github.com/syself/cluster-api-provider-hetzner/pkg/services/hcloud/client"
3334
hcloudutil "github.com/syself/cluster-api-provider-hetzner/pkg/services/hcloud/util"
3435
"github.com/syself/cluster-api-provider-hetzner/pkg/utils"
3536
)
@@ -186,6 +187,11 @@ var _ = Describe("HCloudRemediationReconciler", func() {
186187
})
187188

188189
Context("Basic test", func() {
190+
var hcloudClient hcloudclient.Client
191+
BeforeEach(func() {
192+
hcloudClient = testEnv.ResetAndGetGlobalHCloudClient()
193+
})
194+
189195
It("creates the hcloudRemediation successfully", func() {
190196
Expect(testEnv.Create(ctx, hcloudRemediation)).To(Succeed())
191197

controllers/hetznerbaremetalremediation_controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ var _ = Describe("HetznerBareMetalRemediationReconciler", func() {
257257
Expect(testEnv.Cleanup(ctx, hetznerBareMetalRemediation, hetznerBaremetalMachine)).To(Succeed())
258258
})
259259

260-
It("should not remediate if no annotations is present in the hetznerBaremetalMachine (flaky)", func() {
260+
It("should not remediate if no annotations is present in the hetznerBaremetalMachine", func() {
261261
Expect(testEnv.Create(ctx, hetznerBaremetalMachine)).To(Succeed())
262262
Expect(testEnv.Create(ctx, hetznerBareMetalRemediation)).To(Succeed())
263263

controllers/hetznercluster_controller_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"sigs.k8s.io/controller-runtime/pkg/event"
3636

3737
infrav1 "github.com/syself/cluster-api-provider-hetzner/api/v1beta1"
38+
hcloudclient "github.com/syself/cluster-api-provider-hetzner/pkg/services/hcloud/client"
3839
"github.com/syself/cluster-api-provider-hetzner/pkg/utils"
3940
"github.com/syself/cluster-api-provider-hetzner/test/helpers"
4041
)
@@ -333,6 +334,12 @@ var _ = Describe("Hetzner ClusterReconciler", func() {
333334
})
334335

335336
Context("load balancer", func() {
337+
var hcloudClient hcloudclient.Client
338+
339+
BeforeEach(func() {
340+
hcloudClient = testEnv.ResetAndGetGlobalHCloudClient()
341+
})
342+
336343
It("should create load balancer and update it accordingly", func() {
337344
Expect(testEnv.Create(ctx, instance)).To(Succeed())
338345

@@ -735,8 +742,10 @@ var _ = Describe("Hetzner ClusterReconciler", func() {
735742

736743
Context("HetznerMachines belonging to the cluster", func() {
737744
var bootstrapSecret *corev1.Secret
745+
var hcloudClient hcloudclient.Client
738746

739747
BeforeEach(func() {
748+
hcloudClient = testEnv.ResetAndGetGlobalHCloudClient()
740749
bootstrapSecret = getDefaultBootstrapSecret(namespace)
741750
Expect(testEnv.Create(ctx, bootstrapSecret)).To(Succeed())
742751
})
@@ -773,8 +782,10 @@ var _ = Describe("Hetzner ClusterReconciler", func() {
773782

774783
Context("Placement groups", func() {
775784
var bootstrapSecret *corev1.Secret
785+
var hcloudClient hcloudclient.Client
776786

777787
BeforeEach(func() {
788+
hcloudClient = testEnv.ResetAndGetGlobalHCloudClient()
778789
// Create the bootstrap secret
779790
bootstrapSecret = getDefaultBootstrapSecret(namespace)
780791
Expect(testEnv.Create(ctx, bootstrapSecret)).To(Succeed())

pkg/services/hcloud/client/client.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ var ErrUnauthorized = fmt.Errorf("unauthorized")
4040

4141
// Client collects all methods used by the controller in the hcloud cloud API.
4242
type Client interface {
43-
Close()
43+
// Reset resets the local cache. Only implemented in the fake client.
44+
Reset() Client
4445

4546
CreateLoadBalancer(context.Context, hcloud.LoadBalancerCreateOpts) (*hcloud.LoadBalancer, error)
4647
DeleteLoadBalancer(context.Context, int64) error
@@ -78,6 +79,7 @@ type Client interface {
7879

7980
// Factory is the interface for creating new Client objects.
8081
type Factory interface {
82+
// NewClient returns a new Client in the real implementation, and the shared global Client in the fake implementation.
8183
NewClient(hcloudToken string) Client
8284
}
8385

@@ -141,8 +143,10 @@ type realClient struct {
141143
client *hcloud.Client
142144
}
143145

144-
// Close implements the Close method of the HCloudClient interface.
145-
func (c *realClient) Close() {}
146+
// Reset implements the Reset method of the HCloudClient interface.
147+
func (c *realClient) Reset() Client {
148+
return c
149+
}
146150

147151
func (c *realClient) CreateLoadBalancer(ctx context.Context, opts hcloud.LoadBalancerCreateOpts) (*hcloud.LoadBalancer, error) {
148152
res, _, err := c.client.LoadBalancer.Create(ctx, opts)

pkg/services/hcloud/client/fake/hcloud_client.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ func (f *cacheHCloudClientFactory) NewClient(string) hcloudclient.Client {
5555
return cacheHCloudClientInstance
5656
}
5757

58-
// Close implements Close method of hcloud client interface.
59-
func (c *cacheHCloudClient) Close() {
58+
// Reset implements Reset method of hcloud client interface.
59+
func (c *cacheHCloudClient) Reset() hcloudclient.Client {
6060
c.counterMutex.Lock()
6161
defer c.counterMutex.Unlock()
6262

@@ -86,6 +86,7 @@ func (c *cacheHCloudClient) Close() {
8686
cacheHCloudClientInstance.placementGroupIDCounter = 0
8787
cacheHCloudClientInstance.loadBalancerIDCounter = 0
8888
cacheHCloudClientInstance.networkIDCounter = 0
89+
return c
8990
}
9091

9192
type cacheHCloudClientFactory struct{}

pkg/services/hcloud/client/fake/hcloud_client_test.go

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
. "github.com/onsi/ginkgo/v2"
2626
. "github.com/onsi/gomega"
2727

28+
hcloudclient "github.com/syself/cluster-api-provider-hetzner/pkg/services/hcloud/client"
2829
"github.com/syself/cluster-api-provider-hetzner/pkg/services/hcloud/client/fake"
2930
)
3031

@@ -75,12 +76,13 @@ var _ = Describe("Load balancer", func() {
7576
Subnets: []hcloud.NetworkSubnet{{IPRange: &net.IPNet{IP: net.IP("1.2.3.6")}}},
7677
}
7778

78-
client := factory.NewClient("")
79+
var client hcloudclient.Client
7980

8081
var lb *hcloud.LoadBalancer
8182
var network *hcloud.Network
8283

8384
BeforeEach(func() {
85+
client = factory.NewClient("").Reset()
8486
_, err := client.CreateLoadBalancer(ctx, opts)
8587
Expect(err).To(Succeed())
8688

@@ -92,9 +94,6 @@ var _ = Describe("Load balancer", func() {
9294
network, err = client.CreateNetwork(ctx, networkOpts)
9395
Expect(err).To(Succeed())
9496
})
95-
AfterEach(func() {
96-
client.Close()
97-
})
9897

9998
It("creates a load balancer and returns it with an ID", func() {
10099
Expect(lb.ID).ToNot(Equal(0))
@@ -421,26 +420,29 @@ var _ = Describe("Load balancer", func() {
421420
err := client.DeleteServiceFromLoadBalancer(ctx, lb, 999)
422421
Expect(err).ToNot(Succeed())
423422
})
423+
})
424424

425-
_ = Describe("Images", func() {
426-
var listOpts hcloud.ImageListOpts
427-
client := factory.NewClient("")
428-
BeforeEach(func() {
429-
listOpts.LabelSelector = "caph-image-name==fedora-control-plane"
430-
})
431-
It("lists at least one image", func() {
432-
resp, err := client.ListImages(ctx, listOpts)
433-
Expect(err).To(Succeed())
434-
Expect(len(resp)).To(BeNumerically(">", 0))
435-
})
425+
var _ = Describe("Images", func() {
426+
var listOpts hcloud.ImageListOpts
427+
var client hcloudclient.Client
428+
429+
BeforeEach(func() {
430+
client = factory.NewClient("").Reset()
431+
432+
listOpts.LabelSelector = "caph-image-name==fedora-control-plane"
433+
})
434+
It("lists at least one image", func() {
435+
resp, err := client.ListImages(ctx, listOpts)
436+
Expect(err).To(Succeed())
437+
Expect(len(resp)).To(BeNumerically(">", 0))
436438
})
437439
})
438440

439441
var _ = Describe("Server", func() {
440442
var listOpts hcloud.ServerListOpts
441443
listOpts.LabelSelector = labelSelector
442444

443-
client := factory.NewClient("")
445+
var client hcloudclient.Client
444446

445447
opts := hcloud.ServerCreateOpts{
446448
Name: "test-server",
@@ -464,6 +466,8 @@ var _ = Describe("Server", func() {
464466

465467
BeforeEach(func() {
466468
var err error
469+
client = factory.NewClient("").Reset()
470+
467471
server, err = client.CreateServer(ctx, opts)
468472
Expect(err).To(Succeed())
469473

@@ -478,9 +482,6 @@ var _ = Describe("Server", func() {
478482
})
479483
Expect(err).To(Succeed())
480484
})
481-
AfterEach(func() {
482-
client.Close()
483-
})
484485

485486
It("creates a server with an ID", func() {
486487
Expect(server.ID).ToNot(Equal(0))
@@ -609,7 +610,7 @@ var _ = Describe("Network", func() {
609610
var listOpts hcloud.NetworkListOpts
610611
listOpts.LabelSelector = labelSelector
611612

612-
client := factory.NewClient("")
613+
var client hcloudclient.Client
613614

614615
opts := hcloud.NetworkCreateOpts{
615616
Name: "test-network",
@@ -625,12 +626,10 @@ var _ = Describe("Network", func() {
625626

626627
BeforeEach(func() {
627628
var err error
629+
client = factory.NewClient("").Reset()
628630
network, err = client.CreateNetwork(ctx, opts)
629631
Expect(err).To(Succeed())
630632
})
631-
AfterEach(func() {
632-
client.Close()
633-
})
634633

635634
It("creates a network with an ID", func() {
636635
Expect(network.ID).ToNot(Equal(0))
@@ -675,13 +674,13 @@ var _ = Describe("Placement groups", func() {
675674
Type: "stream",
676675
}
677676

678-
client := factory.NewClient("")
679-
677+
var client hcloudclient.Client
680678
var server *hcloud.Server
681679
var placementGroup *hcloud.PlacementGroup
682680

683681
BeforeEach(func() {
684682
var err error
683+
client = factory.NewClient("").Reset()
685684
server, err = client.CreateServer(ctx, hcloud.ServerCreateOpts{
686685
Name: "test-server",
687686
Labels: map[string]string{
@@ -703,9 +702,6 @@ var _ = Describe("Placement groups", func() {
703702
placementGroup, err = client.CreatePlacementGroup(ctx, opts)
704703
Expect(err).To(Succeed())
705704
})
706-
AfterEach(func() {
707-
client.Close()
708-
})
709705

710706
It("creates a placementGroup with an ID", func() {
711707
Expect(placementGroup.ID).ToNot(Equal(0))

0 commit comments

Comments
 (0)