github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/cmd/jujud/agent/machine/stateworkers.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package machine 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/state" 10 "github.com/juju/juju/worker" 11 "github.com/juju/juju/worker/dependency" 12 workerstate "github.com/juju/juju/worker/state" 13 ) 14 15 // StateWorkersConfig provides the dependencies for the 16 // stateworkers manifold. 17 type StateWorkersConfig struct { 18 StateName string 19 StartStateWorkers func(*state.State) (worker.Worker, error) 20 } 21 22 // StateWorkersManifold starts workers that rely on a *state.State 23 // using a function provided to it. 24 // 25 // This manifold exists to start State-using workers which have not 26 // yet been ported to work directly with the dependency engine. Once 27 // all state workers started by StartStateWorkers have been migrated 28 // to the dependency engine, this manifold can be removed. 29 func StateWorkersManifold(config StateWorkersConfig) dependency.Manifold { 30 return dependency.Manifold{ 31 Inputs: []string{ 32 config.StateName, 33 }, 34 Start: func(context dependency.Context) (worker.Worker, error) { 35 if config.StartStateWorkers == nil { 36 return nil, errors.New("StartStateWorkers not specified") 37 } 38 39 var stTracker workerstate.StateTracker 40 if err := context.Get(config.StateName, &stTracker); err != nil { 41 return nil, err 42 } 43 44 st, err := stTracker.Use() 45 if err != nil { 46 return nil, errors.Annotate(err, "acquiring state") 47 } 48 49 w, err := config.StartStateWorkers(st) 50 if err != nil { 51 stTracker.Done() 52 return nil, errors.Annotate(err, "worker startup") 53 } 54 55 // When the state workers are done, indicate that we no 56 // longer need the State. 57 go func() { 58 w.Wait() 59 stTracker.Done() 60 }() 61 62 return w, nil 63 }, 64 } 65 }