github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/worker/machineundertaker/manifold.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package machineundertaker 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/api/base" 12 "github.com/juju/juju/api/controller/machineundertaker" 13 "github.com/juju/juju/api/watcher" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/worker/common" 16 ) 17 18 // Logger represents the methods used by the worker to log details. 19 type Logger interface { 20 Tracef(string, ...interface{}) 21 Debugf(string, ...interface{}) 22 Infof(string, ...interface{}) 23 Errorf(string, ...interface{}) 24 } 25 26 // ManifoldConfig defines the machine undertaker's configuration and 27 // dependencies. 28 type ManifoldConfig struct { 29 APICallerName string 30 EnvironName string 31 Logger Logger 32 33 NewWorker func(Facade, environs.Environ, common.CredentialAPI, Logger) (worker.Worker, error) 34 NewCredentialValidatorFacade func(base.APICaller) (common.CredentialAPI, error) 35 } 36 37 // Manifold returns a dependency.Manifold that runs a machine 38 // undertaker. 39 func Manifold(config ManifoldConfig) dependency.Manifold { 40 return dependency.Manifold{ 41 Inputs: []string{config.APICallerName, config.EnvironName}, 42 Start: func(context dependency.Context) (worker.Worker, error) { 43 var apiCaller base.APICaller 44 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 45 return nil, errors.Trace(err) 46 } 47 var environ environs.Environ 48 if err := context.Get(config.EnvironName, &environ); err != nil { 49 return nil, errors.Trace(err) 50 } 51 api, err := machineundertaker.NewAPI(apiCaller, watcher.NewNotifyWatcher) 52 if err != nil { 53 return nil, errors.Trace(err) 54 } 55 56 credentialAPI, err := config.NewCredentialValidatorFacade(apiCaller) 57 if err != nil { 58 return nil, errors.Trace(err) 59 } 60 61 w, err := config.NewWorker(api, environ, credentialAPI, config.Logger) 62 if err != nil { 63 return nil, errors.Trace(err) 64 } 65 return w, nil 66 }, 67 } 68 }