Add support for upgrade to new CE edition

Signed-off-by: Nathan LeClaire <nathan.leclaire@gmail.com>
This commit is contained in:
Nathan LeClaire
2017-02-22 14:52:26 -08:00
parent e095e1d031
commit d3ee30be50
7 changed files with 71 additions and 11 deletions

View File

@@ -7,6 +7,7 @@ import (
"github.com/docker/machine/libmachine/drivers"
"github.com/docker/machine/libmachine/engine"
"github.com/docker/machine/libmachine/log"
"github.com/docker/machine/libmachine/mcndockerclient"
"github.com/docker/machine/libmachine/mcnerror"
"github.com/docker/machine/libmachine/mcnutils"
"github.com/docker/machine/libmachine/provision"
@@ -15,6 +16,7 @@ import (
"github.com/docker/machine/libmachine/ssh"
"github.com/docker/machine/libmachine/state"
"github.com/docker/machine/libmachine/swarm"
"github.com/docker/machine/libmachine/versioncmp"
)
var (
@@ -162,6 +164,24 @@ func (h *Host) Restart() error {
return h.WaitForDocker()
}
func (h *Host) DockerVersion() (string, error) {
url, err := h.Driver.GetURL()
if err != nil {
return "", err
}
dockerHost := &mcndockerclient.RemoteDocker{
HostURL: url,
AuthOption: h.AuthOptions(),
}
dockerVersion, err := mcndockerclient.DockerVersion(dockerHost)
if err != nil {
return "", err
}
return dockerVersion, nil
}
func (h *Host) Upgrade() error {
machineState, err := h.Driver.GetState()
if err != nil {
@@ -180,6 +200,39 @@ func (h *Host) Upgrade() error {
return err
}
dockerVersion, err := h.DockerVersion()
if err != nil {
return err
}
// If we're upgrading from a pre-CE (e.g., 1.13.1) release to a CE
// release (e.g., 17.03.0-ce), we should simply uninstall and
// re-install from scratch, since the official package names will
// change from 'docker-engine' to 'docker-ce'.
if versioncmp.LessThanOrEqualTo(dockerVersion, provision.LastReleaseBeforeCEVersioning) &&
// RancherOS and boot2docker, being 'static ISO builds', have
// an upgrade process which simply grabs the latest if it's
// different, and so do not need to jump through this hoop to
// upgrade safely.
provisioner.String() != "rancheros" &&
provisioner.String() != "boot2docker" {
// Name of pacakge 'docker-engine' will fall through in this
// case, so that we execute, e.g.,
//
// 'sudo apt-get purge -y docker-engine'
if err := provisioner.Package("docker-engine", pkgaction.Purge); err != nil {
return err
}
// Then we kick off the normal provisioning process which will
// go off and install Docker (get.docker.com script should work
// fine to install Docker from scratch after removing the old
// packages, and images/containers etc. should be preserved in
// /var/lib/docker)
return h.Provision()
}
log.Info("Upgrading docker...")
if err := provisioner.Package("docker", pkgaction.Upgrade); err != nil {
return err

View File

@@ -51,6 +51,8 @@ func (provisioner *ArchProvisioner) Package(name string, action pkgaction.Packag
}
switch name {
case "docker-engine":
name = "docker"
case "docker":
name = "docker"
}

View File

@@ -44,6 +44,9 @@ func (provisioner *DebianProvisioner) Package(name string, action pkgaction.Pack
case pkgaction.Remove:
packageAction = "remove"
updateMetadata = false
case pkgaction.Purge:
packageAction = "purge"
updateMetadata = false
}
switch name {

View File

@@ -6,12 +6,14 @@ const (
Install PackageAction = iota
Remove
Upgrade
Purge
)
var packageActions = []string{
"install",
"remove",
"upgrade",
"purge",
}
func (s PackageAction) String() string {

View File

@@ -17,6 +17,10 @@ var (
detector Detector = &StandardDetector{}
)
const (
LastReleaseBeforeCEVersioning = "1.13.1"
)
type SSHCommander interface {
// Short-hand for accessing an SSH command from the driver.
SSHCommand(args string) (string, error)

View File

@@ -19,20 +19,11 @@ import (
var (
ErrUnknownYumOsRelease = errors.New("unknown OS for Yum repository")
packageListTemplate = `[docker]
name=Docker Stable Repository
baseurl=https://yum.dockerproject.org/repo/main/{{.OsRelease}}/{{.OsReleaseVersion}}
priority=1
enabled=1
gpgkey=https://yum.dockerproject.org/gpg
`
engineConfigTemplate = `[Service]
engineConfigTemplate = `[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:{{.DockerPort}} -H unix:///var/run/docker.sock --storage-driver {{.EngineOptions.StorageDriver}} --tlsverify --tlscacert {{.AuthOptions.CaCertRemotePath}} --tlscert {{.AuthOptions.ServerCertRemotePath}} --tlskey {{.AuthOptions.ServerKeyRemotePath}} {{ range .EngineOptions.Labels }}--label {{.}} {{ end }}{{ range .EngineOptions.InsecureRegistry }}--insecure-registry {{.}} {{ end }}{{ range .EngineOptions.RegistryMirror }}--registry-mirror {{.}} {{ end }}{{ range .EngineOptions.ArbitraryFlags }}--{{.}} {{ end }}
Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}}
`
majorVersionRE = regexp.MustCompile(`^(\d+)(\..*)?`)
)
@@ -95,6 +86,8 @@ func (provisioner *RedHatProvisioner) Package(name string, action pkgaction.Pack
packageAction = "install"
case pkgaction.Remove:
packageAction = "remove"
case pkgaction.Purge:
packageAction = "remove"
case pkgaction.Upgrade:
packageAction = "upgrade"
}

View File

@@ -60,11 +60,14 @@ func (provisioner *UbuntuSystemdProvisioner) Package(name string, action pkgacti
case pkgaction.Remove:
packageAction = "remove"
updateMetadata = false
case pkgaction.Purge:
packageAction = "purge"
updateMetadata = false
}
switch name {
case "docker":
name = "docker-engine"
name = "docker-ce"
}
if updateMetadata {