github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/secretsdrainworker/manifold.go (about) 1 // Copyright 2023 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package secretsdrainworker 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/worker/v3" 9 "github.com/juju/worker/v3/dependency" 10 11 agentsecretsdrain "github.com/juju/juju/api/agent/secretsdrain" 12 "github.com/juju/juju/api/agent/secretsmanager" 13 "github.com/juju/juju/api/base" 14 "github.com/juju/juju/api/controller/usersecretsdrain" 15 jujusecrets "github.com/juju/juju/secrets" 16 ) 17 18 // ManifoldConfig describes the resources used by the secretsdrainworker worker. 19 type ManifoldConfig struct { 20 APICallerName string 21 Logger Logger 22 23 NewSecretsDrainFacade func(base.APICaller) SecretsDrainFacade 24 NewWorker func(Config) (worker.Worker, error) 25 NewBackendsClient func(base.APICaller) (jujusecrets.BackendsClient, error) 26 } 27 28 // NewSecretsDrainFacadeForAgent returns a new SecretsDrainFacade for draining charm owned secrets from agents. 29 func NewSecretsDrainFacadeForAgent(caller base.APICaller) SecretsDrainFacade { 30 return agentsecretsdrain.NewClient(caller) 31 } 32 33 // NewUserSecretsDrainFacade returns a new SecretsDrainFacade for draining user secrets from controller. 34 func NewUserSecretsDrainFacade(caller base.APICaller) SecretsDrainFacade { 35 return usersecretsdrain.NewClient(caller) 36 } 37 38 // NewSecretBackendsClientForAgent returns a new secret backends client for draining charm owned secrets from agents. 39 func NewSecretBackendsClientForAgent(caller base.APICaller) (jujusecrets.BackendsClient, error) { 40 facade := secretsmanager.NewClient(caller) 41 return jujusecrets.NewClient(facade) 42 } 43 44 // NewUserSecretBackendsClient returns a new secret backends client for draining user secrets from controller. 45 func NewUserSecretBackendsClient(caller base.APICaller) (jujusecrets.BackendsClient, error) { 46 facade := usersecretsdrain.NewClient(caller) 47 return jujusecrets.NewClient(facade) 48 } 49 50 // Manifold returns a Manifold that encapsulates the secretsdrainworker worker. 51 func Manifold(config ManifoldConfig) dependency.Manifold { 52 return dependency.Manifold{ 53 Inputs: []string{ 54 config.APICallerName, 55 }, 56 Start: config.start, 57 } 58 } 59 60 // Validate is called by start to check for bad configuration. 61 func (cfg ManifoldConfig) Validate() error { 62 if cfg.APICallerName == "" { 63 return errors.NotValidf("empty APICallerName") 64 } 65 if cfg.Logger == nil { 66 return errors.NotValidf("nil Logger") 67 } 68 if cfg.NewSecretsDrainFacade == nil { 69 return errors.NotValidf("nil NewSecretsDrainFacade") 70 } 71 if cfg.NewWorker == nil { 72 return errors.NotValidf("nil NewWorker") 73 } 74 if cfg.NewBackendsClient == nil { 75 return errors.NotValidf("nil NewBackendsClient") 76 } 77 return nil 78 } 79 80 // start is a StartFunc for a Worker manifold. 81 func (cfg ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 82 if err := cfg.Validate(); err != nil { 83 return nil, errors.Trace(err) 84 } 85 86 var apiCaller base.APICaller 87 if err := context.Get(cfg.APICallerName, &apiCaller); err != nil { 88 return nil, errors.Trace(err) 89 } 90 91 worker, err := cfg.NewWorker(Config{ 92 SecretsDrainFacade: cfg.NewSecretsDrainFacade(apiCaller), 93 Logger: cfg.Logger, 94 SecretsBackendGetter: func() (jujusecrets.BackendsClient, error) { 95 return cfg.NewBackendsClient(apiCaller) 96 }, 97 }) 98 if err != nil { 99 return nil, errors.Trace(err) 100 } 101 return worker, nil 102 }