Merge pull request #11018 from unguiculus/feature/additional_zones
provider/google: [GKE] Allow additional zones to be configured
This commit is contained in:
commit
6558224de1
|
@ -92,6 +92,13 @@ func resourceContainerCluster() *schema.Resource {
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"additional_zones": &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Optional: true,
|
||||||
|
ForceNew: true,
|
||||||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||||||
|
},
|
||||||
|
|
||||||
"cluster_ipv4_cidr": &schema.Schema{
|
"cluster_ipv4_cidr": &schema.Schema{
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
@ -282,6 +289,24 @@ func resourceContainerClusterCreate(d *schema.ResourceData, meta interface{}) er
|
||||||
cluster.InitialClusterVersion = v.(string)
|
cluster.InitialClusterVersion = v.(string)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if v, ok := d.GetOk("additional_zones"); ok {
|
||||||
|
locationsList := v.([]interface{})
|
||||||
|
locations := []string{}
|
||||||
|
zoneInLocations := false
|
||||||
|
for _, v := range locationsList {
|
||||||
|
location := v.(string)
|
||||||
|
locations = append(locations, location)
|
||||||
|
if location == zoneName {
|
||||||
|
zoneInLocations = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !zoneInLocations {
|
||||||
|
// zone must be in locations if specified separately
|
||||||
|
locations = append(locations, zoneName)
|
||||||
|
}
|
||||||
|
cluster.Locations = locations
|
||||||
|
}
|
||||||
|
|
||||||
if v, ok := d.GetOk("cluster_ipv4_cidr"); ok {
|
if v, ok := d.GetOk("cluster_ipv4_cidr"); ok {
|
||||||
cluster.ClusterIpv4Cidr = v.(string)
|
cluster.ClusterIpv4Cidr = v.(string)
|
||||||
}
|
}
|
||||||
|
@ -419,6 +444,7 @@ func resourceContainerClusterRead(d *schema.ResourceData, meta interface{}) erro
|
||||||
|
|
||||||
d.Set("name", cluster.Name)
|
d.Set("name", cluster.Name)
|
||||||
d.Set("zone", cluster.Zone)
|
d.Set("zone", cluster.Zone)
|
||||||
|
d.Set("additional_zones", cluster.Locations)
|
||||||
d.Set("endpoint", cluster.Endpoint)
|
d.Set("endpoint", cluster.Endpoint)
|
||||||
|
|
||||||
masterAuth := []map[string]interface{}{
|
masterAuth := []map[string]interface{}{
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/hashicorp/terraform/helper/acctest"
|
"github.com/hashicorp/terraform/helper/acctest"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform/helper/resource"
|
||||||
"github.com/hashicorp/terraform/terraform"
|
"github.com/hashicorp/terraform/terraform"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAccContainerCluster_basic(t *testing.T) {
|
func TestAccContainerCluster_basic(t *testing.T) {
|
||||||
|
@ -26,6 +27,25 @@ func TestAccContainerCluster_basic(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAccContainerCluster_withAdditionalZones(t *testing.T) {
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckContainerClusterDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccContainerCluster_withAdditionalZones,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckContainerClusterExists(
|
||||||
|
"google_container_cluster.with_additional_zones"),
|
||||||
|
testAccCheckContainerClusterAdditionalZonesExist(
|
||||||
|
"google_container_cluster.with_additional_zones"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestAccContainerCluster_withVersion(t *testing.T) {
|
func TestAccContainerCluster_withVersion(t *testing.T) {
|
||||||
resource.Test(t, resource.TestCase{
|
resource.Test(t, resource.TestCase{
|
||||||
PreCheck: func() { testAccPreCheck(t) },
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
@ -143,6 +163,29 @@ func testAccCheckContainerClusterExists(n string) resource.TestCheckFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testAccCheckContainerClusterAdditionalZonesExist(n string) resource.TestCheckFunc {
|
||||||
|
return func(s *terraform.State) error {
|
||||||
|
rs, ok := s.RootModule().Resources[n]
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("Not found: %s", n)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
additionalZonesSize int
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
if additionalZonesSize, err = strconv.Atoi(rs.Primary.Attributes["additional_zones.#"]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if additionalZonesSize != 2 {
|
||||||
|
return fmt.Errorf("number of additional zones did not match 2")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var testAccContainerCluster_basic = fmt.Sprintf(`
|
var testAccContainerCluster_basic = fmt.Sprintf(`
|
||||||
resource "google_container_cluster" "primary" {
|
resource "google_container_cluster" "primary" {
|
||||||
name = "cluster-test-%s"
|
name = "cluster-test-%s"
|
||||||
|
@ -155,6 +198,23 @@ resource "google_container_cluster" "primary" {
|
||||||
}
|
}
|
||||||
}`, acctest.RandString(10))
|
}`, acctest.RandString(10))
|
||||||
|
|
||||||
|
var testAccContainerCluster_withAdditionalZones = fmt.Sprintf(`
|
||||||
|
resource "google_container_cluster" "with_additional_zones" {
|
||||||
|
name = "cluster-test-%s"
|
||||||
|
zone = "us-central1-a"
|
||||||
|
initial_node_count = 1
|
||||||
|
|
||||||
|
additional_zones = [
|
||||||
|
"us-central1-b",
|
||||||
|
"us-central1-c"
|
||||||
|
]
|
||||||
|
|
||||||
|
master_auth {
|
||||||
|
username = "mr.yoda"
|
||||||
|
password = "adoy.rm"
|
||||||
|
}
|
||||||
|
}`, acctest.RandString(10))
|
||||||
|
|
||||||
var testAccContainerCluster_withVersion = fmt.Sprintf(`
|
var testAccContainerCluster_withVersion = fmt.Sprintf(`
|
||||||
resource "google_container_cluster" "with_version" {
|
resource "google_container_cluster" "with_version" {
|
||||||
name = "cluster-test-%s"
|
name = "cluster-test-%s"
|
||||||
|
|
|
@ -20,6 +20,11 @@ resource "google_container_cluster" "primary" {
|
||||||
zone = "us-central1-a"
|
zone = "us-central1-a"
|
||||||
initial_node_count = 3
|
initial_node_count = 3
|
||||||
|
|
||||||
|
additional_zones = [
|
||||||
|
"us-central1-b",
|
||||||
|
"us-central1-c"
|
||||||
|
]
|
||||||
|
|
||||||
master_auth {
|
master_auth {
|
||||||
username = "mr.yoda"
|
username = "mr.yoda"
|
||||||
password = "adoy.rm"
|
password = "adoy.rm"
|
||||||
|
@ -47,9 +52,13 @@ resource "google_container_cluster" "primary" {
|
||||||
* `name` - (Required) The name of the cluster, unique within the project and
|
* `name` - (Required) The name of the cluster, unique within the project and
|
||||||
zone.
|
zone.
|
||||||
|
|
||||||
* `zone` - (Required) The zone that all resources should be created in.
|
* `zone` - (Required) The zone that the master and the number of nodes specified
|
||||||
|
in `initial_node_count` should be created in.
|
||||||
|
|
||||||
- - -
|
- - -
|
||||||
|
* `additional_zones` - (Optional) If additional zones are configured, the number
|
||||||
|
of nodes specified in `initial_node_count` is created in all specified zones.
|
||||||
|
|
||||||
* `addons_config` - (Optional) The configuration for addons supported by Google
|
* `addons_config` - (Optional) The configuration for addons supported by Google
|
||||||
Container Engine
|
Container Engine
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue