diff --git a/commands.go b/commands.go index ec53871228..49bbaf15ee 100644 --- a/commands.go +++ b/commands.go @@ -26,7 +26,7 @@ import ( _ "github.com/docker/machine/drivers/softlayer" _ "github.com/docker/machine/drivers/virtualbox" //_ "github.com/docker/machine/drivers/vmwarefusion" - //_ "github.com/docker/machine/drivers/vmwarevcloudair" + _ "github.com/docker/machine/drivers/vmwarevcloudair" //_ "github.com/docker/machine/drivers/vmwarevsphere" "github.com/docker/machine/state" "github.com/docker/machine/utils" diff --git a/drivers/vmwarevcloudair/vcloudair.go b/drivers/vmwarevcloudair/vcloudair.go index b613b5318c..3e828e6b15 100644 --- a/drivers/vmwarevcloudair/vcloudair.go +++ b/drivers/vmwarevcloudair/vcloudair.go @@ -7,8 +7,7 @@ package vmwarevcloudair import ( "fmt" "io/ioutil" - "os/exec" - "path" + "path/filepath" "strings" "github.com/vmware/govcloudair" @@ -17,6 +16,7 @@ import ( "github.com/codegangsta/cli" "github.com/docker/docker/utils" "github.com/docker/machine/drivers" + "github.com/docker/machine/provider" "github.com/docker/machine/ssh" "github.com/docker/machine/state" ) @@ -36,6 +36,7 @@ type Driver struct { Catalog string CatalogItem string MachineName string + SSHUser string SSHPort int DockerPort int Provision bool @@ -61,6 +62,7 @@ type CreateFlags struct { Catalog *string CatalogItem *string Name *string + SSHUser string SSHPort *int DockerPort *int Provision *bool @@ -166,55 +168,88 @@ func NewDriver(machineName string, storePath string, caCert string, privateKey s return driver, nil } +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 +} + // Driver interface implementation -func (driver *Driver) DriverName() string { +func (d *Driver) DriverName() string { return "vmwarevcloudair" } -func (driver *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { +func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { - driver.UserName = flags.String("vmwarevcloudair-username") - driver.UserPassword = flags.String("vmwarevcloudair-password") - driver.VDCID = flags.String("vmwarevcloudair-vdcid") - driver.PublicIP = flags.String("vmwarevcloudair-publicip") - driver.SwarmMaster = flags.Bool("swarm-master") - driver.SwarmHost = flags.String("swarm-host") - driver.SwarmDiscovery = flags.String("swarm-discovery") + d.UserName = flags.String("vmwarevcloudair-username") + d.UserPassword = flags.String("vmwarevcloudair-password") + d.VDCID = flags.String("vmwarevcloudair-vdcid") + d.PublicIP = flags.String("vmwarevcloudair-publicip") + d.SwarmMaster = flags.Bool("swarm-master") + d.SwarmHost = flags.String("swarm-host") + d.SwarmDiscovery = flags.String("swarm-discovery") // Check for required Params - if driver.UserName == "" || driver.UserPassword == "" || driver.VDCID == "" || driver.PublicIP == "" { + if d.UserName == "" || d.UserPassword == "" || d.VDCID == "" || d.PublicIP == "" { return fmt.Errorf("Please specify vcloudair mandatory params using options: -vmwarevcloudair-username -vmwarevcloudair-password -vmwarevcloudair-vdcid and -vmwarevcloudair-publicip") } // If ComputeID is not set we're using a VPC, hence setting ComputeID = VDCID if flags.String("vmwarevcloudair-computeid") == "" { - driver.ComputeID = flags.String("vmwarevcloudair-vdcid") + d.ComputeID = flags.String("vmwarevcloudair-vdcid") } else { - driver.ComputeID = flags.String("vmwarevcloudair-computeid") + d.ComputeID = flags.String("vmwarevcloudair-computeid") } // If the Org VDC Network is empty, set it to the default routed network. if flags.String("vmwarevcloudair-orgvdcnetwork") == "" { - driver.OrgVDCNet = flags.String("vmwarevcloudair-vdcid") + "-default-routed" + d.OrgVDCNet = flags.String("vmwarevcloudair-vdcid") + "-default-routed" } else { - driver.OrgVDCNet = flags.String("vmwarevcloudair-orgvdcnetwork") + d.OrgVDCNet = flags.String("vmwarevcloudair-orgvdcnetwork") } // If the Edge Gateway is empty, just set it to the default edge gateway. if flags.String("vmwarevcloudair-edgegateway") == "" { - driver.EdgeGateway = flags.String("vmwarevcloudair-vdcid") + d.EdgeGateway = flags.String("vmwarevcloudair-vdcid") } else { - driver.EdgeGateway = flags.String("vmwarevcloudair-edgegateway") + d.EdgeGateway = flags.String("vmwarevcloudair-edgegateway") } - driver.Catalog = flags.String("vmwarevcloudair-catalog") - driver.CatalogItem = flags.String("vmwarevcloudair-catalogitem") + d.Catalog = flags.String("vmwarevcloudair-catalog") + d.CatalogItem = flags.String("vmwarevcloudair-catalogitem") - driver.DockerPort = flags.Int("vmwarevcloudair-docker-port") - driver.SSHPort = flags.Int("vmwarevcloudair-ssh-port") - driver.Provision = flags.Bool("vmwarevcloudair-provision") - driver.CPUCount = flags.Int("vmwarevcloudair-cpu-count") - driver.MemorySize = flags.Int("vmwarevcloudair-memory-size") + d.DockerPort = flags.Int("vmwarevcloudair-docker-port") + d.SSHUser = "root" + d.SSHPort = flags.Int("vmwarevcloudair-ssh-port") + d.Provision = flags.Bool("vmwarevcloudair-provision") + d.CPUCount = flags.Int("vmwarevcloudair-cpu-count") + d.MemorySize = flags.Int("vmwarevcloudair-memory-size") return nil } @@ -395,26 +430,10 @@ func (d *Driver) Create() error { return err } - log.Info("Configuring Machine...") - - log.Debugf("Setting hostname: %s", d.MachineName) - cmd, err := d.GetSSHCommand(fmt.Sprintf( - "echo \"127.0.0.1 %s\" | sudo tee -a /etc/hosts && sudo hostname %s && echo \"%s\" | sudo tee /etc/hostname", - d.MachineName, - d.MachineName, - d.MachineName, - )) - if err != nil { - return err - } - if err := cmd.Run(); err != nil { - return err - } - connTest := "ping -c 3 www.google.com >/dev/null 2>&1 && ( echo \"Connectivity and DNS tests passed.\" ) || ( echo \"Connectivity and DNS tests failed, trying to add Nameserver to resolv.conf\"; echo \"nameserver 8.8.8.8\" >> /etc/resolv.conf )" log.Debugf("Connectivity and DNS sanity test...") - cmd, err = d.GetSSHCommand(connTest) + cmd, err := drivers.GetSSHCommandFromDriver(d, connTest) if err != nil { return err } @@ -437,7 +456,6 @@ func (d *Driver) Create() error { } func (d *Driver) Remove() error { - p, err := govcloudair.NewClient() if err != nil { return err @@ -660,7 +678,6 @@ func (d *Driver) Restart() error { } func (d *Driver) Kill() error { - p, err := govcloudair.NewClient() if err != nil { return err @@ -703,58 +720,6 @@ func (d *Driver) Kill() error { } -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 { - return dockerConfigDir -} - -func (d *Driver) Upgrade() error { - log.Debugf("Upgrading Docker") - - cmd, err := d.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 (d *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) { - return ssh.GetSSHCommand(d.PublicIP, d.SSHPort, "root", d.sshKeyPath(), args...), nil -} - // Helpers func generateVMName() string { @@ -763,8 +728,7 @@ func generateVMName() string { } func (d *Driver) createSSHKey() (string, error) { - - if err := ssh.GenerateSSHKey(d.sshKeyPath()); err != nil { + if err := ssh.GenerateSSHKey(d.GetSSHKeyPath()); err != nil { return "", err } @@ -776,10 +740,6 @@ func (d *Driver) createSSHKey() (string, error) { return string(publicKey), nil } -func (d *Driver) sshKeyPath() string { - return path.Join(d.storePath, "id_rsa") -} - func (d *Driver) publicSSHKeyPath() string { - return d.sshKeyPath() + ".pub" + return d.GetSSHKeyPath() + ".pub" }