github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/clock" 10 "github.com/juju/utils/fslock" 11 12 "github.com/juju/juju/agent" 13 "github.com/juju/juju/api/base" 14 "github.com/juju/juju/api/uniter" 15 "github.com/juju/juju/apiserver/params" 16 "github.com/juju/juju/core/leadership" 17 "github.com/juju/juju/worker" 18 "github.com/juju/juju/worker/dependency" 19 "github.com/juju/juju/worker/fortress" 20 "github.com/juju/juju/worker/uniter/operation" 21 ) 22 23 // ManifoldConfig defines the names of the manifolds on which a 24 // Manifold will depend. 25 type ManifoldConfig struct { 26 AgentName string 27 APICallerName string 28 MachineLockName string 29 LeadershipTrackerName string 30 CharmDirName string 31 HookRetryStrategyName string 32 } 33 34 // Manifold returns a dependency manifold that runs a uniter worker, 35 // using the resource names defined in the supplied config. 36 func Manifold(config ManifoldConfig) dependency.Manifold { 37 return dependency.Manifold{ 38 Inputs: []string{ 39 config.AgentName, 40 config.APICallerName, 41 config.LeadershipTrackerName, 42 config.MachineLockName, 43 config.CharmDirName, 44 config.HookRetryStrategyName, 45 }, 46 Start: func(context dependency.Context) (worker.Worker, error) { 47 48 // Collect all required resources. 49 var agent agent.Agent 50 if err := context.Get(config.AgentName, &agent); err != nil { 51 return nil, err 52 } 53 var apiCaller base.APICaller 54 if err := context.Get(config.APICallerName, &apiCaller); err != nil { 55 // TODO(fwereade): absence of an APICaller shouldn't be the end of 56 // the world -- we ought to return a type that can at least run the 57 // leader-deposed hook -- but that's not done yet. 58 return nil, err 59 } 60 var machineLock *fslock.Lock 61 if err := context.Get(config.MachineLockName, &machineLock); err != nil { 62 return nil, err 63 } 64 var leadershipTracker leadership.Tracker 65 if err := context.Get(config.LeadershipTrackerName, &leadershipTracker); err != nil { 66 return nil, err 67 } 68 var charmDirGuard fortress.Guard 69 if err := context.Get(config.CharmDirName, &charmDirGuard); err != nil { 70 return nil, err 71 } 72 73 var hookRetryStrategy params.RetryStrategy 74 if err := context.Get(config.HookRetryStrategyName, &hookRetryStrategy); err != nil { 75 return nil, err 76 } 77 78 // Configure and start the uniter. 79 config := agent.CurrentConfig() 80 tag := config.Tag() 81 unitTag, ok := tag.(names.UnitTag) 82 if !ok { 83 return nil, errors.Errorf("expected a unit tag, got %v", tag) 84 } 85 uniterFacade := uniter.NewState(apiCaller, unitTag) 86 uniter, err := NewUniter(&UniterParams{ 87 UniterFacade: uniterFacade, 88 UnitTag: unitTag, 89 LeadershipTracker: leadershipTracker, 90 DataDir: config.DataDir(), 91 MachineLock: machineLock, 92 CharmDirGuard: charmDirGuard, 93 UpdateStatusSignal: NewUpdateStatusTimer(), 94 HookRetryStrategy: hookRetryStrategy, 95 NewOperationExecutor: operation.NewExecutor, 96 Clock: clock.WallClock, 97 }) 98 if err != nil { 99 return nil, errors.Trace(err) 100 } 101 return uniter, nil 102 }, 103 } 104 }