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 }