@@ -28,10 +28,12 @@ import (
28
28
"path/filepath"
29
29
"strconv"
30
30
"sync"
31
+ "time"
31
32
32
33
"k8s.io/apimachinery/pkg/runtime"
33
34
kscheme "k8s.io/client-go/kubernetes/scheme"
34
35
"sigs.k8s.io/controller-runtime/pkg/certwatcher"
36
+ "sigs.k8s.io/controller-runtime/pkg/healthz"
35
37
"sigs.k8s.io/controller-runtime/pkg/runtime/inject"
36
38
"sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics"
37
39
)
@@ -87,6 +89,10 @@ type Server struct {
87
89
// defaultingOnce ensures that the default fields are only ever set once.
88
90
defaultingOnce sync.Once
89
91
92
+ // started is set to true immediately before the server is started
93
+ // and thus can be used to check if the server has been started
94
+ started bool
95
+
90
96
// mu protects access to the webhook map & setFields for Start, Register, etc
91
97
mu sync.Mutex
92
98
}
@@ -272,6 +278,9 @@ func (s *Server) Start(ctx context.Context) error {
272
278
close (idleConnsClosed )
273
279
}()
274
280
281
+ s .mu .Lock ()
282
+ s .started = true
283
+ s .mu .Unlock ()
275
284
if err := srv .Serve (listener ); err != nil && err != http .ErrServerClosed {
276
285
return err
277
286
}
@@ -280,6 +289,27 @@ func (s *Server) Start(ctx context.Context) error {
280
289
return nil
281
290
}
282
291
292
+ // StartedChecker returns an healthz.Checker which is healthy after the
293
+ // server has been started.
294
+ func (s * Server ) StartedChecker () healthz.Checker {
295
+ return func (req * http.Request ) error {
296
+ s .mu .Lock ()
297
+ defer s .mu .Unlock ()
298
+
299
+ if ! s .started {
300
+ return fmt .Errorf ("webhook server has not been started yet" )
301
+ }
302
+
303
+ conn , err := net .DialTimeout ("tcp" , net .JoinHostPort (s .Host , strconv .Itoa (s .Port )), 10 * time .Second )
304
+ if err != nil {
305
+ return fmt .Errorf ("webhook server is not reachable: %v" , err )
306
+ }
307
+ conn .Close ()
308
+
309
+ return nil
310
+ }
311
+ }
312
+
283
313
// InjectFunc injects the field setter into the server.
284
314
func (s * Server ) InjectFunc (f inject.Func ) error {
285
315
s .setFields = f
0 commit comments