github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/upgrades/preupgradesteps.go (about)

     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 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  		if err := updateDistroInfo(); err != nil {
    29  			logger.Warningf("failed to update distro-info: %v", err)
    30  		}
    31  	}
    32  	return nil
    33  }
    34  
    35  // We'll be conservative and require at least 250MiB of disk space for an upgrade.
    36  var MinDiskSpaceMib = uint64(250)
    37  
    38  func checkDiskSpace(dir string) error {
    39  	usage := du.NewDiskUsage(dir)
    40  	free := usage.Free()
    41  	if free < uint64(MinDiskSpaceMib*humanize.MiByte) {
    42  		return errors.Errorf("not enough free disk space for upgrade: %s available, require %dMiB",
    43  			humanize.IBytes(free), MinDiskSpaceMib)
    44  	}
    45  	return nil
    46  }
    47  
    48  func updateDistroInfo() error {
    49  	pm := manager.NewAptPackageManager()
    50  	if err := pm.Update(); err != nil {
    51  		return errors.Annotate(err, "updating package list")
    52  	}
    53  	if err := pm.Install("distro-info"); err != nil {
    54  		return errors.Annotate(err, "updating distro-info package")
    55  	}
    56  	return series.UpdateSeriesVersions()
    57  }