~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/upgrades/preupgradesteps.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 2015 Canonical Ltd.
 
2
// Licensed under the AGPLv3, see LICENCE file for details.
 
3
 
 
4
package upgrades
 
5
 
 
6
import (
 
7
        "github.com/dustin/go-humanize"
 
8
        "github.com/juju/errors"
 
9
        "github.com/juju/utils/du"
 
10
        "github.com/juju/utils/packaging/manager"
 
11
        "github.com/juju/utils/series"
 
12
 
 
13
        "github.com/juju/juju/agent"
 
14
        "github.com/juju/juju/state"
 
15
)
 
16
 
 
17
// PreUpgradeSteps runs various checks and prepares for performing an upgrade.
 
18
// If any check fails, an error is returned which aborts the upgrade.
 
19
func PreUpgradeSteps(st *state.State, agentConf agent.Config, isController, isMaster bool) error {
 
20
        if err := checkDiskSpace(agentConf.DataDir()); err != nil {
 
21
                return errors.Trace(err)
 
22
        }
 
23
        if isController {
 
24
                // Update distro info in case the new Juju controller version
 
25
                // is aware of new supported series. We'll keep going if this
 
26
                // fails, and the user can manually update it if they need to.
 
27
                logger.Infof("updating distro-info")
 
28
                err := updateDistroInfo()
 
29
                return errors.Annotate(err, "failed to update distro-info")
 
30
        }
 
31
        return nil
 
32
}
 
33
 
 
34
// We'll be conservative and require at least 250MiB of disk space for an upgrade.
 
35
var MinDiskSpaceMib = uint64(250)
 
36
 
 
37
func checkDiskSpace(dir string) error {
 
38
        usage := du.NewDiskUsage(dir)
 
39
        free := usage.Free()
 
40
        if free < uint64(MinDiskSpaceMib*humanize.MiByte) {
 
41
                return errors.Errorf("not enough free disk space for upgrade: %s available, require %dMiB",
 
42
                        humanize.IBytes(free), MinDiskSpaceMib)
 
43
        }
 
44
        return nil
 
45
}
 
46
 
 
47
func updateDistroInfo() error {
 
48
        pm := manager.NewAptPackageManager()
 
49
        if err := pm.Update(); err != nil {
 
50
                return errors.Annotate(err, "updating package list")
 
51
        }
 
52
        if err := pm.Install("distro-info"); err != nil {
 
53
                return errors.Annotate(err, "updating distro-info package")
 
54
        }
 
55
        return series.UpdateSeriesVersions()
 
56
}