- 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>
164 lines
3.8 KiB
Go
164 lines
3.8 KiB
Go
package commands
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"text/template"
|
|
|
|
"github.com/codegangsta/cli"
|
|
"github.com/docker/machine/libmachine/log"
|
|
)
|
|
|
|
const (
|
|
envTmpl = `{{ .Prefix }}DOCKER_TLS_VERIFY{{ .Delimiter }}{{ .DockerTLSVerify }}{{ .Suffix }}{{ .Prefix }}DOCKER_HOST{{ .Delimiter }}{{ .DockerHost }}{{ .Suffix }}{{ .Prefix }}DOCKER_CERT_PATH{{ .Delimiter }}{{ .DockerCertPath }}{{ .Suffix }}{{ .Prefix }}DOCKER_MACHINE_NAME{{ .Delimiter }}{{ .MachineName }}{{ .Suffix }}{{ .UsageHint }}`
|
|
)
|
|
|
|
var (
|
|
improperEnvArgsError = errors.New("Error: Expected either one machine name, or -u flag to unset the variables in the arguments.")
|
|
)
|
|
|
|
type ShellConfig struct {
|
|
Prefix string
|
|
Delimiter string
|
|
Suffix string
|
|
DockerCertPath string
|
|
DockerHost string
|
|
DockerTLSVerify string
|
|
UsageHint string
|
|
MachineName string
|
|
}
|
|
|
|
func cmdEnv(c *cli.Context) {
|
|
if len(c.Args()) != 1 && !c.Bool("unset") {
|
|
log.Fatal(improperEnvArgsError)
|
|
}
|
|
|
|
h := getFirstArgHost(c)
|
|
|
|
dockerHost, authOptions, err := runConnectionBoilerplate(h, c)
|
|
if err != nil {
|
|
log.Fatalf("Error running connection boilerplate: %s", err)
|
|
}
|
|
|
|
userShell := c.String("shell")
|
|
if userShell == "" {
|
|
shell, err := detectShell()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
userShell = shell
|
|
}
|
|
|
|
t := template.New("envConfig")
|
|
|
|
usageHint := generateUsageHint(c.App.Name, c.Args().First(), userShell)
|
|
|
|
shellCfg := ShellConfig{
|
|
DockerCertPath: "",
|
|
DockerHost: "",
|
|
DockerTLSVerify: "",
|
|
MachineName: "",
|
|
}
|
|
|
|
// unset vars
|
|
if c.Bool("unset") {
|
|
switch userShell {
|
|
case "fish":
|
|
shellCfg.Prefix = "set -e "
|
|
shellCfg.Delimiter = ""
|
|
shellCfg.Suffix = ";\n"
|
|
case "powershell":
|
|
shellCfg.Prefix = "Remove-Item Env:\\\\"
|
|
shellCfg.Delimiter = ""
|
|
shellCfg.Suffix = "\n"
|
|
case "cmd":
|
|
// since there is no way to unset vars in cmd just reset to empty
|
|
shellCfg.DockerCertPath = ""
|
|
shellCfg.DockerHost = ""
|
|
shellCfg.DockerTLSVerify = ""
|
|
shellCfg.Prefix = "set "
|
|
shellCfg.Delimiter = "="
|
|
shellCfg.Suffix = "\n"
|
|
default:
|
|
shellCfg.Prefix = "unset "
|
|
shellCfg.Delimiter = " "
|
|
shellCfg.Suffix = "\n"
|
|
}
|
|
|
|
tmpl, err := t.Parse(envTmpl)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if err := tmpl.Execute(os.Stdout, shellCfg); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
shellCfg = ShellConfig{
|
|
DockerCertPath: authOptions.CertDir,
|
|
DockerHost: dockerHost,
|
|
DockerTLSVerify: "1",
|
|
UsageHint: usageHint,
|
|
MachineName: h.Name,
|
|
}
|
|
|
|
switch userShell {
|
|
case "fish":
|
|
shellCfg.Prefix = "set -x "
|
|
shellCfg.Suffix = "\";\n"
|
|
shellCfg.Delimiter = " \""
|
|
case "powershell":
|
|
shellCfg.Prefix = "$Env:"
|
|
shellCfg.Suffix = "\"\n"
|
|
shellCfg.Delimiter = " = \""
|
|
case "cmd":
|
|
shellCfg.Prefix = "set "
|
|
shellCfg.Suffix = "\n"
|
|
shellCfg.Delimiter = "="
|
|
default:
|
|
shellCfg.Prefix = "export "
|
|
shellCfg.Suffix = "\"\n"
|
|
shellCfg.Delimiter = "=\""
|
|
}
|
|
|
|
tmpl, err := t.Parse(envTmpl)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if err := tmpl.Execute(os.Stdout, shellCfg); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func generateUsageHint(appName, machineName, userShell string) string {
|
|
cmd := ""
|
|
switch userShell {
|
|
case "fish":
|
|
if machineName != "" {
|
|
cmd = fmt.Sprintf("eval (%s env %s)", appName, machineName)
|
|
} else {
|
|
cmd = fmt.Sprintf("eval (%s env)", appName)
|
|
}
|
|
case "powershell":
|
|
if machineName != "" {
|
|
cmd = fmt.Sprintf("%s env --shell=powershell %s | Invoke-Expression", appName, machineName)
|
|
} else {
|
|
cmd = fmt.Sprintf("%s env --shell=powershell | Invoke-Expression", appName)
|
|
}
|
|
case "cmd":
|
|
cmd = "copy and paste the above values into your command prompt"
|
|
default:
|
|
if machineName != "" {
|
|
cmd = fmt.Sprintf("eval \"$(%s env %s)\"", appName, machineName)
|
|
} else {
|
|
cmd = fmt.Sprintf("eval \"$(%s env)\"", appName)
|
|
}
|
|
}
|
|
|
|
return fmt.Sprintf("# Run this command to configure your shell: \n# %s\n", cmd)
|
|
}
|