docs/libmachine/provision/configure_swarm.go

109 lines
2.7 KiB
Go

package provision
import (
"fmt"
"net/url"
"strings"
"github.com/docker/machine/libmachine/auth"
"github.com/docker/machine/libmachine/log"
"github.com/docker/machine/libmachine/mcndockerclient"
"github.com/docker/machine/libmachine/swarm"
"github.com/samalba/dockerclient"
)
func configureSwarm(p Provisioner, swarmOptions swarm.Options, authOptions auth.Options) error {
if !swarmOptions.IsSwarm {
return nil
}
log.Info("Configuring swarm...")
ip, err := p.GetDriver().GetIP()
if err != nil {
return err
}
u, err := url.Parse(swarmOptions.Host)
if err != nil {
return err
}
parts := strings.Split(u.Host, ":")
port := parts[1]
dockerPort := "2376"
dockerDir := p.GetDockerOptionsDir()
dockerHost := fmt.Sprintf("tcp://%s:%s", ip, dockerPort)
dockerClient := mcndockerclient.RemoteDocker{dockerHost, &authOptions}
advertiseInfo := fmt.Sprintf("%s:%s", ip, dockerPort)
if swarmOptions.Master {
cmd := fmt.Sprintf("manage --tlsverify --tlscacert=%s --tlscert=%s --tlskey=%s -H %s --strategy %s --advertise %s",
authOptions.CaCertRemotePath,
authOptions.ServerCertRemotePath,
authOptions.ServerKeyRemotePath,
swarmOptions.Host,
swarmOptions.Strategy,
advertiseInfo,
)
cmdMaster := strings.Fields(cmd)
for _, option := range swarmOptions.ArbitraryFlags {
cmdMaster = append(cmdMaster, "--"+option)
}
//Discovery must be at end of command
cmdMaster = append(cmdMaster, swarmOptions.Discovery)
hostBind := fmt.Sprintf("%s:%s", dockerDir, dockerDir)
masterHostConfig := dockerclient.HostConfig{
RestartPolicy: dockerclient.RestartPolicy{
Name: "Always",
MaximumRetryCount: 0,
},
Binds: []string{hostBind},
PortBindings: map[string][]dockerclient.PortBinding{"3376/tcp": {{"", port}}},
NetworkMode: "host",
}
swarmMasterConfig := &dockerclient.ContainerConfig{
Image: swarmOptions.Image,
Env: swarmOptions.Env,
ExposedPorts: map[string]struct{}{
"2375/tcp": {},
"3376/tcp": {},
},
Cmd: cmdMaster,
HostConfig: masterHostConfig,
}
err = mcndockerclient.CreateContainer(dockerClient, swarmMasterConfig, "swarm-agent-master")
if err != nil {
return err
}
}
workerHostConfig := dockerclient.HostConfig{
RestartPolicy: dockerclient.RestartPolicy{
Name: "Always",
MaximumRetryCount: 0,
},
NetworkMode: "host",
}
swarmWorkerConfig := &dockerclient.ContainerConfig{
Image: swarmOptions.Image,
Env: swarmOptions.Env,
Cmd: []string{
"join",
"--advertise",
advertiseInfo,
swarmOptions.Discovery,
},
HostConfig: workerHostConfig,
}
return mcndockerclient.CreateContainer(dockerClient, swarmWorkerConfig, "swarm-agent")
}