github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/hostkeyreporter/manifold.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package hostkeyreporter 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/base" 14 ) 15 16 // ManifoldConfig defines the names of the manifolds on which the 17 // hostkeyreporter worker depends. 18 type ManifoldConfig struct { 19 AgentName string 20 APICallerName string 21 RootDir string 22 23 NewFacade func(base.APICaller) (Facade, error) 24 NewWorker func(Config) (worker.Worker, error) 25 } 26 27 // validate is called by start to check for bad configuration. 28 func (config ManifoldConfig) validate() error { 29 if config.AgentName == "" { 30 return errors.NotValidf("empty AgentName") 31 } 32 if config.APICallerName == "" { 33 return errors.NotValidf("empty APICallerName") 34 } 35 if config.NewFacade == nil { 36 return errors.NotValidf("nil NewFacade") 37 } 38 if config.NewWorker == nil { 39 return errors.NotValidf("nil NewWorker") 40 } 41 return nil 42 } 43 44 // start is a StartFunc for a Worker manifold. 45 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 46 if err := config.validate(); err != nil { 47 return nil, errors.Trace(err) 48 } 49 var agent agent.Agent 50 if err := context.Get(config.AgentName, &agent); err != nil { 51 return nil, errors.Trace(err) 52 } 53 var apiCaller base.APICaller 54 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 55 return nil, errors.Trace(err) 56 } 57 58 tag := agent.CurrentConfig().Tag() 59 if _, ok := tag.(names.MachineTag); !ok { 60 return nil, errors.New("hostkeyreporter may only be used with a machine agent") 61 } 62 63 facade, err := config.NewFacade(apiCaller) 64 if err != nil { 65 return nil, errors.Trace(err) 66 } 67 68 worker, err := config.NewWorker(Config{ 69 Facade: facade, 70 MachineId: tag.Id(), 71 RootDir: config.RootDir, 72 }) 73 if err != nil { 74 return nil, errors.Trace(err) 75 } 76 return worker, nil 77 } 78 79 // Manifold returns a dependency manifold that runs the migration 80 // worker. 81 func Manifold(config ManifoldConfig) dependency.Manifold { 82 return dependency.Manifold{ 83 Inputs: []string{ 84 config.AgentName, 85 config.APICallerName, 86 }, 87 Start: config.start, 88 } 89 }