diff --git a/commands.go b/commands.go index 01f03194..d7c922cf 100644 --- a/commands.go +++ b/commands.go @@ -18,7 +18,7 @@ import ( _ "github.com/docker/machine/drivers/amazonec2" _ "github.com/docker/machine/drivers/azure" _ "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/none" //_ "github.com/docker/machine/drivers/openstack" diff --git a/drivers/google/compute_util.go b/drivers/google/compute_util.go index a5a4a7fe..45ee1c00 100644 --- a/drivers/google/compute_util.go +++ b/drivers/google/compute_util.go @@ -28,8 +28,7 @@ type ComputeUtil struct { } const ( - apiURL = "https://www.googleapis.com/compute/v1/projects/" - //imageName = "https://www.googleapis.com/compute/v1/projects/google-containers/global/images/container-vm-v20150129" + apiURL = "https://www.googleapis.com/compute/v1/projects/" imageName = "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1404-trusty-v20150128" firewallRule = "docker-machines" port = "2376" @@ -48,7 +47,7 @@ func newComputeUtil(driver *Driver) (*ComputeUtil, error) { authTokenPath: driver.AuthTokenPath, zone: driver.Zone, instanceName: driver.MachineName, - userName: driver.UserName, + userName: driver.SSHUser, project: driver.Project, service: service, zoneURL: apiURL + driver.Project + "/zones/" + driver.Zone, @@ -203,7 +202,7 @@ func (c *ComputeUtil) createInstance(d *Driver) error { c.waitForSSH(ip) // Update the SSH Key - sshKey, err := ioutil.ReadFile(d.publicSSHKeyPath) + sshKey, err := ioutil.ReadFile(d.GetSSHKeyPath() + ".pub") if err != nil { return err } @@ -226,39 +225,6 @@ func (c *ComputeUtil) createInstance(d *Driver) 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 - } - - return nil -} - -func (c *ComputeUtil) updateDocker(d *Driver) 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 nil } diff --git a/drivers/google/google.go b/drivers/google/google.go index 8a7ed107..be3543bd 100644 --- a/drivers/google/google.go +++ b/drivers/google/google.go @@ -2,16 +2,14 @@ package google import ( "fmt" - - "github.com/docker/machine/state" - - "os/exec" - "path" + "path/filepath" log "github.com/Sirupsen/logrus" "github.com/codegangsta/cli" "github.com/docker/machine/drivers" + "github.com/docker/machine/provider" "github.com/docker/machine/ssh" + "github.com/docker/machine/state" ) const ( @@ -20,29 +18,27 @@ const ( // Driver is a struct compatible with the docker.hosts.drivers.Driver interface. type Driver struct { - MachineName string - Zone string - MachineType string - Scopes string - DiskSize int - AuthTokenPath string - storePath string - UserName string - Project string - CaCertPath string - PrivateKeyPath string - sshKeyPath string - publicSSHKeyPath string - SwarmMaster bool - SwarmHost string - SwarmDiscovery string + MachineName string + SSHUser string + SSHPort int + Zone string + MachineType string + Scopes string + DiskSize int + AuthTokenPath string + storePath string + Project string + CaCertPath string + PrivateKeyPath string + SwarmMaster bool + SwarmHost string + SwarmDiscovery string } // CreateFlags are the command line flags used to create a driver. type CreateFlags struct { Zone *string MachineType *string - UserName *string Project *string Scopes *string DiskSize *int @@ -105,40 +101,71 @@ func GetCreateFlags() []cli.Flag { // NewDriver creates a Driver with the specified storePath. func NewDriver(machineName string, storePath string, caCert string, privateKey string) (drivers.Driver, error) { return &Driver{ - MachineName: machineName, - storePath: storePath, - CaCertPath: caCert, - PrivateKeyPath: privateKey, - sshKeyPath: path.Join(storePath, "id_rsa"), - publicSSHKeyPath: path.Join(storePath, "id_rsa.pub"), + MachineName: machineName, + storePath: storePath, + CaCertPath: caCert, + PrivateKeyPath: privateKey, }, 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 +} + // DriverName returns the name of the driver. -func (driver *Driver) DriverName() string { +func (d *Driver) DriverName() string { return "google" } // SetConfigFromFlags initializes the driver based on the command line flags. -func (driver *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { - driver.Zone = flags.String("google-zone") - driver.MachineType = flags.String("google-machine-type") - driver.DiskSize = flags.Int("google-disk-size") - driver.UserName = flags.String("google-username") - driver.AuthTokenPath = flags.String("google-auth-token") - driver.Project = flags.String("google-project") - driver.Scopes = flags.String("google-scopes") - driver.SwarmMaster = flags.Bool("swarm-master") - driver.SwarmHost = flags.String("swarm-host") - driver.SwarmDiscovery = flags.String("swarm-discovery") - if driver.Project == "" { +func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { + d.Zone = flags.String("google-zone") + d.MachineType = flags.String("google-machine-type") + d.DiskSize = flags.Int("google-disk-size") + d.AuthTokenPath = flags.String("google-auth-token") + d.Project = flags.String("google-project") + d.Scopes = flags.String("google-scopes") + d.SwarmMaster = flags.Bool("swarm-master") + d.SwarmHost = flags.String("swarm-host") + d.SwarmDiscovery = flags.String("swarm-discovery") + if d.Project == "" { return fmt.Errorf("Please specify the Google Cloud Project name using the option --google-project.") } + d.SSHUser = flags.String("google-username") + d.SSHPort = 22 return nil } -func (driver *Driver) initApis() (*ComputeUtil, error) { - return newComputeUtil(driver) +func (d *Driver) initApis() (*ComputeUtil, error) { + return newComputeUtil(d) } func (d *Driver) PreCreateCheck() error { @@ -146,8 +173,8 @@ func (d *Driver) PreCreateCheck() error { } // Create creates a GCE VM instance acting as a docker host. -func (driver *Driver) Create() error { - c, err := newComputeUtil(driver) +func (d *Driver) Create() error { + c, err := newComputeUtil(d) if err != nil { return err } @@ -155,20 +182,20 @@ func (driver *Driver) Create() error { // Check if the instance already exists. There will be an error if the instance // doesn't exist, so just check instance for nil. if instance, _ := c.instance(); instance != nil { - return fmt.Errorf("Instance %v already exists.", driver.MachineName) + return fmt.Errorf("Instance %v already exists.", d.MachineName) } log.Infof("Generating SSH Key") - if err := ssh.GenerateSSHKey(driver.sshKeyPath); err != nil { + if err := ssh.GenerateSSHKey(d.GetSSHKeyPath()); err != nil { return err } - return c.createInstance(driver) + return c.createInstance(d) } // GetURL returns the URL of the remote docker daemon. -func (driver *Driver) GetURL() (string, error) { - ip, err := driver.GetIP() +func (d *Driver) GetURL() (string, error) { + ip, err := d.GetIP() if err != nil { return "", err } @@ -177,8 +204,8 @@ func (driver *Driver) GetURL() (string, error) { } // GetIP returns the IP address of the GCE instance. -func (driver *Driver) GetIP() (string, error) { - c, err := newComputeUtil(driver) +func (d *Driver) GetIP() (string, error) { + c, err := newComputeUtil(d) if err != nil { return "", err } @@ -186,8 +213,8 @@ func (driver *Driver) GetIP() (string, error) { } // GetState returns a docker.hosts.state.State value representing the current state of the host. -func (driver *Driver) GetState() (state.State, error) { - c, err := newComputeUtil(driver) +func (d *Driver) GetState() (state.State, error) { + c, err := newComputeUtil(d) if err != nil { return state.None, err } @@ -215,17 +242,17 @@ func (driver *Driver) GetState() (state.State, error) { } // Start creates a GCE instance and attaches it to the existing disk. -func (driver *Driver) Start() error { - c, err := newComputeUtil(driver) +func (d *Driver) Start() error { + c, err := newComputeUtil(d) if err != nil { return err } - return c.createInstance(driver) + return c.createInstance(d) } // Stop deletes the GCE instance, but keeps the disk. -func (driver *Driver) Stop() error { - c, err := newComputeUtil(driver) +func (d *Driver) Stop() error { + c, err := newComputeUtil(d) if err != nil { return err } @@ -233,12 +260,12 @@ func (driver *Driver) Stop() error { } // Remove deletes the GCE instance and the disk. -func (driver *Driver) Remove() error { - c, err := newComputeUtil(driver) +func (d *Driver) Remove() error { + c, err := newComputeUtil(d) if err != nil { return err } - s, err := driver.GetState() + s, err := d.GetState() if err != nil { return err } @@ -251,8 +278,8 @@ func (driver *Driver) Remove() error { } // Restart deletes and recreates the GCE instance, keeping the disk. -func (driver *Driver) Restart() error { - c, err := newComputeUtil(driver) +func (d *Driver) Restart() error { + c, err := newComputeUtil(d) if err != nil { return err } @@ -260,60 +287,10 @@ func (driver *Driver) Restart() error { return err } - return c.createInstance(driver) + return c.createInstance(d) } // Kill deletes the GCE instance, but keeps the disk. -func (driver *Driver) Kill() error { - return driver.Stop() -} - -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 -} - -// GetSSHCommand returns a command that will run over SSH on the GCE instance. -func (driver *Driver) GetSSHCommand(args ...string) (*exec.Cmd, error) { - ip, err := driver.GetIP() - if err != nil { - return nil, err - } - return ssh.GetSSHCommand(ip, 22, driver.UserName, driver.sshKeyPath, args...), nil -} - -// Upgrade upgrades the docker daemon on the host to the latest version. -func (driver *Driver) Upgrade() error { - c, err := newComputeUtil(driver) - if err != nil { - return err - } - return c.updateDocker(driver) +func (d *Driver) Kill() error { + return d.Stop() }