diff --git a/libmachine/host.go b/libmachine/host.go index 2d4969f2e0..1b7d9e1caa 100644 --- a/libmachine/host.go +++ b/libmachine/host.go @@ -14,6 +14,7 @@ import ( "github.com/docker/machine/libmachine/auth" "github.com/docker/machine/libmachine/engine" "github.com/docker/machine/libmachine/provision" + "github.com/docker/machine/libmachine/provision/pkgaction" "github.com/docker/machine/libmachine/swarm" "github.com/docker/machine/ssh" "github.com/docker/machine/state" @@ -221,8 +222,19 @@ func (h *Host) Restart() error { } func (h *Host) Upgrade() error { - // TODO: refactor to provisioner - return fmt.Errorf("centralized upgrade coming in the provisioner") + provisioner, err := provision.DetectProvisioner(h.Driver) + if err != nil { + return err + } + + if err := provisioner.Package("docker", pkgaction.Upgrade); err != nil { + return err + } + + if err := provisioner.Service("docker", pkgaction.Restart); err != nil { + return err + } + return nil } func (h *Host) Remove(force bool) error { diff --git a/libmachine/provision/pkgaction/action.go b/libmachine/provision/pkgaction/action.go index af5b29770a..15cb85660f 100644 --- a/libmachine/provision/pkgaction/action.go +++ b/libmachine/provision/pkgaction/action.go @@ -27,11 +27,13 @@ type PackageAction int const ( Install PackageAction = iota Remove + Upgrade ) var packageActions = []string{ "install", "remove", + "upgrade", } func (s PackageAction) String() string { diff --git a/libmachine/provision/ubuntu.go b/libmachine/provision/ubuntu.go index 2b446a6592..92801b768d 100644 --- a/libmachine/provision/ubuntu.go +++ b/libmachine/provision/ubuntu.go @@ -56,6 +56,14 @@ func (provisioner *UbuntuProvisioner) Package(name string, action pkgaction.Pack packageAction = "install" case pkgaction.Remove: packageAction = "remove" + case pkgaction.Upgrade: + packageAction = "upgrade" + } + + // TODO: This should probably have a const + switch name { + case "docker": + name = "lxc-docker" } command := fmt.Sprintf("DEBIAN_FRONTEND=noninteractive sudo -E apt-get %s -y %s", packageAction, name)