@@ -12,8 +12,6 @@ import (
12
12
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
13
13
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
14
14
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
15
-
16
- "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/common/pkg/capi/utils"
17
15
)
18
16
19
17
type CheckResult struct {
@@ -28,23 +26,19 @@ type Check = func(ctx context.Context) CheckResult
28
26
29
27
type Checker interface {
30
28
Checks (ctx context.Context , client ctrlclient.Client , cluster * clusterv1.Cluster ) ([]Check , error )
31
- Provider () string
32
29
}
33
30
34
31
type WebhookHandler struct {
35
- client ctrlclient.Client
36
- decoder admission.Decoder
37
- checkersByProvider map [ string ]Checker
32
+ client ctrlclient.Client
33
+ decoder admission.Decoder
34
+ checkers [ ]Checker
38
35
}
39
36
40
37
func New (client ctrlclient.Client , decoder admission.Decoder , checkers ... Checker ) * WebhookHandler {
41
38
h := & WebhookHandler {
42
- client : client ,
43
- decoder : decoder ,
44
- checkersByProvider : make (map [string ]Checker , len (checkers )),
45
- }
46
- for _ , checker := range checkers {
47
- h .checkersByProvider [checker .Provider ()] = checker
39
+ client : client ,
40
+ decoder : decoder ,
41
+ checkers : checkers ,
48
42
}
49
43
return h
50
44
}
@@ -65,12 +59,6 @@ func (h *WebhookHandler) Handle(ctx context.Context, req admission.Request) admi
65
59
return admission .Allowed ("" )
66
60
}
67
61
68
- // Checks run only for the known infrastructure providers.
69
- checker , ok := h .checkersByProvider [utils .GetProvider (cluster )]
70
- if ! ok {
71
- return admission .Allowed ("" )
72
- }
73
-
74
62
resp := admission.Response {
75
63
AdmissionResponse : admissionv1.AdmissionResponse {
76
64
Allowed : true ,
@@ -80,26 +68,43 @@ func (h *WebhookHandler) Handle(ctx context.Context, req admission.Request) admi
80
68
},
81
69
}
82
70
83
- checks , err := checker .Checks (ctx , h .client , cluster )
84
- if err != nil {
85
- resp .Allowed = false
86
- resp .Result .Code = http .StatusInternalServerError
87
- resp .Result .Message = "failed to initialize preflight checks"
88
- resp .Result .Details .Causes = append (resp .Result .Details .Causes , metav1.StatusCause {
89
- Type : metav1 .CauseTypeInternal ,
90
- Message : err .Error (),
91
- Field : "" , // This concerns the whole cluster.
92
- })
93
- return resp
71
+ // Initialize checkers in parallel.
72
+ type ChecksResult struct {
73
+ checks []Check
74
+ err error
94
75
}
76
+ checksResultCh := make (chan ChecksResult , len (h .checkers ))
95
77
96
- if len (checks ) == 0 {
97
- return admission .Allowed ("" )
78
+ wg := & sync.WaitGroup {}
79
+ for _ , checker := range h .checkers {
80
+ wg .Add (1 )
81
+ result := ChecksResult {}
82
+ result .checks , result .err = checker .Checks (ctx , h .client , cluster )
83
+ checksResultCh <- result
84
+ wg .Done ()
98
85
}
86
+ wg .Wait ()
87
+ close (checksResultCh )
99
88
100
- // Run all checks and collect results.
89
+ // Collect all checks.
90
+ checks := make ([]Check , 0 )
91
+ for checksResult := range checksResultCh {
92
+ if checksResult .err != nil {
93
+ resp .Allowed = false
94
+ resp .Result .Code = http .StatusInternalServerError
95
+ resp .Result .Message = "failed to initialize preflight checks"
96
+ resp .Result .Details .Causes = append (resp .Result .Details .Causes , metav1.StatusCause {
97
+ Type : metav1 .CauseTypeInternal ,
98
+ Message : checksResult .err .Error (),
99
+ Field : "" , // This concerns the whole cluster.
100
+ })
101
+ continue
102
+ }
103
+ checks = append (checks , checksResult .checks ... )
104
+ }
105
+
106
+ // Run all checks in parallel.
101
107
resultCh := make (chan CheckResult , len (checks ))
102
- wg := & sync.WaitGroup {}
103
108
for _ , check := range checks {
104
109
wg .Add (1 )
105
110
go func (ctx context.Context , check Check ) {
@@ -111,6 +116,7 @@ func (h *WebhookHandler) Handle(ctx context.Context, req admission.Request) admi
111
116
wg .Wait ()
112
117
close (resultCh )
113
118
119
+ // Collect check results.
114
120
for result := range resultCh {
115
121
if result .Error {
116
122
resp .Allowed = false
0 commit comments