Skip to content

Commit a067941

Browse files
committed
fixup! feat: Add preflight checks framework
Remove the use of a checker factory.
1 parent 10f132a commit a067941

File tree

3 files changed

+31
-69
lines changed

3 files changed

+31
-69
lines changed

cmd/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ func main() {
222222

223223
mgr.GetWebhookServer().Register("/preflight-v1beta1-cluster", &webhook.Admission{
224224
Handler: preflight.New(mgr.GetClient(), admission.NewDecoder(mgr.GetScheme()),
225-
[]preflight.CheckerFactory{
225+
[]preflight.Checker{
226226
// Add your preflight checkers here.
227227
}...,
228228
),

pkg/webhook/preflight/preflight.go

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,11 @@ import (
1818
)
1919

2020
type (
21-
// CheckerFactory returns a Checker for a given cluster.
22-
CheckerFactory func(client ctrlclient.Client, cluster *clusterv1.Cluster) Checker
23-
2421
// Checker returns a set of checks that have been initialized with common dependencies,
2522
// such as an infrastructure API client.
2623
Checker interface {
2724
// Init returns the checks that should run for the cluster.
28-
Init(ctx context.Context) []Check
25+
Init(ctx context.Context, client ctrlclient.Client, cluster *clusterv1.Cluster) []Check
2926
}
3027

3128
// Check represents a single preflight check that can be run against a cluster.
@@ -61,16 +58,16 @@ type (
6158
)
6259

6360
type WebhookHandler struct {
64-
client ctrlclient.Client
65-
decoder admission.Decoder
66-
factories []CheckerFactory
61+
client ctrlclient.Client
62+
decoder admission.Decoder
63+
checkers []Checker
6764
}
6865

69-
func New(client ctrlclient.Client, decoder admission.Decoder, factories ...CheckerFactory) *WebhookHandler {
66+
func New(client ctrlclient.Client, decoder admission.Decoder, checkers ...Checker) *WebhookHandler {
7067
h := &WebhookHandler{
71-
client: client,
72-
decoder: decoder,
73-
factories: factories,
68+
client: client,
69+
decoder: decoder,
70+
checkers: checkers,
7471
}
7572
return h
7673
}
@@ -96,7 +93,7 @@ func (h *WebhookHandler) Handle(ctx context.Context, req admission.Request) admi
9693
return admission.Allowed("")
9794
}
9895

99-
resultsOrderedByCheckerAndCheck := run(ctx, h.client, cluster, h.factories)
96+
resultsOrderedByCheckerAndCheck := run(ctx, h.client, cluster, h.checkers)
10097

10198
// Summarize the results.
10299
resp := admission.Response{
@@ -148,18 +145,17 @@ func (h *WebhookHandler) Handle(ctx context.Context, req admission.Request) admi
148145
func run(ctx context.Context,
149146
client ctrlclient.Client,
150147
cluster *clusterv1.Cluster,
151-
factories []CheckerFactory,
148+
checkers []Checker,
152149
) [][]namedResult {
153-
resultsOrderedByCheckerAndCheck := make([][]namedResult, len(factories))
150+
resultsOrderedByCheckerAndCheck := make([][]namedResult, len(checkers))
154151

155152
checkersWG := sync.WaitGroup{}
156-
for i, factory := range factories {
153+
for i, checker := range checkers {
157154
checkersWG.Add(1)
158-
go func(ctx context.Context, client ctrlclient.Client, cluster *clusterv1.Cluster, factory CheckerFactory, i int) {
155+
go func(ctx context.Context, client ctrlclient.Client, cluster *clusterv1.Cluster, checker Checker, i int) {
159156
defer checkersWG.Done()
160-
checker := factory(client, cluster)
161157

162-
checks := checker.Init(ctx)
158+
checks := checker.Init(ctx, client, cluster)
163159
resultsOrderedByCheck := make([]namedResult, len(checks))
164160

165161
checksWG := sync.WaitGroup{}
@@ -204,7 +200,7 @@ func run(ctx context.Context,
204200
ctx,
205201
client,
206202
cluster,
207-
factory,
203+
checker,
208204
i,
209205
)
210206
}

pkg/webhook/preflight/preflight_test.go

Lines changed: 15 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,11 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
2525
)
2626

27-
func mockCheckerFactory(checker Checker) CheckerFactory {
28-
return func(_ ctrlclient.Client, _ *clusterv1.Cluster) Checker {
29-
return checker
30-
}
31-
}
32-
3327
type mockChecker struct {
3428
checks []Check
3529
}
3630

37-
func (m *mockChecker) Init(_ context.Context) []Check {
31+
func (m *mockChecker) Init(_ context.Context, _ ctrlclient.Client, _ *clusterv1.Cluster) []Check {
3832
return m.checks
3933
}
4034

@@ -375,11 +369,7 @@ func TestHandle(t *testing.T) {
375369
decoder = tt.decoder
376370
}
377371

378-
factories := make([]CheckerFactory, len(tt.checkers))
379-
for i, checker := range tt.checkers {
380-
factories[i] = mockCheckerFactory(checker)
381-
}
382-
handler := New(fake.NewClientBuilder().Build(), decoder, factories...)
372+
handler := New(fake.NewClientBuilder().Build(), decoder, tt.checkers...)
383373

384374
ctx := context.TODO()
385375

@@ -511,7 +501,7 @@ func TestHandleCancelledContext(t *testing.T) {
511501
},
512502
}
513503

514-
handler := New(fake.NewClientBuilder().Build(), decoder, mockCheckerFactory(checker))
504+
handler := New(fake.NewClientBuilder().Build(), decoder, checker)
515505

516506
ctx := context.Background()
517507
ctx, cancel := context.WithCancel(ctx)
@@ -572,8 +562,7 @@ func TestRun_SingleCheckerSingleCheck(t *testing.T) {
572562
},
573563
},
574564
}
575-
factory := mockCheckerFactory(checker)
576-
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []CheckerFactory{factory})
565+
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []Checker{checker})
577566
if len(resultsOrderedByCheckerAndCheck) != 1 {
578567
t.Fatalf("expected results for 1 checker, got %d", len(resultsOrderedByCheckerAndCheck))
579568
}
@@ -611,11 +600,8 @@ func TestRun_MultipleCheckersMultipleChecks(t *testing.T) {
611600
},
612601
},
613602
}
614-
factories := []CheckerFactory{
615-
mockCheckerFactory(checker1),
616-
mockCheckerFactory(checker2),
617-
}
618-
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, factories)
603+
604+
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []Checker{checker1, checker2})
619605
if len(resultsOrderedByCheckerAndCheck) != 2 {
620606
t.Fatalf("expected results for 2 checkers, got %d", len(resultsOrderedByCheckerAndCheck))
621607
}
@@ -677,8 +663,7 @@ func TestRun_ChecksRunInParallel(t *testing.T) {
677663
},
678664
},
679665
}
680-
factory := mockCheckerFactory(checker)
681-
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []CheckerFactory{factory})
666+
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []Checker{checker})
682667

