Merge branch 'libmachine-validate-host-config' into internal-api

This commit is contained in:
Evan Hazlett 2015-03-20 00:10:12 -04:00
commit d770ea55f3
7 changed files with 134 additions and 19 deletions

View File

@ -374,15 +374,36 @@ func cmdCreate(c *cli.Context) {
log.Fatal("You must specify a machine name") log.Fatal("You must specify a machine name")
} }
if err := setupCertificates(c.GlobalString("tls-ca-cert"), c.GlobalString("tls-ca-key"), // setup cert paths
c.GlobalString("tls-client-cert"), c.GlobalString("tls-client-key")); err != nil { caCertPath := c.GlobalString("tls-ca-cert")
caKeyPath := c.GlobalString("tls-ca-key")
clientCertPath := c.GlobalString("tls-client-cert")
clientKeyPath := c.GlobalString("tls-client-key")
if caCertPath == "" {
caCertPath = filepath.Join(utils.GetMachineCertDir(), "ca.pem")
}
if caKeyPath == "" {
caKeyPath = filepath.Join(utils.GetMachineCertDir(), "ca-key.pem")
}
if clientCertPath == "" {
clientCertPath = filepath.Join(utils.GetMachineCertDir(), "cert.pem")
}
if clientKeyPath == "" {
clientKeyPath = filepath.Join(utils.GetMachineCertDir(), "key.pem")
}
if err := setupCertificates(caCertPath, caKeyPath, clientCertPath, clientKeyPath); err != nil {
log.Fatalf("Error generating certificates: %s", err) log.Fatalf("Error generating certificates: %s", err)
} }
defaultStore, err := getDefaultStore( defaultStore, err := getDefaultStore(
c.GlobalString("storage-path"), c.GlobalString("storage-path"),
c.GlobalString("tls-ca-cert"), caCertPath,
c.GlobalString("tls-ca-key"), caKeyPath,
) )
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@ -8,6 +8,8 @@ import (
"strings" "strings"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/docker/machine/libmachine/engine"
"github.com/docker/machine/libmachine/swarm"
"github.com/docker/machine/utils" "github.com/docker/machine/utils"
) )
@ -32,7 +34,8 @@ func (s Filestore) loadHost(name string) (*Host, error) {
return nil, err return nil, err
} }
return host, nil h := validateHost(host)
return h, nil
} }
func (s Filestore) GetPath() string { func (s Filestore) GetPath() string {
@ -146,3 +149,22 @@ func (s Filestore) RemoveActive() error {
func (s Filestore) activePath() string { func (s Filestore) activePath() string {
return filepath.Join(utils.GetMachineDir(), ".active") return filepath.Join(utils.GetMachineDir(), ".active")
} }
// validates host config and modifies if needed
// this is used for configuration updates
func validateHost(host *Host) *Host {
if host.EngineOptions == nil {
host.EngineOptions = &engine.EngineOptions{}
}
if host.SwarmOptions == nil {
host.SwarmOptions = &swarm.SwarmOptions{
Address: "",
Discovery: host.SwarmDiscovery,
Host: host.SwarmHost,
Master: host.SwarmMaster,
}
}
return host
}

View File

@ -48,6 +48,10 @@ type Host struct {
StorePath string StorePath string
EngineOptions *engine.EngineOptions EngineOptions *engine.EngineOptions
SwarmOptions *swarm.SwarmOptions SwarmOptions *swarm.SwarmOptions
// deprecated options; these are left to assist in config migrations
SwarmHost string
SwarmMaster bool
SwarmDiscovery string
} }
type HostOptions struct { type HostOptions struct {

11
main.go
View File

@ -3,7 +3,6 @@ package main
import ( import (
"os" "os"
"path" "path"
"path/filepath"
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/codegangsta/cli" "github.com/codegangsta/cli"
@ -39,32 +38,32 @@ func main() {
cli.StringFlag{ cli.StringFlag{
EnvVar: "MACHINE_STORAGE_PATH", EnvVar: "MACHINE_STORAGE_PATH",
Name: "storage-path", Name: "storage-path",
Value: utils.GetMachineRoot(), Value: utils.GetBaseDir(),
Usage: "Configures storage path", Usage: "Configures storage path",
}, },
cli.StringFlag{ cli.StringFlag{
EnvVar: "MACHINE_TLS_CA_CERT", EnvVar: "MACHINE_TLS_CA_CERT",
Name: "tls-ca-cert", Name: "tls-ca-cert",
Usage: "CA to verify remotes against", Usage: "CA to verify remotes against",
Value: filepath.Join(utils.GetMachineCertDir(), "ca.pem"), Value: "",
}, },
cli.StringFlag{ cli.StringFlag{
EnvVar: "MACHINE_TLS_CA_KEY", EnvVar: "MACHINE_TLS_CA_KEY",
Name: "tls-ca-key", Name: "tls-ca-key",
Usage: "Private key to generate certificates", Usage: "Private key to generate certificates",
Value: filepath.Join(utils.GetMachineCertDir(), "ca-key.pem"), Value: "",
}, },
cli.StringFlag{ cli.StringFlag{
EnvVar: "MACHINE_TLS_CLIENT_CERT", EnvVar: "MACHINE_TLS_CLIENT_CERT",
Name: "tls-client-cert", Name: "tls-client-cert",
Usage: "Client cert to use for TLS", Usage: "Client cert to use for TLS",
Value: filepath.Join(utils.GetMachineCertDir(), "cert.pem"), Value: "",
}, },
cli.StringFlag{ cli.StringFlag{
EnvVar: "MACHINE_TLS_CLIENT_KEY", EnvVar: "MACHINE_TLS_CLIENT_KEY",
Name: "tls-client-key", Name: "tls-client-key",
Usage: "Private key used in client TLS auth", Usage: "Private key used in client TLS auth",
Value: filepath.Join(utils.GetMachineCertDir(), "key.pem"), Value: "",
}, },
} }

View File

@ -0,0 +1,24 @@
{
"DriverName": "virtualbox",
"Driver": {
"MachineName": "test-vbox",
"SSHUser": "docker",
"SSHPort": 45515,
"Memory": 1024,
"DiskSize": 20000,
"Boot2DockerURL": "",
"CaCertPath": "/tmp/store/certs/ca.pem",
"PrivateKeyPath": "/tmp/store/certs/ca-key.pem",
"SwarmMaster": false,
"SwarmHost": "tcp://0.0.0.0:3376",
"SwarmDiscovery": ""
},
"CaCertPath": "/tmp/store/certs/ca.pem",
"ServerCertPath": "",
"ServerKeyPath": "",
"PrivateKeyPath": "/tmp/store/certs/ca-key.pem",
"ClientCertPath": "",
"SwarmMaster": false,
"SwarmHost": "tcp://0.0.0.0:3376",
"SwarmDiscovery": ""
}

View File

@ -0,0 +1,49 @@
{
"DriverName": "virtualbox",
"Driver": {
"MachineName": "test-vbox",
"SSHUser": "docker",
"SSHPort": 51575,
"Memory": 1024,
"DiskSize": 20000,
"Boot2DockerURL": "",
"CaCertPath": "/tmp/store/certs/ca.pem",
"PrivateKeyPath": "/tmp/store/certs/ca-key.pem",
"SwarmMaster": false,
"SwarmHost": "tcp://0.0.0.0:3376",
"SwarmDiscovery": ""
},
"CaCertPath": "/tmp/store/certs/ca.pem",
"PrivateKeyPath": "/tmp/store/certs/ca-key.pem",
"ServerCertPath": "",
"ServerKeyPath": "",
"ClientCertPath": "",
"StorePath": "/tmp/store/machines/test-vbox",
"EngineOptions": {
"Dns": null,
"GraphDir": "",
"Ipv6": false,
"Labels": null,
"LogLevel": "",
"StorageDriver": "",
"SelinuxEnabled": false,
"TlsCaCert": "",
"TlsCert": "",
"TlsKey": "",
"TlsVerify": false,
"RegistryMirror": null
},
"SwarmOptions": {
"Address": "",
"Discovery": "",
"Master": false,
"Host": "",
"Strategy": "",
"Heartbeat": 0,
"Overcommit": 0,
"TlsCaCert": "",
"TlsCert": "",
"TlsKey": "",
"TlsVerify": false
}
}

View File

@ -22,7 +22,7 @@ func GetHomeDir() string {
func GetBaseDir() string { func GetBaseDir() string {
baseDir := os.Getenv("MACHINE_STORAGE_PATH") baseDir := os.Getenv("MACHINE_STORAGE_PATH")
if baseDir == "" { if baseDir == "" {
baseDir = filepath.Join(GetHomeDir(), ".docker") baseDir = filepath.Join(GetHomeDir(), ".docker", "machine")
} }
return baseDir return baseDir
} }
@ -31,20 +31,16 @@ func GetDockerDir() string {
return filepath.Join(GetHomeDir(), ".docker") return filepath.Join(GetHomeDir(), ".docker")
} }
func GetMachineRoot() string {
return filepath.Join(GetBaseDir(), "machine")
}
func GetMachineDir() string { func GetMachineDir() string {
return filepath.Join(GetMachineRoot(), "machines") return filepath.Join(GetBaseDir(), "machines")
} }
func GetMachineCertDir() string { func GetMachineCertDir() string {
return filepath.Join(GetMachineRoot(), "certs") return filepath.Join(GetBaseDir(), "certs")
} }
func GetMachineCacheDir() string { func GetMachineCacheDir() string {
return filepath.Join(GetMachineRoot(), "cache") return filepath.Join(GetBaseDir(), "cache")
} }
func GetUsername() string { func GetUsername() string {