github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasmodelconfigmanager/manifold.go (about) 1 // Copyright 2021 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasmodelconfigmanager 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/api/base" 13 "github.com/juju/juju/caas" 14 "github.com/juju/juju/docker/registry" 15 ) 16 17 // ManifoldConfig describes how to configure and construct a Worker, 18 // and what registered resources it may depend upon. 19 type ManifoldConfig struct { 20 APICallerName string 21 BrokerName string 22 23 NewFacade func(base.APICaller) (Facade, error) 24 NewWorker func(Config) (worker.Worker, error) 25 26 Logger Logger 27 Clock clock.Clock 28 } 29 30 // Validate is called by start to check for bad configuration. 31 func (config ManifoldConfig) Validate() error { 32 if config.APICallerName == "" { 33 return errors.NotValidf("empty APICallerName") 34 } 35 if config.BrokerName == "" { 36 return errors.NotValidf("empty BrokerName") 37 } 38 if config.NewFacade == nil { 39 return errors.NotValidf("nil NewFacade") 40 } 41 if config.NewWorker == nil { 42 return errors.NotValidf("nil NewWorker") 43 } 44 if config.Logger == nil { 45 return errors.NotValidf("nil Logger") 46 } 47 if config.Clock == nil { 48 return errors.NotValidf("nil Clock") 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 modelTag, ok := apiCaller.ModelTag() 69 if !ok { 70 return nil, errors.New("API connection is controller-only (should never happen)") 71 } 72 73 facade, err := config.NewFacade(apiCaller) 74 if err != nil { 75 return nil, errors.Trace(err) 76 } 77 worker, err := config.NewWorker(Config{ 78 ModelTag: modelTag, 79 Facade: facade, 80 Broker: broker, 81 Logger: config.Logger, 82 RegistryFunc: registry.New, 83 Clock: config.Clock, 84 }) 85 if err != nil { 86 return nil, errors.Trace(err) 87 } 88 return worker, nil 89 } 90 91 // Manifold returns a dependency.Manifold that will run a Worker as 92 // configured. 93 func Manifold(config ManifoldConfig) dependency.Manifold { 94 return dependency.Manifold{ 95 Inputs: []string{ 96 config.APICallerName, 97 config.BrokerName, 98 }, 99 Start: config.start, 100 } 101 }