github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/stateconverter/manifold.go (about) 1 // Copyright 2022 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package stateconverter 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/names/v5" 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" 14 apimachiner "github.com/juju/juju/api/agent/machiner" 15 "github.com/juju/juju/api/base" 16 "github.com/juju/juju/core/watcher" 17 ) 18 19 // ManifoldConfig provides the dependencies for the 20 // stateconverter manifold. 21 type ManifoldConfig struct { 22 AgentName string 23 APICallerName string 24 Logger Logger 25 26 // A constructor for the machiner API which can be overridden 27 // during testing. If omitted, the default client for the machiner 28 // facade will be automatically used. 29 NewMachinerAPI func(base.APICaller) Machiner 30 } 31 32 // Manifold returns a Manifold that encapsulates the stateconverter worker. 33 func Manifold(cfg ManifoldConfig) dependency.Manifold { 34 return dependency.Manifold{ 35 Inputs: []string{ 36 cfg.AgentName, 37 cfg.APICallerName, 38 }, 39 Start: cfg.start, 40 } 41 } 42 43 // Validate is called by start to check for bad configuration. 44 func (cfg ManifoldConfig) Validate() error { 45 if cfg.AgentName == "" { 46 return errors.NotValidf("empty AgentName") 47 } 48 if cfg.APICallerName == "" { 49 return errors.NotValidf("empty APICallerName") 50 } 51 if cfg.Logger == nil { 52 return errors.NotValidf("nil Logger") 53 } 54 return nil 55 } 56 57 // start is a StartFunc for a Worker manifold. 58 func (cfg ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 59 if err := cfg.Validate(); err != nil { 60 return nil, errors.Trace(err) 61 } 62 63 var a agent.Agent 64 if err := context.Get(cfg.AgentName, &a); err != nil { 65 return nil, errors.Trace(err) 66 } 67 68 tag := a.CurrentConfig().Tag() 69 mTag, ok := tag.(names.MachineTag) 70 if !ok { 71 return nil, errors.NotValidf("%q machine tag", a) 72 } 73 74 machiner, err := cfg.newMachiner(context) 75 if err != nil { 76 return nil, errors.Trace(err) 77 } 78 79 cfg.Logger.Tracef("starting NotifyWorker for %s", mTag) 80 handlerCfg := config{ 81 machineTag: mTag, 82 machiner: machiner, 83 logger: cfg.Logger, 84 } 85 w, err := watcher.NewNotifyWorker(watcher.NotifyConfig{ 86 Handler: NewConverter(handlerCfg), 87 }) 88 if err != nil { 89 return nil, errors.Annotate(err, "cannot start controller promoter worker") 90 } 91 return w, nil 92 } 93 94 func (cfg ManifoldConfig) newMachiner(context dependency.Context) (Machiner, error) { 95 if cfg.NewMachinerAPI != nil { 96 machiner := cfg.NewMachinerAPI(nil) 97 return machiner, nil 98 } 99 var apiConn api.Connection 100 if err := context.Get(cfg.APICallerName, &apiConn); err != nil { 101 return nil, errors.Trace(err) 102 } 103 return wrapper{m: apimachiner.NewState(apiConn)}, nil 104 }