github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasprober/manifold.go (about)

     1  // Copyright 2020 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package caasprober
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/worker/v3"
     9  	"github.com/juju/worker/v3/dependency"
    10  
    11  	"github.com/juju/juju/apiserver/apiserverhttp"
    12  	"github.com/juju/juju/observability/probe"
    13  )
    14  
    15  // ManifoldConfig is the configuration used to setup a new caasprober.
    16  type ManifoldConfig struct {
    17  	// MuxName is the name of http api server used to register the probe
    18  	// endpoints for this worker.
    19  	MuxName string
    20  
    21  	// DefaultProviders is a list of probe providers that are given to this
    22  	// worker at instantiation and not fetched from the dependency engine.
    23  	DefaultProviders map[string]probe.ProbeProvider
    24  
    25  	// Providers is a list of worker providers that can offer one of the Prober
    26  	// interfaces to be registered in this worker. Expects at least one of
    27  	// LivenessProber, ReadinessProber or StartupProber.
    28  	Providers []string
    29  }
    30  
    31  // gatherCAASProbes is responsible for taking all the probe dependencies
    32  // passed into the manifold and producing a set of CAASProbes that can be run
    33  // as part of this worker.
    34  func gatherCAASProbes(
    35  	context dependency.Context,
    36  	defaultProviders map[string]probe.ProbeProvider,
    37  	providers []string) (*CAASProbes, error,
    38  ) {
    39  	probes := NewCAASProbes()
    40  
    41  	// General add function that can be called for the 2 different types of
    42  	// providers we receive.
    43  	addProvider := func(id string, provider probe.ProbeProvider) {
    44  		supported := provider.SupportedProbes()
    45  
    46  		if supported.Supports(probe.ProbeLiveness) {
    47  			probes.Liveness.Probes[id] = supported[probe.ProbeLiveness]
    48  		}
    49  
    50  		if supported.Supports(probe.ProbeReadiness) {
    51  			probes.Readiness.Probes[id] = supported[probe.ProbeReadiness]
    52  		}
    53  
    54  		if supported.Supports(probe.ProbeStartup) {
    55  			probes.Readiness.Probes[id] = supported[probe.ProbeStartup]
    56  		}
    57  	}
    58  
    59  	if providers == nil {
    60  		providers = []string{}
    61  	}
    62  	for _, provider := range providers {
    63  		var probeProvider probe.ProbeProvider
    64  		if err := context.Get(provider, &probeProvider); err != nil {
    65  			return probes, errors.Trace(err)
    66  		}
    67  
    68  		addProvider(provider, probeProvider)
    69  	}
    70  
    71  	if defaultProviders == nil {
    72  		defaultProviders = map[string]probe.ProbeProvider{}
    73  	}
    74  	for k, provider := range defaultProviders {
    75  		addProvider(k, provider)
    76  	}
    77  
    78  	return probes, nil
    79  }
    80  
    81  func Manifold(config ManifoldConfig) dependency.Manifold {
    82  	providers := config.Providers
    83  	if providers == nil {
    84  		providers = []string{}
    85  	}
    86  
    87  	return dependency.Manifold{
    88  		Inputs: append([]string{config.MuxName}, providers...),
    89  		Output: nil,
    90  		Start:  config.Start,
    91  	}
    92  }
    93  
    94  func (c ManifoldConfig) Start(context dependency.Context) (worker.Worker, error) {
    95  	if err := c.Validate(); err != nil {
    96  		return nil, errors.Trace(err)
    97  	}
    98  
    99  	var mux *apiserverhttp.Mux
   100  	if err := context.Get(c.MuxName, &mux); err != nil {
   101  		return nil, errors.Trace(err)
   102  	}
   103  
   104  	probes, err := gatherCAASProbes(context, c.DefaultProviders, c.Providers)
   105  	if err != nil {
   106  		return nil, errors.Trace(err)
   107  	}
   108  
   109  	return NewController(probes, mux)
   110  }
   111  
   112  func (c ManifoldConfig) Validate() error {
   113  	if c.MuxName == "" {
   114  		return errors.NotValidf("empty mux name")
   115  	}
   116  	return nil
   117  }