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  }