1
// Copyright 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
"launchpad.net/juju-core/environs"
10
"launchpad.net/juju-core/environs/config"
11
envtools "launchpad.net/juju-core/environs/tools"
12
"launchpad.net/juju-core/state"
13
"launchpad.net/juju-core/state/api/params"
14
coretools "launchpad.net/juju-core/tools"
15
"launchpad.net/juju-core/version"
18
type EntityFinderEnvironConfigGetter interface {
20
EnvironConfig() (*config.Config, error)
23
// ToolsGetter implements a common Tools method for use by various
25
type ToolsGetter struct {
26
st EntityFinderEnvironConfigGetter
27
getCanRead GetAuthFunc
30
// NewToolsGetter returns a new ToolsGetter. The GetAuthFunc will be
31
// used on each invocation of Tools to determine current permissions.
32
func NewToolsGetter(st EntityFinderEnvironConfigGetter, getCanRead GetAuthFunc) *ToolsGetter {
35
getCanRead: getCanRead,
39
// Tools finds the tools necessary for the given agents.
40
func (t *ToolsGetter) Tools(args params.Entities) (params.ToolsResults, error) {
41
result := params.ToolsResults{
42
Results: make([]params.ToolsResult, len(args.Entities)),
44
canRead, err := t.getCanRead()
48
agentVersion, cfg, err := t.getGlobalAgentVersion()
52
// SSLHostnameVerification defaults to true, so we need to
53
// invert that, for backwards-compatibility (older versions
54
// will have DisableSSLHostnameVerification: false by default).
55
disableSSLHostnameVerification := !cfg.SSLHostnameVerification()
56
env, err := environs.New(cfg)
60
for i, entity := range args.Entities {
61
agentTools, err := t.oneAgentTools(canRead, entity.Tag, agentVersion, env)
63
result.Results[i].Tools = agentTools
64
result.Results[i].DisableSSLHostnameVerification = disableSSLHostnameVerification
66
result.Results[i].Error = ServerError(err)
71
func (t *ToolsGetter) getGlobalAgentVersion() (version.Number, *config.Config, error) {
72
// Get the Agent Version requested in the Environment Config
73
nothing := version.Number{}
74
cfg, err := t.st.EnvironConfig()
76
return nothing, nil, err
78
agentVersion, ok := cfg.AgentVersion()
80
return nothing, nil, fmt.Errorf("agent version not set in environment config")
82
return agentVersion, cfg, nil
85
func (t *ToolsGetter) oneAgentTools(canRead AuthFunc, tag string, agentVersion version.Number, env environs.Environ) (*coretools.Tools, error) {
89
entity, err := t.st.FindEntity(tag)
93
tooler, ok := entity.(state.AgentTooler)
95
return nil, NotSupportedError(tag, "agent tools")
97
existingTools, err := tooler.AgentTools()
101
// TODO(jam): Avoid searching the provider for every machine
102
// that wants to upgrade. The information could just be cached
103
// in state, or even in the API servers
104
return envtools.FindExactTools(env, agentVersion, existingTools.Version.Series, existingTools.Version.Arch)