github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/caasoperatorprovisioner/manifold.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasoperatorprovisioner 5 6 import ( 7 "github.com/juju/clock" 8 "github.com/juju/errors" 9 "github.com/juju/worker/v3" 10 "github.com/juju/worker/v3/dependency" 11 12 "github.com/juju/juju/agent" 13 "github.com/juju/juju/api/base" 14 "github.com/juju/juju/api/controller/caasoperatorprovisioner" 15 "github.com/juju/juju/caas" 16 ) 17 18 // Logger represents the methods used by the worker to log details. 19 type Logger interface { 20 Debugf(string, ...interface{}) 21 Infof(string, ...interface{}) 22 Tracef(string, ...interface{}) 23 } 24 25 // ManifoldConfig defines a CAAS operator provisioner's dependencies. 26 type ManifoldConfig struct { 27 AgentName string 28 APICallerName string 29 BrokerName string 30 ClockName string 31 NewWorker func(Config) (worker.Worker, error) 32 Logger Logger 33 } 34 35 // Validate is called by start to check for bad configuration. 36 func (config ManifoldConfig) Validate() error { 37 if config.AgentName == "" { 38 return errors.NotValidf("empty AgentName") 39 } 40 if config.APICallerName == "" { 41 return errors.NotValidf("empty APICallerName") 42 } 43 if config.BrokerName == "" { 44 return errors.NotValidf("empty BrokerName") 45 } 46 if config.ClockName == "" { 47 return errors.NotValidf("empty ClockName") 48 } 49 if config.NewWorker == nil { 50 return errors.NotValidf("nil NewWorker") 51 } 52 if config.Logger == nil { 53 return errors.NotValidf("nil Logger") 54 } 55 return nil 56 } 57 58 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 59 if err := config.Validate(); err != nil { 60 return nil, errors.Trace(err) 61 } 62 63 var agent agent.Agent 64 if err := context.Get(config.AgentName, &agent); err != nil { 65 return nil, errors.Trace(err) 66 } 67 68 var apiCaller base.APICaller 69 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 70 return nil, errors.Trace(err) 71 } 72 73 var clock clock.Clock 74 if err := context.Get(config.ClockName, &clock); err != nil { 75 return nil, errors.Trace(err) 76 } 77 78 var broker caas.Broker 79 if err := context.Get(config.BrokerName, &broker); err != nil { 80 return nil, errors.Trace(err) 81 } 82 83 modelTag, ok := apiCaller.ModelTag() 84 if !ok { 85 return nil, errors.New("API connection is controller-only (should never happen)") 86 } 87 88 api := caasoperatorprovisioner.NewClient(apiCaller) 89 agentConfig := agent.CurrentConfig() 90 w, err := config.NewWorker(Config{ 91 Facade: api, 92 OperatorManager: broker, 93 ModelTag: modelTag, 94 AgentConfig: agentConfig, 95 Clock: clock, 96 Logger: config.Logger, 97 }) 98 if err != nil { 99 return nil, errors.Trace(err) 100 } 101 return w, nil 102 } 103 104 // Manifold creates a manifold that runs a CAAS operator provisioner. See the 105 // ManifoldConfig type for discussion about how this can/should evolve. 106 func Manifold(config ManifoldConfig) dependency.Manifold { 107 return dependency.Manifold{ 108 Inputs: []string{ 109 config.AgentName, 110 config.APICallerName, 111 config.BrokerName, 112 config.ClockName, 113 }, 114 Start: config.start, 115 } 116 }