From b08884f49ef397616fc61a2ad34d2f269b352db1 Mon Sep 17 00:00:00 2001 From: The Magician Date: Tue, 30 Oct 2018 17:56:41 -0700 Subject: [PATCH] regional and private clusters are in GA now (#2364) /cc @danawillow Fixes #2286 --- google/resource_container_cluster.go | 85 +++++++++++++++++++++-- google/resource_container_cluster_test.go | 69 ++++++++++++++++++ 2 files changed, 148 insertions(+), 6 deletions(-) diff --git a/google/resource_container_cluster.go b/google/resource_container_cluster.go index 10210d09..4e917625 100644 --- a/google/resource_container_cluster.go +++ b/google/resource_container_cluster.go @@ -97,7 +97,6 @@ func resourceContainerCluster() *schema.Resource { }, "region": { - Deprecated: "This field is in beta and will be removed from this provider. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details.", Type: schema.TypeString, Optional: true, Computed: true, @@ -505,11 +504,48 @@ func resourceContainerCluster() *schema.Resource { }, "private_cluster": { - Deprecated: "This field is in beta and will be removed from this provider. Use it in the the google-beta provider instead. See https://terraform.io/docs/providers/google/provider_versions.html for more details.", - Default: false, - Type: schema.TypeBool, - Optional: true, - ForceNew: true, + Deprecated: "Use private_cluster_config.enable_private_nodes instead.", + ConflictsWith: []string{"private_cluster_config"}, + Computed: true, + Type: schema.TypeBool, + Optional: true, + ForceNew: true, + }, + + "private_cluster_config": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Computed: true, + ConflictsWith: []string{"private_cluster", "master_ipv4_cidr_block"}, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "enable_private_endpoint": { + Type: schema.TypeBool, + Optional: true, + ForceNew: true, + }, + "enable_private_nodes": { + Type: schema.TypeBool, + Optional: true, + ForceNew: true, + }, + "master_ipv4_cidr_block": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + ValidateFunc: validation.CIDRNetwork(28, 28), + }, + "private_endpoint": { + Type: schema.TypeString, + Computed: true, + }, + "public_endpoint": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, }, "master_ipv4_cidr_block": { @@ -651,6 +687,10 @@ func resourceContainerClusterCreate(d *schema.ResourceData, meta interface{}) er } } + if v, ok := d.GetOk("private_cluster_config"); ok { + cluster.PrivateClusterConfig = expandPrivateClusterConfig(v) + } + req := &containerBeta.CreateClusterRequest{ Cluster: cluster, } @@ -777,6 +817,10 @@ func resourceContainerClusterRead(d *schema.ResourceData, meta interface{}) erro return err } + if err := d.Set("private_cluster_config", flattenPrivateClusterConfig(cluster.PrivateClusterConfig)); err != nil { + return err + } + igUrls, err := getInstanceGroupUrlsFromManagerUrls(config, cluster.InstanceGroupUrls) if err != nil { return err @@ -1513,6 +1557,20 @@ func expandNetworkPolicy(configured interface{}) *containerBeta.NetworkPolicy { return result } +func expandPrivateClusterConfig(configured interface{}) *containerBeta.PrivateClusterConfig { + l := configured.([]interface{}) + if len(l) == 0 { + return nil + } + config := l[0].(map[string]interface{}) + return &containerBeta.PrivateClusterConfig{ + EnablePrivateEndpoint: config["enable_private_endpoint"].(bool), + EnablePrivateNodes: config["enable_private_nodes"].(bool), + MasterIpv4CidrBlock: config["master_ipv4_cidr_block"].(string), + ForceSendFields: []string{"EnablePrivateEndpoint", "EnablePrivateNodes", "MasterIpv4CidrBlock"}, + } +} + func expandPodSecurityPolicyConfig(configured interface{}) *containerBeta.PodSecurityPolicyConfig { l := configured.([]interface{}) if len(l) == 0 || l[0] == nil { @@ -1594,6 +1652,21 @@ func flattenClusterNodePools(d *schema.ResourceData, config *Config, c []*contai return nodePools, nil } +func flattenPrivateClusterConfig(c *containerBeta.PrivateClusterConfig) []map[string]interface{} { + if c == nil { + return nil + } + return []map[string]interface{}{ + { + "enable_private_endpoint": c.EnablePrivateEndpoint, + "enable_private_nodes": c.EnablePrivateNodes, + "master_ipv4_cidr_block": c.MasterIpv4CidrBlock, + "private_endpoint": c.PrivateEndpoint, + "public_endpoint": c.PublicEndpoint, + }, + } +} + func flattenIPAllocationPolicy(c *containerBeta.IPAllocationPolicy) []map[string]interface{} { if c == nil { return nil diff --git a/google/resource_container_cluster_test.go b/google/resource_container_cluster_test.go index 8b7a2c76..283dd967 100644 --- a/google/resource_container_cluster_test.go +++ b/google/resource_container_cluster_test.go @@ -512,6 +512,29 @@ func TestAccContainerCluster_withPrivateCluster(t *testing.T) { }) } +func TestAccContainerCluster_withPrivateClusterConfig(t *testing.T) { + t.Parallel() + + clusterName := fmt.Sprintf("cluster-test-%s", acctest.RandString(10)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckContainerClusterDestroy, + Steps: []resource.TestStep{ + { + Config: testAccContainerCluster_withPrivateClusterConfig(clusterName), + }, + { + ResourceName: "google_container_cluster.with_private_cluster", + ImportStateIdPrefix: "us-central1-a/", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func TestAccContainerCluster_withLegacyAbac(t *testing.T) { t.Parallel() @@ -2478,6 +2501,52 @@ resource "google_container_cluster" "with_private_cluster" { }`, clusterName, clusterName) } +func testAccContainerCluster_withPrivateClusterConfig(clusterName string) string { + return fmt.Sprintf(` +resource "google_compute_network" "container_network" { + name = "container-net-%s" + auto_create_subnetworks = false +} + +resource "google_compute_subnetwork" "container_subnetwork" { + name = "${google_compute_network.container_network.name}" + network = "${google_compute_network.container_network.name}" + ip_cidr_range = "10.0.36.0/24" + region = "us-central1" + private_ip_google_access = true + + secondary_ip_range { + range_name = "pod" + ip_cidr_range = "10.0.0.0/19" + } + + secondary_ip_range { + range_name = "svc" + ip_cidr_range = "10.0.32.0/22" + } +} + +resource "google_container_cluster" "with_private_cluster" { + name = "cluster-test-%s" + zone = "us-central1-a" + initial_node_count = 1 + + network = "${google_compute_network.container_network.name}" + subnetwork = "${google_compute_subnetwork.container_subnetwork.name}" + + private_cluster_config { + enable_private_endpoint = true + enable_private_nodes = true + master_ipv4_cidr_block = "10.42.0.0/28" + } + master_authorized_networks_config { cidr_blocks = [] } + ip_allocation_policy { + cluster_secondary_range_name = "${google_compute_subnetwork.container_subnetwork.secondary_ip_range.0.range_name}" + services_secondary_range_name = "${google_compute_subnetwork.container_subnetwork.secondary_ip_range.1.range_name}" + } +}`, clusterName, clusterName) +} + func testAccContainerCluster_sharedVpc(org, billingId, projectName, name string) string { return fmt.Sprintf(` resource "google_project" "host_project" {