diff --git a/drivers/google/compute_util.go b/drivers/google/compute_util.go index 0f0cecfb8b..4368daabe2 100644 --- a/drivers/google/compute_util.go +++ b/drivers/google/compute_util.go @@ -3,6 +3,8 @@ package google import ( "fmt" "io/ioutil" + "net/url" + "strings" "time" log "github.com/Sirupsen/logrus" @@ -20,6 +22,8 @@ type ComputeUtil struct { zoneURL string globalURL string ipAddress string + swarmMaster bool + swarmHost string } const ( @@ -49,6 +53,8 @@ func newComputeUtil(driver *Driver) (*ComputeUtil, error) { service: service, zoneURL: apiURL + driver.Project + "/zones/" + driver.Zone, globalURL: apiURL + driver.Project + "/global", + swarmMaster: driver.swarmMaster, + swarmHost: driver.swarmHost, } return &c, nil } @@ -79,15 +85,33 @@ func (c *ComputeUtil) firewallRule() (*raw.Firewall, error) { func (c *ComputeUtil) createFirewallRule() error { log.Infof("Creating firewall rule.") - rule := &raw.Firewall{ - Allowed: []*raw.FirewallAllowed{ - { - IPProtocol: "tcp", - Ports: []string{ - port, - }, + allowed := []*raw.FirewallAllowed{ + + { + IPProtocol: "tcp", + Ports: []string{ + port, }, }, + } + + if c.swarmMaster { + u, err := url.Parse(c.swarmHost) + if err != nil { + return fmt.Errorf("error authorizing port for swarm: %s", err) + } + + parts := strings.Split(u.Host, ":") + swarmPort := parts[1] + allowed = append(allowed, &raw.FirewallAllowed{ + IPProtocol: "tcp", + Ports: []string{ + swarmPort, + }, + }) + } + rule := &raw.Firewall{ + Allowed: allowed, SourceRanges: []string{ "0.0.0.0/0", }, diff --git a/drivers/google/google.go b/drivers/google/google.go index a03d4cc143..a206bad5c3 100644 --- a/drivers/google/google.go +++ b/drivers/google/google.go @@ -31,6 +31,8 @@ type Driver struct { PrivateKeyPath string sshKeyPath string publicSSHKeyPath string + swarmMaster bool + swarmHost string } // CreateFlags are the command line flags used to create a driver. @@ -109,6 +111,8 @@ func (driver *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { driver.DiskSize = flags.Int("google-disk-size") driver.UserName = flags.String("google-username") driver.Project = flags.String("google-project") + driver.swarmMaster = flags.Bool("swarm-master") + driver.swarmHost = flags.String("swarm-host") if driver.Project == "" { return fmt.Errorf("Please specify the Google Cloud Project name using the option --google-project.") }