/
upgrader.go
117 lines (107 loc) · 3.26 KB
/
upgrader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright 2012, 2013 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
package upgrader
import (
"fmt"
"github.com/juju/version"
"github.com/juju/juju/api/base"
apiwatcher "github.com/juju/juju/api/watcher"
"github.com/juju/juju/apiserver/params"
"github.com/juju/juju/tools"
"github.com/juju/juju/watcher"
)
// State provides access to an upgrader worker's view of the state.
type State struct {
facade base.FacadeCaller
}
// NewState returns a version of the state that provides functionality
// required by the upgrader worker.
func NewState(caller base.APICaller) *State {
return &State{base.NewFacadeCaller(caller, "Upgrader")}
}
// SetVersion sets the tools version associated with the entity with
// the given tag, which must be the tag of the entity that the
// upgrader is running on behalf of.
func (st *State) SetVersion(tag string, v version.Binary) error {
var results params.ErrorResults
args := params.EntitiesVersion{
AgentTools: []params.EntityVersion{{
Tag: tag,
Tools: ¶ms.Version{v},
}},
}
err := st.facade.FacadeCall("SetTools", args, &results)
if err != nil {
// TODO: Not directly tested
return err
}
return results.OneError()
}
func (st *State) DesiredVersion(tag string) (version.Number, error) {
var results params.VersionResults
args := params.Entities{
Entities: []params.Entity{{Tag: tag}},
}
err := st.facade.FacadeCall("DesiredVersion", args, &results)
if err != nil {
// TODO: Not directly tested
return version.Number{}, err
}
if len(results.Results) != 1 {
// TODO: Not directly tested
return version.Number{}, fmt.Errorf("expected 1 result, got %d", len(results.Results))
}
result := results.Results[0]
if err := result.Error; err != nil {
return version.Number{}, err
}
if result.Version == nil {
// TODO: Not directly tested
return version.Number{}, fmt.Errorf("received no error, but got a nil Version")
}
return *result.Version, nil
}
// Tools returns the agent tools that should run on the given entity,
// along with a flag whether to disable SSL hostname verification.
func (st *State) Tools(tag string) (tools.List, error) {
var results params.ToolsResults
args := params.Entities{
Entities: []params.Entity{{Tag: tag}},
}
err := st.facade.FacadeCall("Tools", args, &results)
if err != nil {
// TODO: Not directly tested
return nil, err
}
if len(results.Results) != 1 {
// TODO: Not directly tested
return nil, fmt.Errorf("expected 1 result, got %d", len(results.Results))
}
result := results.Results[0]
if err := result.Error; err != nil {
return nil, err
}
return result.ToolsList, nil
}
func (st *State) WatchAPIVersion(agentTag string) (watcher.NotifyWatcher, error) {
var results params.NotifyWatchResults
args := params.Entities{
Entities: []params.Entity{{Tag: agentTag}},
}
err := st.facade.FacadeCall("WatchAPIVersion", args, &results)
if err != nil {
// TODO: Not directly tested
return nil, err
}
if len(results.Results) != 1 {
// TODO: Not directly tested
return nil, fmt.Errorf("expected 1 result, got %d", len(results.Results))
}
result := results.Results[0]
if result.Error != nil {
// TODO: Not directly tested
return nil, result.Error
}
w := apiwatcher.NewNotifyWatcher(st.facade.RawAPICaller(), result)
return w, nil
}