github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/migrationflag/manifold.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package migrationflag 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 Check Predicate 20 21 NewFacade func(base.APICaller) (Facade, error) 22 NewWorker func(Config) (worker.Worker, error) 23 } 24 25 // validate is called by start to check for bad configuration. 26 func (config ManifoldConfig) validate() error { 27 if config.APICallerName == "" { 28 return errors.NotValidf("empty APICallerName") 29 } 30 if config.Check == nil { 31 return errors.NotValidf("nil Check") 32 } 33 if config.NewFacade == nil { 34 return errors.NotValidf("nil NewFacade") 35 } 36 if config.NewWorker == nil { 37 return errors.NotValidf("nil NewWorker") 38 } 39 return nil 40 } 41 42 // start is a StartFunc for a Worker manifold. 43 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 44 if err := config.validate(); err != nil { 45 return nil, errors.Trace(err) 46 } 47 var apiCaller base.APICaller 48 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 49 return nil, errors.Trace(err) 50 } 51 facade, err := config.NewFacade(apiCaller) 52 if err != nil { 53 return nil, errors.Trace(err) 54 } 55 modelTag, ok := apiCaller.ModelTag() 56 if !ok { 57 return nil, errors.New("API connection is controller-only (should never happen)") 58 } 59 worker, err := config.NewWorker(Config{ 60 Facade: facade, 61 Model: modelTag.Id(), 62 Check: config.Check, 63 }) 64 if err != nil { 65 return nil, errors.Trace(err) 66 } 67 return worker, nil 68 } 69 70 // Manifold packages a Worker for use in a dependency.Engine. 71 func Manifold(config ManifoldConfig) dependency.Manifold { 72 return dependency.Manifold{ 73 Inputs: []string{config.APICallerName}, 74 Start: config.start, 75 Output: engine.FlagOutput, 76 Filter: bounceErrChanged, 77 } 78 } 79 80 // bounceErrChanged converts ErrChanged to dependency.ErrBounce. 81 func bounceErrChanged(err error) error { 82 if errors.Cause(err) == ErrChanged { 83 return dependency.ErrBounce 84 } 85 return err 86 }