~rogpeppe/juju-core/438-local-instance-Addresses

« back to all changes in this revision

Viewing changes to state/machine.go

[r=fwereade],[bug=1234035] Fix upgrade 1.14 -> 1.15

This adds a Tools() API call to provisioner API,
similarly to the upgrader API. Common code factored
out into apiserver/common/tools.go.

SetAgentTools() renamed to SetAgentVersion() in
machine and unit state types. Also renamed a few
types in params to be shorter or better reflect
what are they about. Added DEPRECATE(v1.18) tags
to bits of the API that need cleanup.

Live tested on EC2 - after copying the tools from
/tools/releases/ to /tools/ the upgrade proceeds
and finishes successfully.

https://codereview.appspot.com/14231044/

R=fwereade, jameinel

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
        "launchpad.net/juju-core/state/presence"
20
20
        "launchpad.net/juju-core/tools"
21
21
        "launchpad.net/juju-core/utils"
 
22
        "launchpad.net/juju-core/version"
22
23
)
23
24
 
24
25
// Machine represents the state of a machine.
200
201
        return &tools, nil
201
202
}
202
203
 
203
 
// checkToolsValidity checks whether the given tools are suitable for passing to SetAgentTools.
204
 
func checkToolsValidity(t *tools.Tools) error {
205
 
        if t.Version.Series == "" || t.Version.Arch == "" {
 
204
// checkVersionValidity checks whether the given version is suitable
 
205
// for passing to SetAgentVersion.
 
206
func checkVersionValidity(v version.Binary) error {
 
207
        if v.Series == "" || v.Arch == "" {
206
208
                return fmt.Errorf("empty series or arch")
207
209
        }
208
 
        if t.URL != "" && (t.Size == 0 || t.SHA256 == "") {
209
 
                return fmt.Errorf("empty size or checksum")
210
 
        }
211
210
        return nil
212
211
}
213
212
 
214
 
// SetAgentTools sets the tools that the agent is currently running.
215
 
func (m *Machine) SetAgentTools(t *tools.Tools) (err error) {
216
 
        defer utils.ErrorContextf(&err, "cannot set agent tools for machine %v", m)
217
 
        if err = checkToolsValidity(t); err != nil {
 
213
// SetAgentVersion sets the version of juju that the agent is
 
214
// currently running.
 
215
func (m *Machine) SetAgentVersion(v version.Binary) (err error) {
 
216
        defer utils.ErrorContextf(&err, "cannot set agent version for machine %v", m)
 
217
        if err = checkVersionValidity(v); err != nil {
218
218
                return err
219
219
        }
 
220
        tools := &tools.Tools{Version: v}
220
221
        ops := []txn.Op{{
221
222
                C:      m.st.machines.Name,
222
223
                Id:     m.doc.Id,
223
224
                Assert: notDeadDoc,
224
 
                Update: D{{"$set", D{{"tools", t}}}},
 
225
                Update: D{{"$set", D{{"tools", tools}}}},
225
226
        }}
226
227
        if err := m.st.runTransaction(ops); err != nil {
227
228
                return onAbort(err, errDead)
228
229
        }
229
 
        tools := *t
230
 
        m.doc.Tools = &tools
 
230
        m.doc.Tools = tools
231
231
        return nil
232
232
}
233
233