~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/worker/hostkeyreporter/manifold.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

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 hostkeyreporter
 
5
 
 
6
import (
 
7
        "runtime"
 
8
 
 
9
        "github.com/juju/errors"
 
10
        "gopkg.in/juju/names.v2"
 
11
 
 
12
        "github.com/juju/juju/agent"
 
13
        "github.com/juju/juju/api/base"
 
14
        "github.com/juju/juju/worker"
 
15
        "github.com/juju/juju/worker/dependency"
 
16
)
 
17
 
 
18
// ManifoldConfig defines the names of the manifolds on which the
 
19
// hostkeyreporter worker depends.
 
20
type ManifoldConfig struct {
 
21
        AgentName     string
 
22
        APICallerName string
 
23
        RootDir       string
 
24
 
 
25
        NewFacade func(base.APICaller) (Facade, error)
 
26
        NewWorker func(Config) (worker.Worker, error)
 
27
}
 
28
 
 
29
// validate is called by start to check for bad configuration.
 
30
func (config ManifoldConfig) validate() error {
 
31
        if config.AgentName == "" {
 
32
                return errors.NotValidf("empty AgentName")
 
33
        }
 
34
        if config.APICallerName == "" {
 
35
                return errors.NotValidf("empty APICallerName")
 
36
        }
 
37
        if config.NewFacade == nil {
 
38
                return errors.NotValidf("nil NewFacade")
 
39
        }
 
40
        if config.NewWorker == nil {
 
41
                return errors.NotValidf("nil NewWorker")
 
42
        }
 
43
        return nil
 
44
}
 
45
 
 
46
// start is a StartFunc for a Worker manifold.
 
47
func (config ManifoldConfig) start(context dependency.Context) (worker.Worker, error) {
 
48
        if runtime.GOOS == "windows" {
 
49
                logger.Debugf("no SSH host keys to report on Windows machines")
 
50
                return nil, dependency.ErrUninstall
 
51
        }
 
52
 
 
53
        if err := config.validate(); err != nil {
 
54
                return nil, errors.Trace(err)
 
55
        }
 
56
        var agent agent.Agent
 
57
        if err := context.Get(config.AgentName, &agent); err != nil {
 
58
                return nil, errors.Trace(err)
 
59
        }
 
60
        var apiCaller base.APICaller
 
61
        if err := context.Get(config.APICallerName, &apiCaller); err != nil {
 
62
                return nil, errors.Trace(err)
 
63
        }
 
64
 
 
65
        tag := agent.CurrentConfig().Tag()
 
66
        if _, ok := tag.(names.MachineTag); !ok {
 
67
                return nil, errors.New("hostkeyreporter may only be used with a machine agent")
 
68
        }
 
69
 
 
70
        facade, err := config.NewFacade(apiCaller)
 
71
        if err != nil {
 
72
                return nil, errors.Trace(err)
 
73
        }
 
74
 
 
75
        worker, err := config.NewWorker(Config{
 
76
                Facade:    facade,
 
77
                MachineId: tag.Id(),
 
78
                RootDir:   config.RootDir,
 
79
        })
 
80
        if err != nil {
 
81
                return nil, errors.Trace(err)
 
82
        }
 
83
        return worker, nil
 
84
}
 
85
 
 
86
// Manifold returns a dependency manifold that runs the migration
 
87
// worker.
 
88
func Manifold(config ManifoldConfig) dependency.Manifold {
 
89
        return dependency.Manifold{
 
90
                Inputs: []string{
 
91
                        config.AgentName,
 
92
                        config.APICallerName,
 
93
                },
 
94
                Start: config.start,
 
95
        }
 
96
}