From 31fadcf33525025d55dd47aea993513e2e82b2cc Mon Sep 17 00:00:00 2001 From: The Magician Date: Tue, 1 Aug 2023 15:25:51 -0700 Subject: [PATCH] Add support for policy_name field in Placement Policy (#8475) (#15367) Signed-off-by: Modular Magician --- .changelog/8475.txt | 3 + google/resource_container_cluster_test.go | 60 ++++++++++++++++++ google/resource_container_node_pool_test.go | 62 +++++++++++++++++++ .../container/resource_container_node_pool.go | 12 +++- .../docs/r/container_node_pool.html.markdown | 4 ++ 5 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 .changelog/8475.txt diff --git a/.changelog/8475.txt b/.changelog/8475.txt new file mode 100644 index 00000000000..43877e06f21 --- /dev/null +++ b/.changelog/8475.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +container: added `placement_policy.policy_name` field to `google_container_node_pool` resource +``` diff --git a/google/resource_container_cluster_test.go b/google/resource_container_cluster_test.go index c898ec06d48..fd9b5d382f2 100644 --- a/google/resource_container_cluster_test.go +++ b/google/resource_container_cluster_test.go @@ -6653,3 +6653,63 @@ resource "google_container_cluster" "primary" { min_master_version = 1.27 }`, name, enabled) } + +func TestAccContainerCluster_customPlacementPolicy(t *testing.T) { + t.Parallel() + + cluster := fmt.Sprintf("tf-test-cluster-%s", acctest.RandString(t, 10)) + np := fmt.Sprintf("tf-test-nodepool-%s", acctest.RandString(t, 10)) + policy := fmt.Sprintf("tf-test-policy-%s", acctest.RandString(t, 10)) + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckContainerNodePoolDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccContainerCluster_customPlacementPolicy(cluster, np, policy), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("google_container_cluster.cluster", "node_pool.0.placement_policy.0.type", "COMPACT"), + resource.TestCheckResourceAttr("google_container_cluster.cluster", "node_pool.0.placement_policy.0.policy_name", policy), + resource.TestCheckResourceAttr("google_container_cluster.cluster", "node_pool.0.node_config.0.machine_type", "c2-standard-4"), + ), + }, + { + ResourceName: "google_container_cluster.cluster", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccContainerCluster_customPlacementPolicy(cluster, np, policyName string) string { + return fmt.Sprintf(` + +resource "google_compute_resource_policy" "policy" { + name = "%s" + region = "us-central1" + group_placement_policy { + collocation = "COLLOCATED" + } +} + +resource "google_container_cluster" "cluster" { + name = "%s" + location = "us-central1-a" + + node_pool { + name = "%s" + initial_node_count = 2 + + node_config { + machine_type = "c2-standard-4" + } + + placement_policy { + type = "COMPACT" + policy_name = google_compute_resource_policy.policy.name + } + } +}`, policyName, cluster, np) +} diff --git a/google/resource_container_node_pool_test.go b/google/resource_container_node_pool_test.go index cfbf574b507..4e25bc62181 100644 --- a/google/resource_container_node_pool_test.go +++ b/google/resource_container_node_pool_test.go @@ -1392,6 +1392,68 @@ resource "google_container_node_pool" "np" { `, cluster, np, placementType) } +func TestAccContainerNodePool_customPlacementPolicy(t *testing.T) { + t.Parallel() + + cluster := fmt.Sprintf("tf-test-cluster-%s", acctest.RandString(t, 10)) + np := fmt.Sprintf("tf-test-nodepool-%s", acctest.RandString(t, 10)) + policy := fmt.Sprintf("tf-test-policy-%s", acctest.RandString(t, 10)) + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckContainerNodePoolDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccContainerNodePool_customPlacementPolicy(cluster, np, policy), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("google_container_node_pool.np", "node_config.0.machine_type", "c2-standard-4"), + resource.TestCheckResourceAttr("google_container_node_pool.np", "placement_policy.0.policy_name", policy), + resource.TestCheckResourceAttr("google_container_node_pool.np", "placement_policy.0.type", "COMPACT"), + ), + }, + { + ResourceName: "google_container_node_pool.np", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccContainerNodePool_customPlacementPolicy(cluster, np, policyName string) string { + return fmt.Sprintf(` +resource "google_container_cluster" "cluster" { + name = "%s" + location = "us-central1-a" + initial_node_count = 1 +} + +resource "google_compute_resource_policy" "policy" { + name = "%s" + region = "us-central1" + group_placement_policy { + collocation = "COLLOCATED" + } +} + +resource "google_container_node_pool" "np" { + name = "%s" + location = "us-central1-a" + cluster = google_container_cluster.cluster.name + initial_node_count = 2 + + node_config { + machine_type = "c2-standard-4" + } + placement_policy { + type = "COMPACT" + policy_name = google_compute_resource_policy.policy.name + } +} +`, cluster, policyName, np) +} + func TestAccContainerNodePool_threadsPerCore(t *testing.T) { t.Parallel() diff --git a/google/services/container/resource_container_node_pool.go b/google/services/container/resource_container_node_pool.go index 95756bdc50d..318b0265cf0 100644 --- a/google/services/container/resource_container_node_pool.go +++ b/google/services/container/resource_container_node_pool.go @@ -188,6 +188,12 @@ var schemaNodePool = map[string]*schema.Schema{ Required: true, Description: `Type defines the type of placement policy`, }, + "policy_name": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Description: `If set, refers to the name of a custom resource policy supplied by the user. The resource policy must be in the same project and region as the node pool. If not found, InvalidArgument error is returned.`, + }, }, }, }, @@ -872,7 +878,8 @@ func expandNodePool(d *schema.ResourceData, prefix string) (*container.NodePool, if v.([]interface{}) != nil && v.([]interface{})[0] != nil { placement_policy := v.([]interface{})[0].(map[string]interface{}) np.PlacementPolicy = &container.PlacementPolicy{ - Type: placement_policy["type"].(string), + Type: placement_policy["type"].(string), + PolicyName: placement_policy["policy_name"].(string), } } } @@ -1063,7 +1070,8 @@ func flattenNodePool(d *schema.ResourceData, config *transport_tpg.Config, np *c if np.PlacementPolicy != nil { nodePool["placement_policy"] = []map[string]interface{}{ { - "type": np.PlacementPolicy.Type, + "type": np.PlacementPolicy.Type, + "policy_name": np.PlacementPolicy.PolicyName, }, } } diff --git a/website/docs/r/container_node_pool.html.markdown b/website/docs/r/container_node_pool.html.markdown index 8f7d7524650..4a8f19b26cd 100644 --- a/website/docs/r/container_node_pool.html.markdown +++ b/website/docs/r/container_node_pool.html.markdown @@ -262,6 +262,10 @@ cluster. Specifying COMPACT placement policy type places node pool's nodes in a closer physical proximity in order to reduce network latency between nodes. +* `policy_name` - (Optional) If set, refers to the name of a custom resource policy supplied by the user. + The resource policy must be in the same project and region as the node pool. + If not found, InvalidArgument error is returned. + * `tpu_topology` - (Optional, Beta) The [TPU placement topology](https://cloud.google.com/tpu/docs/types-topologies#tpu_topologies) for pod slice node pool. ## Attributes Reference