683668
results := resultsOrderedByCheckerAndCheck[0]
684669
if len(results) != 2 {
@@ -714,11 +699,8 @@ func TestRun_CheckersRunInParallel(t *testing.T) {
714699
},
715700
},
716701
}
717-
factories := []CheckerFactory{
718-
mockCheckerFactory(checker1),
719-
mockCheckerFactory(checker2),
720-
}
721-
results := run(ctx, nil, nil, factories)
702+
703+
results := run(ctx, nil, nil, []Checker{checker1, checker2})
722704
if len(results) != 2 {
723705
t.Fatalf("expected 2 results, got %d", len(results))
724706
}
@@ -774,8 +756,7 @@ func TestRun_ContextCancellation(t *testing.T) {
774756
cancel()
775757
}()
776758

777-
factory := mockCheckerFactory(checker)
778-
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []CheckerFactory{factory})
759+
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []Checker{checker})
779760

780761
select {
781762
case <-completed:
@@ -822,11 +803,7 @@ func TestRun_OrderOfResults(t *testing.T) {
822803
},
823804
}
824805

825-
factories := []CheckerFactory{
826-
mockCheckerFactory(checker1),
827-
mockCheckerFactory(checker2),
828-
}
829-
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, factories)
806+
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []Checker{checker1, checker2})
830807
if len(resultsOrderedByCheckerAndCheck) != 2 {
831808
t.Fatalf("expected results for 2 checkers, got %d", len(resultsOrderedByCheckerAndCheck))
832809
}
@@ -869,13 +846,8 @@ func TestRun_LargeNumberOfCheckersAndChecks(t *testing.T) {
869846
}
870847
}
871848

872-
factories := make([]CheckerFactory, checkerCount)
873-
for i, checker := range checkers {
874-
factories[i] = mockCheckerFactory(checker)
875-
}
876-
877849
start := time.Now()
878-
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, factories)
850+
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, checkers)
879851
duration := time.Since(start)
880852

881853
resultTotal := 0
@@ -907,10 +879,9 @@ func TestRun_ErrorHandlingInChecks(t *testing.T) {
907879
checker := &mockChecker{
908880
checks: []Check{errorCheck},
909881
}
910-
factory := mockCheckerFactory(checker)
911882

912883
// Run the checks
913-
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []CheckerFactory{factory})
884+
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []Checker{checker})
914885
assert.Len(t, resultsOrderedByCheckerAndCheck, 1, "expected results for 1 checker")
915886
assert.Len(t, resultsOrderedByCheckerAndCheck[0], 1, "expected 1 result from the checker")
916887

@@ -971,10 +942,9 @@ func TestRun_PanicHandlingInChecks(t *testing.T) {
971942
panicCheck,
972943
},
973944
}
974-
factory := mockCheckerFactory(checker)
975945

976946
// Run the checks
977-
resultsOrderedByCheckerAndCheck := run(ctx, nil, cluster, []CheckerFactory{factory})
947+
resultsOrderedByCheckerAndCheck := run(ctx, nil, cluster, []Checker{checker})
978948
assert.Len(t, resultsOrderedByCheckerAndCheck, 1, "expected results for 1 checker")
979949
assert.Len(t, resultsOrderedByCheckerAndCheck[0], 2, "expected 2 results from the checker")
980950

@@ -1020,11 +990,7 @@ func TestRun_ZeroChecksFromChecker(t *testing.T) {
1020990
},
1021991
}
1022992

1023-
factories := []CheckerFactory{
1024-
mockCheckerFactory(emptyChecker),
1025-
mockCheckerFactory(normalChecker),
1026-
}
1027-
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, factories)
993+
resultsOrderedByCheckerAndCheck := run(ctx, nil, nil, []Checker{emptyChecker, normalChecker})
1028994

1029995
if len(resultsOrderedByCheckerAndCheck) != 2 {
1030996
t.Fatalf("expected results for 2 checkers, got %d", len(resultsOrderedByCheckerAndCheck))

0 commit comments

Comments
 (0)