With the way that provisioning was implemented, there was an issue getting connection to the UNIX socket to work with the new boot2docker 1.6rc2 ISO. This issue is related to the fact that the docker service was not truly stopped during the provisioning. This PR fixes the issue and provides some tests to help ensure that it does not come up again. Signed-off-by: Nathan LeClaire <nathan.leclaire@gmail.com>
148 lines
3.7 KiB
Go
148 lines
3.7 KiB
Go
package provision
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os/exec"
|
|
"path"
|
|
|
|
"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/utils"
|
|
)
|
|
|
|
func init() {
|
|
Register("boot2docker", &RegisteredProvisioner{
|
|
New: NewBoot2DockerProvisioner,
|
|
})
|
|
}
|
|
|
|
func NewBoot2DockerProvisioner(d drivers.Driver) Provisioner {
|
|
return &Boot2DockerProvisioner{
|
|
Driver: d,
|
|
}
|
|
}
|
|
|
|
type Boot2DockerProvisioner struct {
|
|
OsReleaseInfo *OsRelease
|
|
Driver drivers.Driver
|
|
SwarmOptions swarm.SwarmOptions
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) Service(name string, action pkgaction.ServiceAction) error {
|
|
var (
|
|
cmd *exec.Cmd
|
|
err error
|
|
)
|
|
cmd, err = provisioner.SSHCommand(fmt.Sprintf("sudo /etc/init.d/%s %s", name, action.String()))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) Package(name string, action pkgaction.PackageAction) error {
|
|
return nil
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) Hostname() (string, error) {
|
|
cmd, err := provisioner.SSHCommand(fmt.Sprintf("hostname"))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
var so bytes.Buffer
|
|
cmd.Stdout = &so
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return so.String(), nil
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) SetHostname(hostname string) error {
|
|
cmd, err := provisioner.SSHCommand(fmt.Sprintf(
|
|
"sudo hostname %s && echo %q | sudo tee /var/lib/boot2docker/etc/hostname",
|
|
hostname,
|
|
hostname,
|
|
))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return cmd.Run()
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) GetDockerOptionsDir() string {
|
|
return "/var/lib/boot2docker"
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) GenerateDockerOptions(dockerPort int, authOptions auth.AuthOptions) (*DockerOptions, error) {
|
|
defaultDaemonOpts := getDefaultDaemonOpts(provisioner.Driver.DriverName(), authOptions)
|
|
daemonOpts := fmt.Sprintf("-H tcp://0.0.0.0:%d", dockerPort)
|
|
daemonOptsDir := path.Join(provisioner.GetDockerOptionsDir(), "profile")
|
|
opts := fmt.Sprintf("%s %s", defaultDaemonOpts, daemonOpts)
|
|
daemonCfg := fmt.Sprintf(`EXTRA_ARGS='%s'
|
|
CACERT=%s
|
|
SERVERCERT=%s
|
|
SERVERKEY=%s
|
|
DOCKER_TLS=no`, opts, authOptions.CaCertRemotePath, authOptions.ServerCertRemotePath, authOptions.ServerKeyRemotePath)
|
|
return &DockerOptions{
|
|
EngineOptions: daemonCfg,
|
|
EngineOptionsPath: daemonOptsDir,
|
|
}, nil
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) CompatibleWithHost() bool {
|
|
return provisioner.OsReleaseInfo.Id == "boot2docker"
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) SetOsReleaseInfo(info *OsRelease) {
|
|
provisioner.OsReleaseInfo = info
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) Provision(swarmOptions swarm.SwarmOptions, authOptions auth.AuthOptions) error {
|
|
if err := provisioner.SetHostname(provisioner.Driver.GetMachineName()); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := installDockerGeneric(provisioner); err != nil {
|
|
return err
|
|
}
|
|
|
|
ip, err := provisioner.GetDriver().GetIP()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// b2d hosts need to wait for the daemon to be up
|
|
// before continuing with provisioning
|
|
if err := utils.WaitForDocker(ip, 2376); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := ConfigureAuth(provisioner, authOptions); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := configureSwarm(provisioner, swarmOptions); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) SSHCommand(args ...string) (*exec.Cmd, error) {
|
|
return drivers.GetSSHCommandFromDriver(provisioner.Driver, args...)
|
|
}
|
|
|
|
func (provisioner *Boot2DockerProvisioner) GetDriver() drivers.Driver {
|
|
return provisioner.Driver
|
|
}
|