github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/caasmodeloperator/manifold.go (about) 1 // Copyright 2020 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasmodeloperator 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/agent" 12 "github.com/juju/juju/api/base" 13 "github.com/juju/juju/api/controller/caasmodeloperator" 14 "github.com/juju/juju/caas" 15 ) 16 17 // Logger is the interface this work requires for logging. 18 type Logger interface { 19 Debugf(string, ...interface{}) 20 } 21 22 // ManifoldConfig describes the resources used by the CAASModelOperatorWorker 23 type ManifoldConfig struct { 24 // AgentName 25 AgentName string 26 // APICallerName is the name of the api caller dependency to fetch 27 APICallerName string 28 // BrokerName is the name of the api caller dependency to fetch 29 BrokerName string 30 // Logger to use in this worker 31 Logger Logger 32 // ModelUUID is the id of the model this worker is operating on 33 34 ModelUUID string 35 } 36 37 // Manifold returns a Manifold that encapsulates a Kubernetes model operator. 38 func Manifold(config ManifoldConfig) dependency.Manifold { 39 return dependency.Manifold{ 40 Inputs: []string{ 41 config.AgentName, 42 config.APICallerName, 43 config.BrokerName, 44 }, 45 Output: nil, 46 Start: config.Start, 47 } 48 } 49 50 // Start is used to start the manifold an extract a worker from the supplied 51 // configuration 52 func (m ManifoldConfig) Start(context dependency.Context) (worker.Worker, error) { 53 if err := m.Validate(); err != nil { 54 return nil, errors.Trace(err) 55 } 56 57 var agent agent.Agent 58 if err := context.Get(m.AgentName, &agent); err != nil { 59 return nil, errors.Trace(err) 60 } 61 62 var apiCaller base.APICaller 63 if err := context.Get(m.APICallerName, &apiCaller); err != nil { 64 return nil, errors.Trace(err) 65 } 66 67 var broker caas.Broker 68 if err := context.Get(m.BrokerName, &broker); err != nil { 69 return nil, errors.Trace(err) 70 } 71 72 api := caasmodeloperator.NewClient(apiCaller) 73 74 return NewModelOperatorManager( 75 m.Logger, api, broker, m.ModelUUID, agent.CurrentConfig()) 76 } 77 78 // Validate checks all the config fields are valid for the Manifold to start 79 func (m ManifoldConfig) Validate() error { 80 if m.AgentName == "" { 81 return errors.NotValidf("empty AgentName") 82 } 83 if m.APICallerName == "" { 84 return errors.NotValidf("empty APICallerName") 85 } 86 if m.BrokerName == "" { 87 return errors.NotValidf("empty BrokerName") 88 } 89 if m.Logger == nil { 90 return errors.NotValidf("nil Logger") 91 } 92 if m.ModelUUID == "" { 93 return errors.NotValidf("empty ModelUUID") 94 } 95 return nil 96 }