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 }