github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 "runtime" 8 9 "github.com/juju/errors" 10 "gopkg.in/juju/names.v2" 11 "gopkg.in/juju/worker.v1" 12 "gopkg.in/juju/worker.v1/dependency" 13 14 "github.com/juju/juju/agent" 15 "github.com/juju/juju/api/base" 16 ) 17 18 // ManifoldConfig defines the names of the manifolds on which the 19 // hostkeyreporter worker depends. 20 type ManifoldConfig struct { 21 AgentName string 22 APICallerName string 23 RootDir string 24 25 NewFacade func(base.APICaller) (Facade, error) 26 NewWorker func(Config) (worker.Worker, error) 27 } 28 29 // validate is called by start to check for bad configuration. 30 func (config ManifoldConfig) validate() error { 31 if config.AgentName == "" { 32 return errors.NotValidf("empty AgentName") 33 } 34 if config.APICallerName == "" { 35 return errors.NotValidf("empty APICallerName") 36 } 37 if config.NewFacade == nil { 38 return errors.NotValidf("nil NewFacade") 39 } 40 if config.NewWorker == nil { 41 return errors.NotValidf("nil NewWorker") 42 } 43 return nil 44 } 45 46 // start is a StartFunc for a Worker manifold. 47 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 48 if runtime.GOOS == "windows" { 49 logger.Debugf("no SSH host keys to report on Windows machines") 50 return nil, dependency.ErrUninstall 51 } 52 53 if err := config.validate(); err != nil { 54 return nil, errors.Trace(err) 55 } 56 var agent agent.Agent 57 if err := context.Get(config.AgentName, &agent); err != nil { 58 return nil, errors.Trace(err) 59 } 60 var apiCaller base.APICaller 61 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 62 return nil, errors.Trace(err) 63 } 64 65 tag := agent.CurrentConfig().Tag() 66 if _, ok := tag.(names.MachineTag); !ok { 67 return nil, errors.New("hostkeyreporter may only be used with a machine agent") 68 } 69 70 facade, err := config.NewFacade(apiCaller) 71 if err != nil { 72 return nil, errors.Trace(err) 73 } 74 75 worker, err := config.NewWorker(Config{ 76 Facade: facade, 77 MachineId: tag.Id(), 78 RootDir: config.RootDir, 79 }) 80 if err != nil { 81 return nil, errors.Trace(err) 82 } 83 return worker, nil 84 } 85 86 // Manifold returns a dependency manifold that runs the migration 87 // worker. 88 func Manifold(config ManifoldConfig) dependency.Manifold { 89 return dependency.Manifold{ 90 Inputs: []string{ 91 config.AgentName, 92 config.APICallerName, 93 }, 94 Start: config.start, 95 } 96 }