2015-02-16 23:16:36 +00:00
|
|
|
package provision
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
|
|
"github.com/docker/machine/drivers"
|
|
|
|
|
"github.com/docker/machine/libmachine/auth"
|
2015-04-17 15:15:49 -07:00
|
|
|
"github.com/docker/machine/libmachine/engine"
|
2015-02-16 23:16:36 +00:00
|
|
|
"github.com/docker/machine/libmachine/provision/pkgaction"
|
|
|
|
|
"github.com/docker/machine/libmachine/swarm"
|
2015-04-06 18:55:29 -07:00
|
|
|
"github.com/docker/machine/log"
|
2015-04-06 12:58:19 -07:00
|
|
|
"github.com/docker/machine/utils"
|
2015-02-16 23:16:36 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
Register("Ubuntu", &RegisteredProvisioner{
|
|
|
|
|
New: NewUbuntuProvisioner,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewUbuntuProvisioner(d drivers.Driver) Provisioner {
|
|
|
|
|
return &UbuntuProvisioner{
|
2015-05-02 23:02:27 -07:00
|
|
|
GenericProvisioner{
|
|
|
|
|
DockerOptionsDir: "/etc/docker",
|
|
|
|
|
DaemonOptionsFile: "/etc/default/docker",
|
|
|
|
|
OsReleaseId: "ubuntu",
|
|
|
|
|
Packages: []string{
|
|
|
|
|
"curl",
|
|
|
|
|
},
|
|
|
|
|
Driver: d,
|
2015-02-16 23:16:36 +00:00
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type UbuntuProvisioner struct {
|
2015-05-02 23:02:27 -07:00
|
|
|
GenericProvisioner
|
2015-02-16 23:16:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (provisioner *UbuntuProvisioner) Service(name string, action pkgaction.ServiceAction) error {
|
|
|
|
|
command := fmt.Sprintf("sudo service %s %s", name, action.String())
|
|
|
|
|
|
2015-03-29 18:10:06 +01:00
|
|
|
if _, err := provisioner.SSHCommand(command); err != nil {
|
2015-02-16 23:16:36 +00:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (provisioner *UbuntuProvisioner) Package(name string, action pkgaction.PackageAction) error {
|
2015-05-11 09:44:34 -04:00
|
|
|
var (
|
|
|
|
|
packageAction string
|
|
|
|
|
updateMetadata = true
|
|
|
|
|
)
|
2015-05-06 13:18:46 -07:00
|
|
|
|
2015-02-16 23:16:36 +00:00
|
|
|
switch action {
|
|
|
|
|
case pkgaction.Install:
|
|
|
|
|
packageAction = "install"
|
|
|
|
|
case pkgaction.Remove:
|
|
|
|
|
packageAction = "remove"
|
2015-05-06 13:18:46 -07:00
|
|
|
updateMetadata = false
|
2015-03-27 16:05:12 -07:00
|
|
|
case pkgaction.Upgrade:
|
|
|
|
|
packageAction = "upgrade"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: This should probably have a const
|
|
|
|
|
switch name {
|
|
|
|
|
case "docker":
|
|
|
|
|
name = "lxc-docker"
|
2015-02-16 23:16:36 +00:00
|
|
|
}
|
|
|
|
|
|
2015-05-06 13:18:46 -07:00
|
|
|
if updateMetadata {
|
|
|
|
|
// issue apt-get update for metadata
|
|
|
|
|
if _, err := provisioner.SSHCommand("sudo -E apt-get update"); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-16 23:16:36 +00:00
|
|
|
command := fmt.Sprintf("DEBIAN_FRONTEND=noninteractive sudo -E apt-get %s -y %s", packageAction, name)
|
|
|
|
|
|
2015-03-29 18:10:06 +01:00
|
|
|
if _, err := provisioner.SSHCommand(command); err != nil {
|
2015-02-16 23:16:36 +00:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-06 12:58:19 -07:00
|
|
|
func (provisioner *UbuntuProvisioner) dockerDaemonResponding() bool {
|
2015-03-29 18:10:06 +01:00
|
|
|
if _, err := provisioner.SSHCommand("sudo docker version"); err != nil {
|
2015-04-22 17:56:57 -04:00
|
|
|
log.Warnf("Error getting SSH command to check if the daemon is up: %s", err)
|
2015-04-06 12:58:19 -07:00
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The daemon is up if the command worked. Carry on.
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-17 15:15:49 -07:00
|
|
|
func (provisioner *UbuntuProvisioner) Provision(swarmOptions swarm.SwarmOptions, authOptions auth.AuthOptions, engineOptions engine.EngineOptions) error {
|
|
|
|
|
provisioner.SwarmOptions = swarmOptions
|
|
|
|
|
provisioner.AuthOptions = authOptions
|
|
|
|
|
provisioner.EngineOptions = engineOptions
|
2015-05-04 22:51:34 -07:00
|
|
|
|
|
|
|
|
if provisioner.EngineOptions.StorageDriver == "" {
|
|
|
|
|
provisioner.EngineOptions.StorageDriver = "aufs"
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-16 23:16:36 +00:00
|
|
|
if err := provisioner.SetHostname(provisioner.Driver.GetMachineName()); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-02 23:02:27 -07:00
|
|
|
for _, pkg := range provisioner.Packages {
|
2015-02-16 23:16:36 +00:00
|
|
|
if err := provisioner.Package(pkg, pkgaction.Install); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := installDockerGeneric(provisioner); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-06 12:58:19 -07:00
|
|
|
if err := utils.WaitFor(provisioner.dockerDaemonResponding); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-17 15:15:49 -07:00
|
|
|
if err := makeDockerOptionsDir(provisioner); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
|
|
|
|
|
|
|
|
|
|
if err := ConfigureAuth(provisioner); err != nil {
|
2015-02-16 23:16:36 +00:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-20 22:03:10 -07:00
|
|
|
if err := configureSwarm(provisioner, swarmOptions); err != nil {
|
2015-02-16 23:16:36 +00:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|