github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/credentialvalidator/manifold.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package credentialvalidator 5 6 import ( 7 "github.com/juju/errors" 8 "gopkg.in/juju/worker.v1" 9 "gopkg.in/juju/worker.v1/dependency" 10 11 "github.com/juju/juju/api/base" 12 "github.com/juju/juju/cmd/jujud/agent/engine" 13 ) 14 15 // ManifoldConfig holds the dependencies and configuration for a 16 // Worker manifold. 17 type ManifoldConfig struct { 18 APICallerName string 19 20 NewFacade func(base.APICaller) (Facade, error) 21 NewWorker func(Config) (worker.Worker, error) 22 } 23 24 // Validate is called by start to check for bad configuration. 25 func (config ManifoldConfig) Validate() error { 26 if config.APICallerName == "" { 27 return errors.NotValidf("empty APICallerName") 28 } 29 if config.NewFacade == nil { 30 return errors.NotValidf("nil NewFacade") 31 } 32 if config.NewWorker == nil { 33 return errors.NotValidf("nil NewWorker") 34 } 35 return nil 36 } 37 38 // start is a StartFunc for a Worker manifold. 39 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 40 if err := config.Validate(); err != nil { 41 return nil, errors.Trace(err) 42 } 43 var apiCaller base.APICaller 44 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 45 return nil, errors.Trace(err) 46 } 47 facade, err := config.NewFacade(apiCaller) 48 if err != nil { 49 return nil, errors.Trace(err) 50 } 51 w, err := config.NewWorker(Config{ 52 Facade: facade, 53 }) 54 if err != nil { 55 return nil, errors.Trace(err) 56 } 57 return w, nil 58 } 59 60 // Manifold packages a Worker for use in a dependency.Engine. 61 func Manifold(config ManifoldConfig) dependency.Manifold { 62 return dependency.Manifold{ 63 Inputs: []string{config.APICallerName}, 64 Start: config.start, 65 Output: engine.FlagOutput, 66 Filter: filterErrors, 67 } 68 } 69 70 func filterErrors(err error) error { 71 cause := errors.Cause(err) 72 if cause == ErrValidityChanged || 73 cause == ErrModelCredentialChanged { 74 return dependency.ErrBounce 75 } 76 return err 77 }