github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/caasunitprovisioner/manifold.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasunitprovisioner 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/api/base" 12 "github.com/juju/juju/caas" 13 ) 14 15 // Logger represents the methods used by the worker to log details. 16 type Logger interface { 17 Debugf(string, ...interface{}) 18 Warningf(string, ...interface{}) 19 Errorf(string, ...interface{}) 20 Tracef(string, ...interface{}) 21 } 22 23 // ManifoldConfig defines a CAAS unit provisioner's dependencies. 24 type ManifoldConfig struct { 25 APICallerName string 26 BrokerName string 27 28 NewClient func(base.APICaller) Client 29 NewWorker func(Config) (worker.Worker, error) 30 Logger Logger 31 } 32 33 // Validate is called by start to check for bad configuration. 34 func (config ManifoldConfig) Validate() error { 35 if config.APICallerName == "" { 36 return errors.NotValidf("empty APICallerName") 37 } 38 if config.BrokerName == "" { 39 return errors.NotValidf("empty BrokerName") 40 } 41 if config.NewClient == nil { 42 return errors.NotValidf("nil NewClient") 43 } 44 if config.NewWorker == nil { 45 return errors.NotValidf("nil NewWorker") 46 } 47 if config.Logger == nil { 48 return errors.NotValidf("nil Logger") 49 } 50 return nil 51 } 52 53 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 54 if err := config.Validate(); err != nil { 55 return nil, errors.Trace(err) 56 } 57 58 var apiCaller base.APICaller 59 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 60 return nil, errors.Trace(err) 61 } 62 63 var broker caas.Broker 64 if err := context.Get(config.BrokerName, &broker); err != nil { 65 return nil, errors.Trace(err) 66 } 67 68 client := config.NewClient(apiCaller) 69 w, err := config.NewWorker(Config{ 70 ApplicationGetter: client, 71 ApplicationUpdater: client, 72 73 ServiceBroker: broker, 74 ContainerBroker: broker, 75 76 ProvisioningInfoGetter: client, 77 ProvisioningStatusSetter: client, 78 LifeGetter: client, 79 UnitUpdater: client, 80 CharmGetter: client, 81 82 Logger: config.Logger, 83 }) 84 if err != nil { 85 return nil, errors.Trace(err) 86 } 87 return w, nil 88 } 89 90 // Manifold creates a manifold that runs a CAAS unit provisioner. See the 91 // ManifoldConfig type for discussion about how this can/should evolve. 92 func Manifold(config ManifoldConfig) dependency.Manifold { 93 return dependency.Manifold{ 94 Inputs: []string{ 95 config.APICallerName, 96 config.BrokerName, 97 }, 98 Start: config.start, 99 } 100 }