- Clear out some cruft tightly coupling libmachine to filestore - Comment out drivers other than virtualbox for now - Change way too many things - Mostly, break out the code to be more modular. - Destroy all traces of "provider" in its current form. It will be brought back as something more sensible, instead of something which overlaps in function with both Host and Store. - Fix mis-managed config passthru - Remove a few instances of state stored in env vars - This should be explicitly communicated in Go-land, not through the shell. - Rename "store" module to "persist" - This is done mostly to avoid confusion about the fact that a concrete instance of a "Store" interface is oftentimes referred to as "store" in the code. - Rip out repetitive antipattern for getting store - This replaces the previous repetive idiom for getting the cert info, and consequently the store, with a much less repetitive idiom. - Also, some redundant methods in commands.go for accessing hosts have either been simplified or removed entirely. - First steps towards fixing up tests - Test progress continues - Replace unit tests with integration tests - MAKE ALL UNIT TESTS PASS YAY - Add helper test files - Don't write to disk in libmachine/host - Heh.. coverage check strikes again - Fix remove code - Move cert code around - Continued progress: simplify Driver - Fixups and make creation work with new model - Move drivers module inside of libmachine - Move ssh module inside of libmachine - Move state module to libmachine - Move utils module to libmachine - Move version module to libmachine - Move log module to libmachine - Modify some constructor methods around - Change Travis build dep structure - Boring gofmt fix - Add version module - Move NewHost to store - Update some boring cert path infos to make API easier to use - Fix up some issues around the new model - Clean up some cert path stuff - Don't use shady functions to get store path :D - Continue artifact work - Fix silly machines dir bug - Continue fixing silly path issues - Change up output of vbm a bit - Continue work to make example go - Change output a little more - Last changes needed to make create finish properly - Fix config.go to use libmachine - Cut down code duplication and make both methods work with libmachine - Add pluggable logging implementation - Return error when machine already in desired state - Update example to show log method - Fix file:// bug - Fix Swarm defaults - Remove unused TLS settings from Engine and Swarm options - Remove spurious error - Correct bug detecting if migration was performed - Fix compilation errors from tests - Fix most of remaining test issues - Fix final silly bug in tests - Remove extraneous debug code - Add -race to test command - Appease the gofmt - Appease the generate coverage - Making executive decision to remove Travis coverage check In the early days I thought this would be a good idea because it would encourage people to write tests in case they added a new module. Well, in fact it has just turned into a giant nuisance and made refactoring work like this even more difficult. - Move Get to Load - Move HostListItem code to CLI Signed-off-by: Nathan LeClaire <nathan.leclaire@gmail.com>
123 lines
2.9 KiB
Go
123 lines
2.9 KiB
Go
package provision
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"net/url"
|
|
"strings"
|
|
"text/template"
|
|
|
|
"github.com/docker/machine/libmachine/auth"
|
|
"github.com/docker/machine/libmachine/log"
|
|
"github.com/docker/machine/libmachine/swarm"
|
|
)
|
|
|
|
type SwarmCommandContext struct {
|
|
ContainerName string
|
|
DockerDir string
|
|
DockerPort int
|
|
Ip string
|
|
Port string
|
|
AuthOptions auth.AuthOptions
|
|
SwarmOptions swarm.SwarmOptions
|
|
SwarmImage string
|
|
}
|
|
|
|
// Wrapper function to generate a docker run swarm command (manage or join)
|
|
// from a template/context and execute it.
|
|
func runSwarmCommandFromTemplate(p Provisioner, cmdTmpl string, swarmCmdContext SwarmCommandContext) error {
|
|
var (
|
|
executedCmdTmpl bytes.Buffer
|
|
)
|
|
|
|
parsedMasterCmdTemplate, err := template.New("swarmMasterCmd").Parse(cmdTmpl)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
parsedMasterCmdTemplate.Execute(&executedCmdTmpl, swarmCmdContext)
|
|
|
|
log.Debugf("The swarm command being run is: %s", executedCmdTmpl.String())
|
|
|
|
if _, err := p.SSHCommand(executedCmdTmpl.String()); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func configureSwarm(p Provisioner, swarmOptions swarm.SwarmOptions, authOptions auth.AuthOptions) 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]
|
|
|
|
dockerDir := p.GetDockerOptionsDir()
|
|
|
|
swarmCmdContext := SwarmCommandContext{
|
|
ContainerName: "",
|
|
DockerDir: dockerDir,
|
|
DockerPort: 2376,
|
|
Ip: ip,
|
|
Port: port,
|
|
AuthOptions: authOptions,
|
|
SwarmOptions: swarmOptions,
|
|
SwarmImage: swarmOptions.Image,
|
|
}
|
|
|
|
// First things first, get the swarm image.
|
|
if _, err := p.SSHCommand(fmt.Sprintf("sudo docker pull %s", swarmOptions.Image)); err != nil {
|
|
return err
|
|
}
|
|
|
|
swarmMasterCmdTemplate := `sudo docker run -d \
|
|
--restart=always \
|
|
--name swarm-agent-master \
|
|
-p {{.Port}}:{{.Port}} \
|
|
-v {{.DockerDir}}:{{.DockerDir}} \
|
|
{{.SwarmImage}} \
|
|
manage \
|
|
--tlsverify \
|
|
--tlscacert={{.AuthOptions.CaCertRemotePath}} \
|
|
--tlscert={{.AuthOptions.ServerCertRemotePath}} \
|
|
--tlskey={{.AuthOptions.ServerKeyRemotePath}} \
|
|
-H {{.SwarmOptions.Host}} \
|
|
--strategy {{.SwarmOptions.Strategy}} {{range .SwarmOptions.ArbitraryFlags}} --{{.}}{{end}} {{.SwarmOptions.Discovery}}
|
|
`
|
|
|
|
swarmWorkerCmdTemplate := `sudo docker run -d \
|
|
--restart=always \
|
|
--name swarm-agent \
|
|
{{.SwarmImage}} \
|
|
join --advertise {{.Ip}}:{{.DockerPort}} {{.SwarmOptions.Discovery}}
|
|
`
|
|
|
|
if swarmOptions.Master {
|
|
log.Debug("Launching swarm master")
|
|
if err := runSwarmCommandFromTemplate(p, swarmMasterCmdTemplate, swarmCmdContext); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
log.Debug("Launch swarm worker")
|
|
if err := runSwarmCommandFromTemplate(p, swarmWorkerCmdTemplate, swarmCmdContext); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|