1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
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"
13
"github.com/juju/juju/agent"
14
"github.com/juju/juju/state"
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)
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")
34
// We'll be conservative and require at least 250MiB of disk space for an upgrade.
35
var MinDiskSpaceMib = uint64(250)
37
func checkDiskSpace(dir string) error {
38
usage := du.NewDiskUsage(dir)
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)
47
func updateDistroInfo() error {
48
pm := manager.NewAptPackageManager()
49
if err := pm.Update(); err != nil {
50
return errors.Annotate(err, "updating package list")
52
if err := pm.Install("distro-info"); err != nil {
53
return errors.Annotate(err, "updating distro-info package")
55
return series.UpdateSeriesVersions()