azure: updated to driver interface; refactored common GetSSHCommandFromDriver for those that need it

Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
Evan Hazlett 2015-03-09 22:53:21 -04:00
parent 51aa826e14
commit 52a3019d00
No known key found for this signature in database
GPG Key ID: A519480096146526
5 changed files with 153 additions and 195 deletions

View File

@ -16,7 +16,7 @@ import (
"github.com/docker/machine/drivers" "github.com/docker/machine/drivers"
_ "github.com/docker/machine/drivers/amazonec2" _ "github.com/docker/machine/drivers/amazonec2"
//_ "github.com/docker/machine/drivers/azure" _ "github.com/docker/machine/drivers/azure"
_ "github.com/docker/machine/drivers/digitalocean" _ "github.com/docker/machine/drivers/digitalocean"
//_ "github.com/docker/machine/drivers/google" //_ "github.com/docker/machine/drivers/google"
//_ "github.com/docker/machine/drivers/hyperv" //_ "github.com/docker/machine/drivers/hyperv"

View File

@ -16,6 +16,7 @@ import (
"github.com/codegangsta/cli" "github.com/codegangsta/cli"
"github.com/docker/docker/utils" "github.com/docker/docker/utils"
"github.com/docker/machine/drivers" "github.com/docker/machine/drivers"
"github.com/docker/machine/provider"
"github.com/docker/machine/ssh" "github.com/docker/machine/ssh"
"github.com/docker/machine/state" "github.com/docker/machine/state"
) )
@ -31,9 +32,9 @@ type Driver struct {
PublishSettingsFilePath string PublishSettingsFilePath string
Location string Location string
Size string Size string
UserName string
UserPassword string UserPassword string
Image string Image string
SSHUser string
SSHPort int SSHPort int
DockerPort int DockerPort int
CaCertPath string CaCertPath string
@ -51,7 +52,7 @@ func init() {
}) })
} }
// GetCreateFlags registers the flags this driver adds to // GetCreateFlags registers the flags this d adds to
// "docker hosts create" // "docker hosts create"
func GetCreateFlags() []cli.Flag { func GetCreateFlags() []cli.Flag {
return []cli.Flag{ return []cli.Flag{
@ -111,16 +112,48 @@ func GetCreateFlags() []cli.Flag {
} }
func NewDriver(machineName string, storePath string, caCert string, privateKey string) (drivers.Driver, error) { func NewDriver(machineName string, storePath string, caCert string, privateKey string) (drivers.Driver, error) {
driver := &Driver{MachineName: machineName, storePath: storePath, CaCertPath: caCert, PrivateKeyPath: privateKey} d := &Driver{MachineName: machineName, storePath: storePath, CaCertPath: caCert, PrivateKeyPath: privateKey}
return driver, nil return d, nil
} }
func (driver *Driver) DriverName() string { func (d *Driver) AuthorizePort(ports []*drivers.Port) error {
return nil
}
func (d *Driver) DeauthorizePort(ports []*drivers.Port) error {
return nil
}
func (d *Driver) GetMachineName() string {
return d.MachineName
}
func (d *Driver) GetSSHHostname() (string, error) {
return d.GetIP()
}
func (d *Driver) GetSSHKeyPath() string {
return filepath.Join(d.storePath, "id_rsa")
}
func (d *Driver) GetSSHPort() (int, error) {
return d.SSHPort, nil
}
func (d *Driver) GetSSHUsername() string {
return d.SSHUser
}
func (d *Driver) GetProviderType() provider.ProviderType {
return provider.Remote
}
func (d *Driver) DriverName() string {
return "azure" return "azure"
} }
func (driver *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
driver.SubscriptionID = flags.String("azure-subscription-id") d.SubscriptionID = flags.String("azure-subscription-id")
cert := flags.String("azure-subscription-cert") cert := flags.String("azure-subscription-cert")
publishSettings := flags.String("azure-publish-settings-file") publishSettings := flags.String("azure-publish-settings-file")
@ -131,51 +164,51 @@ func (driver *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
if _, err := os.Stat(cert); os.IsNotExist(err) { if _, err := os.Stat(cert); os.IsNotExist(err) {
return err return err
} }
driver.SubscriptionCert = cert d.SubscriptionCert = cert
} }
if publishSettings != "" { if publishSettings != "" {
if _, err := os.Stat(publishSettings); os.IsNotExist(err) { if _, err := os.Stat(publishSettings); os.IsNotExist(err) {
return err return err
} }
driver.PublishSettingsFilePath = publishSettings d.PublishSettingsFilePath = publishSettings
} }
if (driver.SubscriptionID == "" || driver.SubscriptionCert == "") && driver.PublishSettingsFilePath == "" { if (d.SubscriptionID == "" || d.SubscriptionCert == "") && d.PublishSettingsFilePath == "" {
return fmt.Errorf("Please specify azure subscription params using options: --azure-subscription-id and --azure-subscription-cert or --azure-publish-settings-file") return fmt.Errorf("Please specify azure subscription params using options: --azure-subscription-id and --azure-subscription-cert or --azure-publish-settings-file")
} }
if image == "" { if image == "" {
driver.Image = "b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20140927-en-us-30GB" d.Image = "b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20140927-en-us-30GB"
} else { } else {
driver.Image = image d.Image = image
} }
driver.Location = flags.String("azure-location") d.Location = flags.String("azure-location")
driver.Size = flags.String("azure-size") d.Size = flags.String("azure-size")
if strings.ToLower(username) == "docker" { if strings.ToLower(username) == "docker" {
return fmt.Errorf("'docker' is not valid user name for docker host. Please specify another user name") return fmt.Errorf("'docker' is not valid user name for docker host. Please specify another user name")
} }
driver.UserName = username d.SSHUser = username
driver.UserPassword = flags.String("azure-password") d.UserPassword = flags.String("azure-password")
driver.DockerPort = flags.Int("azure-docker-port") d.DockerPort = flags.Int("azure-docker-port")
driver.SSHPort = flags.Int("azure-ssh-port") d.SSHPort = flags.Int("azure-ssh-port")
driver.SwarmMaster = flags.Bool("swarm-master") d.SwarmMaster = flags.Bool("swarm-master")
driver.SwarmHost = flags.String("swarm-host") d.SwarmHost = flags.String("swarm-host")
driver.SwarmDiscovery = flags.String("swarm-discovery") d.SwarmDiscovery = flags.String("swarm-discovery")
return nil return nil
} }
func (driver *Driver) PreCreateCheck() error { func (d *Driver) PreCreateCheck() error {
if err := driver.setUserSubscription(); err != nil { if err := d.setUserSubscription(); err != nil {
return err return err
} }
// check azure DNS to make sure name is available // check azure DNS to make sure name is available
available, response, err := vmClient.CheckHostedServiceNameAvailability(driver.MachineName) available, response, err := vmClient.CheckHostedServiceNameAvailability(d.MachineName)
if err != nil { if err != nil {
return err return err
} }
@ -187,83 +220,69 @@ func (driver *Driver) PreCreateCheck() error {
return nil return nil
} }
func (driver *Driver) Create() error { func (d *Driver) Create() error {
if err := driver.setUserSubscription(); err != nil { if err := d.setUserSubscription(); err != nil {
return err return err
} }
log.Info("Creating Azure machine...") log.Info("Creating Azure machine...")
vmConfig, err := vmClient.CreateAzureVMConfiguration(driver.MachineName, driver.Size, driver.Image, driver.Location) vmConfig, err := vmClient.CreateAzureVMConfiguration(d.MachineName, d.Size, d.Image, d.Location)
if err != nil { if err != nil {
return err return err
} }
log.Debug("Generating certificate for Azure...") log.Debug("Generating certificate for Azure...")
if err := driver.generateCertForAzure(); err != nil { if err := d.generateCertForAzure(); err != nil {
return err return err
} }
log.Debug("Adding Linux provisioning...") log.Debug("Adding Linux provisioning...")
vmConfig, err = vmClient.AddAzureLinuxProvisioningConfig(vmConfig, driver.UserName, driver.UserPassword, driver.azureCertPath(), driver.SSHPort) user := d.GetSSHUsername()
port, err := d.GetSSHPort()
if err != nil {
return err
}
vmConfig, err = vmClient.AddAzureLinuxProvisioningConfig(vmConfig, user, d.UserPassword, d.azureCertPath(), port)
if err != nil { if err != nil {
return err return err
} }
log.Debug("Authorizing ports...") log.Debug("Authorizing ports...")
if err := driver.addDockerEndpoint(vmConfig); err != nil { if err := d.addDockerEndpoint(vmConfig); err != nil {
return err return err
} }
log.Debug("Creating VM...") log.Debug("Creating VM...")
if err := vmClient.CreateAzureVM(vmConfig, driver.MachineName, driver.Location); err != nil { if err := vmClient.CreateAzureVM(vmConfig, d.MachineName, d.Location); err != nil {
return err return err
} }
log.Info("Waiting for SSH...") log.Info("Waiting for SSH...")
log.Debugf("Host: %s SSH Port: %d", driver.getHostname(), driver.SSHPort) log.Debugf("Host: %s SSH Port: %d", d.getHostname(), d.SSHPort)
if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", driver.getHostname(), driver.SSHPort)); err != nil { if err := ssh.WaitForTCP(fmt.Sprintf("%s:%d", d.getHostname(), d.SSHPort)); err != nil {
return err return err
} }
return nil return nil
} }
func (driver *Driver) runSSHCommand(command string, retries int) error { func (d *Driver) GetURL() (string, error) {
cmd, err := driver.GetSSHCommand(command) url := fmt.Sprintf("tcp://%s:%v", d.getHostname(), d.DockerPort)
if err != nil {
return err
}
if err := cmd.Run(); err != nil {
if err.Error() == "exit status 255" {
if retries == 0 {
return err
}
return driver.runSSHCommand(command, retries-1)
}
return err
}
return nil
}
func (driver *Driver) GetURL() (string, error) {
url := fmt.Sprintf("tcp://%s:%v", driver.getHostname(), driver.DockerPort)
return url, nil return url, nil
} }
func (driver *Driver) GetIP() (string, error) { func (d *Driver) GetIP() (string, error) {
return driver.getHostname(), nil return d.getHostname(), nil
} }
func (driver *Driver) GetState() (state.State, error) { func (d *Driver) GetState() (state.State, error) {
err := driver.setUserSubscription() err := d.setUserSubscription()
if err != nil { if err != nil {
return state.Error, err return state.Error, err
} }
dockerVM, err := vmClient.GetVMDeployment(driver.MachineName, driver.MachineName) dockerVM, err := vmClient.GetVMDeployment(d.MachineName, d.MachineName)
if err != nil { if err != nil {
if strings.Contains(err.Error(), "Code: ResourceNotFound") { if strings.Contains(err.Error(), "Code: ResourceNotFound") {
return state.Error, fmt.Errorf("Azure host was not found. Please check your Azure subscription.") return state.Error, fmt.Errorf("Azure host was not found. Please check your Azure subscription.")
@ -285,13 +304,13 @@ func (driver *Driver) GetState() (state.State, error) {
return state.None, nil return state.None, nil
} }
func (driver *Driver) Start() error { func (d *Driver) Start() error {
err := driver.setUserSubscription() err := d.setUserSubscription()
if err != nil { if err != nil {
return err return err
} }
vmState, err := driver.GetState() vmState, err := d.GetState()
if err != nil { if err != nil {
return err return err
} }
@ -300,29 +319,29 @@ func (driver *Driver) Start() error {
return nil return nil
} }
log.Debugf("starting %s", driver.MachineName) log.Debugf("starting %s", d.MachineName)
err = vmClient.StartRole(driver.MachineName, driver.MachineName, driver.MachineName) err = vmClient.StartRole(d.MachineName, d.MachineName, d.MachineName)
if err != nil { if err != nil {
return err return err
} }
err = driver.waitForSSH() err = d.waitForSSH()
if err != nil { if err != nil {
return err return err
} }
err = driver.waitForDocker() err = d.waitForDocker()
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
func (driver *Driver) Stop() error { func (d *Driver) Stop() error {
err := driver.setUserSubscription() err := d.setUserSubscription()
if err != nil { if err != nil {
return err return err
} }
vmState, err := driver.GetState() vmState, err := d.GetState()
if err != nil { if err != nil {
return err return err
} }
@ -331,21 +350,21 @@ func (driver *Driver) Stop() error {
return nil return nil
} }
log.Debugf("stopping %s", driver.MachineName) log.Debugf("stopping %s", d.MachineName)
err = vmClient.ShutdownRole(driver.MachineName, driver.MachineName, driver.MachineName) err = vmClient.ShutdownRole(d.MachineName, d.MachineName, d.MachineName)
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
func (driver *Driver) Remove() error { func (d *Driver) Remove() error {
err := driver.setUserSubscription() err := d.setUserSubscription()
if err != nil { if err != nil {
return err return err
} }
available, _, err := vmClient.CheckHostedServiceNameAvailability(driver.MachineName) available, _, err := vmClient.CheckHostedServiceNameAvailability(d.MachineName)
if err != nil { if err != nil {
return err return err
} }
@ -353,9 +372,9 @@ func (driver *Driver) Remove() error {
return nil return nil
} }
log.Debugf("removing %s", driver.MachineName) log.Debugf("removing %s", d.MachineName)
err = vmClient.DeleteHostedService(driver.MachineName) err = vmClient.DeleteHostedService(d.MachineName)
if err != nil { if err != nil {
return err return err
} }
@ -363,12 +382,12 @@ func (driver *Driver) Remove() error {
return nil return nil
} }
func (driver *Driver) Restart() error { func (d *Driver) Restart() error {
err := driver.setUserSubscription() err := d.setUserSubscription()
if err != nil { if err != nil {
return err return err
} }
vmState, err := driver.GetState() vmState, err := d.GetState()
if err != nil { if err != nil {
return err return err
} }
@ -376,29 +395,29 @@ func (driver *Driver) Restart() error {
return fmt.Errorf("Host is already stopped, use start command to run it") return fmt.Errorf("Host is already stopped, use start command to run it")
} }
log.Debugf("restarting %s", driver.MachineName) log.Debugf("restarting %s", d.MachineName)
err = vmClient.RestartRole(driver.MachineName, driver.MachineName, driver.MachineName) err = vmClient.RestartRole(d.MachineName, d.MachineName, d.MachineName)
if err != nil { if err != nil {
return err return err
} }
err = driver.waitForSSH() err = d.waitForSSH()
if err != nil { if err != nil {
return err return err
} }
err = driver.waitForDocker() err = d.waitForDocker()
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
func (driver *Driver) Kill() error { func (d *Driver) Kill() error {
err := driver.setUserSubscription() err := d.setUserSubscription()
if err != nil { if err != nil {
return err return err
} }
vmState, err := driver.GetState() vmState, err := d.GetState()
if err != nil { if err != nil {
return err return err
} }
@ -407,102 +426,40 @@ func (driver *Driver) Kill() error {
return nil return nil
} }
log.Debugf("killing %s", driver.MachineName) log.Debugf("killing %s", d.MachineName)
err = vmClient.ShutdownRole(driver.MachineName, driver.MachineName, driver.MachineName) err = vmClient.ShutdownRole(d.MachineName, d.MachineName, d.MachineName)
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
func (d *Driver) StartDocker() error {
log.Debug("Starting Docker...")
cmd, err := d.GetSSHCommand("sudo service docker start")
if err != nil {
return err
}
if err := cmd.Run(); err != nil {
return err
}
return nil
}
func (d *Driver) StopDocker() error {
log.Debug("Stopping Docker...")
cmd, err := d.GetSSHCommand("sudo service docker stop")
if err != nil {
return err
}
if err := cmd.Run(); err != nil {
return err
}
return nil
}
func (d *Driver) GetDockerConfigDir() string { func (d *Driver) GetDockerConfigDir() string {
return dockerConfigDir return dockerConfigDir
} }
func (driver *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) {
err := driver.setUserSubscription()
if err != nil {
return nil, err
}
vmState, err := driver.GetState()
if err != nil {
return nil, err
}
if vmState == state.Stopped {
return nil, fmt.Errorf("Azure host is stopped. Please start it before using ssh command.")
}
return ssh.GetSSHCommand(driver.getHostname(), driver.SSHPort, driver.UserName, driver.sshKeyPath(), args...), nil
}
func (driver *Driver) Upgrade() error {
log.Debugf("Upgrading Docker")
cmd, err := driver.GetSSHCommand("sudo apt-get update && sudo apt-get install --upgrade lxc-docker")
if err != nil {
return err
}
if err := cmd.Run(); err != nil {
return err
}
return cmd.Run()
}
func generateVMName() string { func generateVMName() string {
randomID := utils.TruncateID(utils.GenerateRandomID()) randomID := utils.TruncateID(utils.GenerateRandomID())
return fmt.Sprintf("docker-host-%s", randomID) return fmt.Sprintf("docker-host-%s", randomID)
} }
func (driver *Driver) setUserSubscription() error { func (d *Driver) setUserSubscription() error {
if len(driver.PublishSettingsFilePath) != 0 { if len(d.PublishSettingsFilePath) != 0 {
err := azure.ImportPublishSettingsFile(driver.PublishSettingsFilePath) err := azure.ImportPublishSettingsFile(d.PublishSettingsFilePath)
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
err := azure.ImportPublishSettings(driver.SubscriptionID, driver.SubscriptionCert) err := azure.ImportPublishSettings(d.SubscriptionID, d.SubscriptionCert)
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
func (driver *Driver) addDockerEndpoint(vmConfig *vmClient.Role) error { func (d *Driver) addDockerEndpoint(vmConfig *vmClient.Role) error {
configSets := vmConfig.ConfigurationSets.ConfigurationSet configSets := vmConfig.ConfigurationSets.ConfigurationSet
if len(configSets) == 0 { if len(configSets) == 0 {
return fmt.Errorf("no configuration set") return fmt.Errorf("no configuration set")
@ -514,17 +471,17 @@ func (driver *Driver) addDockerEndpoint(vmConfig *vmClient.Role) error {
ep := vmClient.InputEndpoint{} ep := vmClient.InputEndpoint{}
ep.Name = "docker" ep.Name = "docker"
ep.Protocol = "tcp" ep.Protocol = "tcp"
ep.Port = driver.DockerPort ep.Port = d.DockerPort
ep.LocalPort = driver.DockerPort ep.LocalPort = d.DockerPort
configSets[i].InputEndpoints.InputEndpoint = append(configSets[i].InputEndpoints.InputEndpoint, ep) configSets[i].InputEndpoints.InputEndpoint = append(configSets[i].InputEndpoints.InputEndpoint, ep)
log.Debugf("added Docker endpoint (port %d) to configuration", driver.DockerPort) log.Debugf("added Docker endpoint (port %d) to configuration", d.DockerPort)
} }
return nil return nil
} }
func (driver *Driver) waitForSSH() error { func (d *Driver) waitForSSH() error {
log.Infof("Waiting for SSH...") log.Infof("Waiting for SSH...")
err := ssh.WaitForTCP(fmt.Sprintf("%s:%v", driver.getHostname(), driver.SSHPort)) err := ssh.WaitForTCP(fmt.Sprintf("%s:%v", d.getHostname(), d.SSHPort))
if err != nil { if err != nil {
return err return err
} }
@ -532,10 +489,10 @@ func (driver *Driver) waitForSSH() error {
return nil return nil
} }
func (driver *Driver) waitForDocker() error { func (d *Driver) waitForDocker() error {
log.Infof("Waiting for docker daemon on host to be available...") log.Infof("Waiting for docker daemon on host to be available...")
maxRepeats := 48 maxRepeats := 48
url := fmt.Sprintf("%s:%v", driver.getHostname(), driver.DockerPort) url := fmt.Sprintf("%s:%v", d.getHostname(), d.DockerPort)
success := waitForDockerEndpoint(url, maxRepeats) success := waitForDockerEndpoint(url, maxRepeats)
if !success { if !success {
return fmt.Errorf("Can not run docker daemon on remote machine. Please try again.") return fmt.Errorf("Can not run docker daemon on remote machine. Please try again.")
@ -561,12 +518,14 @@ func waitForDockerEndpoint(url string, maxRepeats int) bool {
return true return true
} }
func (driver *Driver) generateCertForAzure() error { func (d *Driver) generateCertForAzure() error {
if err := ssh.GenerateSSHKey(driver.sshKeyPath()); err != nil { keyPath := d.GetSSHKeyPath()
if err := ssh.GenerateSSHKey(keyPath); err != nil {
return err return err
} }
cmd := exec.Command("openssl", "req", "-x509", "-key", driver.sshKeyPath(), "-nodes", "-days", "365", "-newkey", "rsa:2048", "-out", driver.azureCertPath(), "-subj", "/C=AU/ST=Some-State/O=InternetWidgitsPtyLtd/CN=\\*") cmd := exec.Command("openssl", "req", "-x509", "-key", keyPath, "-nodes", "-days", "365", "-newkey", "rsa:2048", "-out", d.azureCertPath(), "-subj", "/C=AU/ST=Some-State/O=InternetWidgitsPtyLtd/CN=\\*")
if err := cmd.Run(); err != nil { if err := cmd.Run(); err != nil {
return err return err
} }
@ -574,18 +533,14 @@ func (driver *Driver) generateCertForAzure() error {
return nil return nil
} }
func (driver *Driver) sshKeyPath() string { func (d *Driver) publicSSHKeyPath() string {
return filepath.Join(driver.storePath, "id_rsa") return d.GetSSHKeyPath() + ".pub"
} }
func (driver *Driver) publicSSHKeyPath() string { func (d *Driver) azureCertPath() string {
return driver.sshKeyPath() + ".pub" return filepath.Join(d.storePath, "azure_cert.pem")
} }
func (driver *Driver) azureCertPath() string { func (d *Driver) getHostname() string {
return filepath.Join(driver.storePath, "azure_cert.pem") return d.MachineName + ".cloudapp.net"
}
func (driver *Driver) getHostname() string {
return driver.MachineName + ".cloudapp.net"
} }

View File

@ -3,10 +3,12 @@ package drivers
import ( import (
"errors" "errors"
"fmt" "fmt"
"os/exec"
"sort" "sort"
"github.com/codegangsta/cli" "github.com/codegangsta/cli"
"github.com/docker/machine/provider" "github.com/docker/machine/provider"
"github.com/docker/machine/ssh"
"github.com/docker/machine/state" "github.com/docker/machine/state"
) )
@ -156,3 +158,20 @@ type DriverOptions interface {
Int(key string) int Int(key string) int
Bool(key string) bool Bool(key string) bool
} }
func GetSSHCommandFromDriver(d Driver, args ...string) (*exec.Cmd, error) {
host, err := d.GetSSHHostname()
if err != nil {
return nil, err
}
port, err := d.GetSSHPort()
if err != nil {
return nil, err
}
user := d.GetSSHUsername()
keyPath := d.GetSSHKeyPath()
return ssh.GetSSHCommand(host, port, user, keyPath, args...), nil
}

View File

@ -461,24 +461,6 @@ func (d *Driver) setMachineNameIfNotSet() {
} }
} }
// getSSHCommand returns a command suitable for ssh
func (d *Driver) getSSHCommand(args ...string) (*exec.Cmd, error) {
host, err := d.GetSSHHostname()
if err != nil {
return nil, err
}
port, err := d.GetSSHPort()
if err != nil {
return nil, err
}
user := d.GetSSHUsername()
keyPath := d.GetSSHKeyPath()
return ssh.GetSSHCommand(host, port, user, keyPath, args...), nil
}
func (d *Driver) GetIP() (string, error) { func (d *Driver) GetIP() (string, error) {
// DHCP is used to get the IP, so virtualbox hosts don't have IPs unless // DHCP is used to get the IP, so virtualbox hosts don't have IPs unless
// they are running // they are running
@ -489,7 +471,7 @@ func (d *Driver) GetIP() (string, error) {
if s != state.Running { if s != state.Running {
return "", drivers.ErrHostIsNotRunning return "", drivers.ErrHostIsNotRunning
} }
cmd, err := d.getSSHCommand("ip addr show dev eth1") cmd, err := drivers.GetSSHCommandFromDriver(d, "ip addr show dev eth1")
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@ -117,6 +117,8 @@ func (h *Host) GetDockerConfigDir() (string, error) {
return "/var/lib/boot2docker", nil return "/var/lib/boot2docker", nil
case provider.Remote: case provider.Remote:
return "/etc/default", nil return "/etc/default", nil
case provider.None:
return "", nil
default: default:
return "", ErrUnknownHypervisorType return "", ErrUnknownHypervisorType
} }