github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/modelworkermanager/manifold.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package modelworkermanager 5 6 import ( 7 "github.com/juju/errors" 8 "gopkg.in/juju/worker.v1" 9 "gopkg.in/juju/worker.v1/dependency" 10 11 jworker "github.com/juju/juju/worker" 12 "github.com/juju/juju/worker/common" 13 workerstate "github.com/juju/juju/worker/state" 14 ) 15 16 // ManifoldConfig holds the information necessary to run a model worker manager 17 // in a dependency.Engine. 18 type ManifoldConfig struct { 19 StateName string 20 NewWorker func(Config) (worker.Worker, error) 21 NewModelWorker NewModelWorkerFunc 22 } 23 24 // Validate validates the manifold configuration. 25 func (config ManifoldConfig) Validate() error { 26 if config.StateName == "" { 27 return errors.NotValidf("empty StateName") 28 } 29 if config.NewWorker == nil { 30 return errors.NotValidf("nil NewWorker") 31 } 32 if config.NewModelWorker == nil { 33 return errors.NotValidf("nil NewModelWorker") 34 } 35 return nil 36 } 37 38 // Manifold returns a dependency.Manifold that will run a model worker manager. 39 func Manifold(config ManifoldConfig) dependency.Manifold { 40 return dependency.Manifold{ 41 Inputs: []string{config.StateName}, 42 Start: config.start, 43 } 44 } 45 46 // start is a method on ManifoldConfig because it's more readable than a closure. 47 func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) { 48 if err := config.Validate(); err != nil { 49 return nil, errors.Trace(err) 50 } 51 52 var stTracker workerstate.StateTracker 53 if err := context.Get(config.StateName, &stTracker); err != nil { 54 return nil, errors.Trace(err) 55 } 56 statePool, err := stTracker.Use() 57 if err != nil { 58 return nil, errors.Trace(err) 59 } 60 61 w, err := config.NewWorker(Config{ 62 ModelWatcher: statePool.SystemState(), 63 ModelGetter: StatePoolModelGetter{statePool}, 64 NewModelWorker: config.NewModelWorker, 65 ErrorDelay: jworker.RestartDelay, 66 }) 67 if err != nil { 68 stTracker.Done() 69 return nil, errors.Trace(err) 70 } 71 return common.NewCleanupWorker(w, func() { stTracker.Done() }), nil 72 }