~juju-qa/ubuntu/xenial/juju/xenial-2.0-beta3

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/cmd/jujud/agent/machine/stateworkers.go

  • Committer: Martin Packman
  • Date: 2016-03-30 19:31:08 UTC
  • mfrom: (1.1.41)
  • Revision ID: martin.packman@canonical.com-20160330193108-h9iz3ak334uk0z5r
Merge new upstream source 2.0~beta3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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(getResource dependency.GetResourceFunc) (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 := getResource(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
}