github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/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" 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 apiConn api.Connection 54 if err := context.Get(config.APICallerName, &apiConn); 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 downloader := api.NewCharmDownloader(apiConn.Client()) 79 80 // Configure and start the uniter. 81 config := agent.CurrentConfig() 82 tag := config.Tag() 83 unitTag, ok := tag.(names.UnitTag) 84 if !ok { 85 return nil, errors.Errorf("expected a unit tag, got %v", tag) 86 } 87 uniterFacade := uniter.NewState(apiConn, unitTag) 88 uniter, err := NewUniter(&UniterParams{ 89 UniterFacade: uniterFacade, 90 UnitTag: unitTag, 91 LeadershipTracker: leadershipTracker, 92 DataDir: config.DataDir(), 93 Downloader: downloader, 94 MachineLock: machineLock, 95 CharmDirGuard: charmDirGuard, 96 UpdateStatusSignal: NewUpdateStatusTimer(), 97 HookRetryStrategy: hookRetryStrategy, 98 NewOperationExecutor: operation.NewExecutor, 99 Clock: clock.WallClock, 100 }) 101 if err != nil { 102 return nil, errors.Trace(err) 103 } 104 return uniter, nil 105 }, 106 } 107 }