github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasadmission/controller.go (about) 1 // Copyright 2020 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasadmission 5 6 import ( 7 "fmt" 8 "net/http" 9 "net/url" 10 11 "github.com/juju/errors" 12 "github.com/juju/worker/v3/catacomb" 13 ) 14 15 type Mux interface { 16 AddHandler(string, string, http.Handler) error 17 RemoveHandler(string, string) 18 } 19 20 // Kubernetes controller responsible 21 type Controller struct { 22 catacomb catacomb.Catacomb 23 logger Logger 24 } 25 26 func AdmissionPathForModel(modelUUID string) string { 27 return fmt.Sprintf("/k8s/admission/%s", url.PathEscape(modelUUID)) 28 } 29 30 func NewController( 31 logger Logger, 32 mux Mux, 33 path string, 34 legacyLabels bool, 35 admissionCreator AdmissionCreator, 36 rbacMapper RBACMapper) (*Controller, error) { 37 38 c := &Controller{ 39 logger: logger, 40 } 41 42 if err := catacomb.Invoke(catacomb.Plan{ 43 Site: &c.catacomb, 44 Work: c.makeLoop(admissionCreator, 45 admissionHandler(logger, rbacMapper, legacyLabels), 46 logger, mux, path), 47 }); err != nil { 48 return c, errors.Trace(err) 49 } 50 51 return c, nil 52 } 53 54 func (c *Controller) Kill() { 55 c.catacomb.Kill(nil) 56 } 57 58 func (c *Controller) makeLoop( 59 admissionCreator AdmissionCreator, 60 handler http.Handler, 61 logger Logger, 62 mux Mux, 63 path string) func() error { 64 65 return func() error { 66 logger.Debugf("installing caas admission handler at %s", path) 67 if err := mux.AddHandler(http.MethodPost, path, handler); err != nil { 68 return errors.Trace(err) 69 } 70 defer mux.RemoveHandler(http.MethodPost, path) 71 72 logger.Infof("ensuring model k8s webhook configurations") 73 admissionCleanup, err := admissionCreator.EnsureMutatingWebhookConfiguration() 74 if err != nil { 75 return errors.Trace(err) 76 } 77 defer admissionCleanup() 78 79 select { 80 case <-c.catacomb.Dying(): 81 return c.catacomb.ErrDying() 82 } 83 } 84 } 85 86 func (c *Controller) Wait() error { 87 return c.catacomb.Wait() 88 }