1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
7
"github.com/juju/errors"
8
"github.com/juju/utils/clock"
9
"gopkg.in/juju/names.v2"
11
"github.com/juju/juju/agent"
12
"github.com/juju/juju/api"
13
"github.com/juju/juju/api/uniter"
14
"github.com/juju/juju/apiserver/params"
15
"github.com/juju/juju/core/leadership"
16
"github.com/juju/juju/worker"
17
"github.com/juju/juju/worker/dependency"
18
"github.com/juju/juju/worker/fortress"
19
"github.com/juju/juju/worker/uniter/operation"
22
// ManifoldConfig defines the names of the manifolds on which a
23
// Manifold will depend.
24
type ManifoldConfig struct {
27
MachineLockName string
29
LeadershipTrackerName string
31
HookRetryStrategyName string
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{
41
config.LeadershipTrackerName,
43
config.HookRetryStrategyName,
45
Start: func(context dependency.Context) (worker.Worker, error) {
46
if config.Clock == nil {
47
return nil, errors.NotValidf("missing Clock")
49
if config.MachineLockName == "" {
50
return nil, errors.NotValidf("missing MachineLockName")
53
// Collect all required resources.
55
if err := context.Get(config.AgentName, &agent); err != nil {
58
var apiConn api.Connection
59
if err := context.Get(config.APICallerName, &apiConn); err != nil {
60
// TODO(fwereade): absence of an APICaller shouldn't be the end of
61
// the world -- we ought to return a type that can at least run the
62
// leader-deposed hook -- but that's not done yet.
65
var leadershipTracker leadership.Tracker
66
if err := context.Get(config.LeadershipTrackerName, &leadershipTracker); err != nil {
69
var charmDirGuard fortress.Guard
70
if err := context.Get(config.CharmDirName, &charmDirGuard); err != nil {
74
var hookRetryStrategy params.RetryStrategy
75
if err := context.Get(config.HookRetryStrategyName, &hookRetryStrategy); err != nil {
79
downloader := api.NewCharmDownloader(apiConn.Client())
81
manifoldConfig := config
82
// Configure and start the uniter.
83
agentConfig := agent.CurrentConfig()
84
tag := agentConfig.Tag()
85
unitTag, ok := tag.(names.UnitTag)
87
return nil, errors.Errorf("expected a unit tag, got %v", tag)
89
uniterFacade := uniter.NewState(apiConn, unitTag)
90
uniter, err := NewUniter(&UniterParams{
91
UniterFacade: uniterFacade,
93
LeadershipTracker: leadershipTracker,
94
DataDir: agentConfig.DataDir(),
95
Downloader: downloader,
96
MachineLockName: manifoldConfig.MachineLockName,
97
CharmDirGuard: charmDirGuard,
98
UpdateStatusSignal: NewUpdateStatusTimer(),
99
HookRetryStrategy: hookRetryStrategy,
100
NewOperationExecutor: operation.NewExecutor,
101
Clock: manifoldConfig.Clock,
104
return nil, errors.Trace(err)