github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/uniter/manifold.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package uniter 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/names" 9 "github.com/juju/utils/fslock" 10 11 "github.com/juju/juju/agent" 12 "github.com/juju/juju/api/base" 13 "github.com/juju/juju/api/uniter" 14 "github.com/juju/juju/worker" 15 "github.com/juju/juju/worker/dependency" 16 "github.com/juju/juju/worker/leadership" 17 "github.com/juju/juju/worker/uniter/operation" 18 ) 19 20 // ManifoldConfig defines the names of the manifolds on which a 21 // Manifold will depend. 22 type ManifoldConfig struct { 23 AgentName string 24 APICallerName string 25 MachineLockName string 26 LeadershipTrackerName string 27 } 28 29 // Manifold returns a dependency manifold that runs a uniter worker, 30 // using the resource names defined in the supplied config. 31 func Manifold(config ManifoldConfig) dependency.Manifold { 32 return dependency.Manifold{ 33 Inputs: []string{ 34 config.AgentName, 35 config.APICallerName, 36 config.LeadershipTrackerName, 37 config.MachineLockName, 38 }, 39 Start: func(getResource dependency.GetResourceFunc) (worker.Worker, error) { 40 41 // Collect all required resources. 42 var agent agent.Agent 43 if err := getResource(config.AgentName, &agent); err != nil { 44 return nil, err 45 } 46 var apiCaller base.APICaller 47 if err := getResource(config.APICallerName, &apiCaller); err != nil { 48 // TODO(fwereade): absence of an APICaller shouldn't be the end of 49 // the world -- we ought to return a type that can at least run the 50 // leader-deposed hook -- but that's not done yet. 51 return nil, err 52 } 53 var machineLock *fslock.Lock 54 if err := getResource(config.MachineLockName, &machineLock); err != nil { 55 return nil, err 56 } 57 var leadershipTracker leadership.Tracker 58 if err := getResource(config.LeadershipTrackerName, &leadershipTracker); err != nil { 59 return nil, err 60 } 61 62 // Configure and start the uniter. 63 config := agent.CurrentConfig() 64 tag := config.Tag() 65 unitTag, ok := tag.(names.UnitTag) 66 if !ok { 67 return nil, errors.Errorf("expected a unit tag, got %v", tag) 68 } 69 uniterFacade := uniter.NewState(apiCaller, unitTag) 70 return NewUniter(&UniterParams{ 71 UniterFacade: uniterFacade, 72 UnitTag: unitTag, 73 LeadershipTracker: leadershipTracker, 74 DataDir: config.DataDir(), 75 MachineLock: machineLock, 76 MetricsTimerChooser: NewMetricsTimerChooser(), 77 UpdateStatusSignal: NewUpdateStatusTimer(), 78 NewOperationExecutor: operation.NewExecutor, 79 }), nil 80 }, 81 } 82 }