Implement upgrade functionality for boot2docker
Signed-off-by: Nathan LeClaire <nathan.leclaire@gmail.com>
This commit is contained in:
@@ -146,19 +146,6 @@ func (h *Host) GetSSHCommand(args ...string) (*exec.Cmd, error) {
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
func (h *Host) MachineInState(desiredState state.State) func() bool {
|
||||
return func() bool {
|
||||
currentState, err := h.Driver.GetState()
|
||||
if err != nil {
|
||||
log.Debugf("Error getting machine state: %s", err)
|
||||
}
|
||||
if currentState == desiredState {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func (h *Host) Start() error {
|
||||
if err := h.Driver.Start(); err != nil {
|
||||
return err
|
||||
@@ -168,7 +155,7 @@ func (h *Host) Start() error {
|
||||
return err
|
||||
}
|
||||
|
||||
return utils.WaitFor(h.MachineInState(state.Running))
|
||||
return utils.WaitFor(drivers.MachineInState(h.Driver, state.Running))
|
||||
}
|
||||
|
||||
func (h *Host) Stop() error {
|
||||
@@ -180,7 +167,7 @@ func (h *Host) Stop() error {
|
||||
return err
|
||||
}
|
||||
|
||||
return utils.WaitFor(h.MachineInState(state.Stopped))
|
||||
return utils.WaitFor(drivers.MachineInState(h.Driver, state.Stopped))
|
||||
}
|
||||
|
||||
func (h *Host) Kill() error {
|
||||
@@ -192,16 +179,16 @@ func (h *Host) Kill() error {
|
||||
return err
|
||||
}
|
||||
|
||||
return utils.WaitFor(h.MachineInState(state.Stopped))
|
||||
return utils.WaitFor(drivers.MachineInState(h.Driver, state.Stopped))
|
||||
}
|
||||
|
||||
func (h *Host) Restart() error {
|
||||
if h.MachineInState(state.Running)() {
|
||||
if drivers.MachineInState(h.Driver, state.Running)() {
|
||||
if err := h.Stop(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := utils.WaitFor(h.MachineInState(state.Stopped)); err != nil {
|
||||
if err := utils.WaitFor(drivers.MachineInState(h.Driver, state.Stopped)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -210,7 +197,7 @@ func (h *Host) Restart() error {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := utils.WaitFor(h.MachineInState(state.Running)); err != nil {
|
||||
if err := utils.WaitFor(drivers.MachineInState(h.Driver, state.Running)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -2,14 +2,17 @@ package provision
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"os/exec"
|
||||
"path"
|
||||
|
||||
log "github.com/Sirupsen/logrus"
|
||||
"github.com/docker/machine/drivers"
|
||||
"github.com/docker/machine/libmachine/auth"
|
||||
"github.com/docker/machine/libmachine/provision/pkgaction"
|
||||
"github.com/docker/machine/libmachine/swarm"
|
||||
"github.com/docker/machine/state"
|
||||
"github.com/docker/machine/utils"
|
||||
)
|
||||
|
||||
@@ -46,7 +49,54 @@ func (provisioner *Boot2DockerProvisioner) Service(name string, action pkgaction
|
||||
return nil
|
||||
}
|
||||
|
||||
func (provisioner *Boot2DockerProvisioner) upgradeIso() error {
|
||||
log.Infof("Stopping machine to do the upgrade...")
|
||||
|
||||
switch provisioner.Driver.DriverName() {
|
||||
case "vmwarefusion", "vmwarevsphere":
|
||||
return errors.New("Upgrade functionality is currently not supported for these providers, as they use a custom ISO.")
|
||||
}
|
||||
|
||||
if err := provisioner.Driver.Stop(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := utils.WaitFor(drivers.MachineInState(provisioner.Driver, state.Stopped)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
machineName := provisioner.GetDriver().GetMachineName()
|
||||
|
||||
log.Infof("Upgrading machine %s...", machineName)
|
||||
|
||||
b2dutils := utils.NewB2dUtils("", "")
|
||||
|
||||
// Usually we call this implicitly, but call it here explicitly to get
|
||||
// the latest boot2docker ISO.
|
||||
if err := b2dutils.DownloadLatestBoot2Docker(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Copy the latest version of boot2docker ISO to the machine's directory
|
||||
if err := b2dutils.CopyIsoToMachineDir("", machineName); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Infof("Starting machine back up...")
|
||||
|
||||
if err := provisioner.Driver.Start(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return utils.WaitFor(drivers.MachineInState(provisioner.Driver, state.Running))
|
||||
}
|
||||
|
||||
func (provisioner *Boot2DockerProvisioner) Package(name string, action pkgaction.PackageAction) error {
|
||||
if name == "docker" && action == pkgaction.Upgrade {
|
||||
if err := provisioner.upgradeIso(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user