diff --git a/.changelog/6941.txt b/.changelog/6941.txt new file mode 100644 index 00000000000..93ba954f9e4 --- /dev/null +++ b/.changelog/6941.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +container: supported in-place update for `labels` in `google_container_node_pool` +``` diff --git a/google/node_config.go b/google/node_config.go index e31eb06eb09..0d880ee4720 100644 --- a/google/node_config.go +++ b/google/node_config.go @@ -144,7 +144,6 @@ func schemaNodeConfig() *schema.Schema { Optional: true, // Computed=true because GKE Sandbox will automatically add labels to nodes that can/cannot run sandboxed pods. Computed: true, - ForceNew: true, Elem: &schema.Schema{Type: schema.TypeString}, Description: `The map of Kubernetes labels (key/value pairs) to be applied to each node. These will added in addition to any default label(s) that Kubernetes may apply to the node.`, }, diff --git a/google/resource_container_cluster.go b/google/resource_container_cluster.go index 599377287f2..7f51bbd8bd8 100644 --- a/google/resource_container_cluster.go +++ b/google/resource_container_cluster.go @@ -80,6 +80,7 @@ var ( } forceNewClusterNodeConfigFields = []string{ + "labels", "workload_metadata_config", } diff --git a/google/resource_container_node_pool.go b/google/resource_container_node_pool.go index 35f085c363b..777e4b0e35c 100644 --- a/google/resource_container_node_pool.go +++ b/google/resource_container_node_pool.go @@ -1269,6 +1269,44 @@ func nodePoolUpdate(d *schema.ResourceData, meta interface{}, nodePoolInfo *Node log.Printf("[INFO] Updated resource labels for node pool %s", name) } + if d.HasChange(prefix + "node_config.0.labels") { + req := &container.UpdateNodePoolRequest{ + Name: name, + } + + if v, ok := d.GetOk(prefix + "node_config.0.labels"); ok { + labels := v.(map[string]interface{}) + req.Labels = &container.NodeLabels{ + Labels: convertStringMap(labels), + } + } + + updateF := func() error { + clusterNodePoolsUpdateCall := config.NewContainerClient(userAgent).Projects.Locations.Clusters.NodePools.Update(nodePoolInfo.fullyQualifiedName(name), req) + if config.UserProjectOverride { + clusterNodePoolsUpdateCall.Header().Add("X-Goog-User-Project", nodePoolInfo.project) + } + op, err := clusterNodePoolsUpdateCall.Do() + if err != nil { + return err + } + + // Wait until it's updated + return containerOperationWait(config, op, + nodePoolInfo.project, + nodePoolInfo.location, + "updating GKE node pool labels", userAgent, + timeout) + } + + // Call update serially. + if err := retryWhileIncompatibleOperation(timeout, npLockKey, updateF); err != nil { + return err + } + + log.Printf("[INFO] Updated labels for node pool %s", name) + } + if d.HasChange(prefix + "node_config.0.image_type") { req := &container.UpdateClusterRequest{ Update: &container.ClusterUpdate{ diff --git a/google/resource_container_node_pool_test.go b/google/resource_container_node_pool_test.go index 74d3f179bcf..2e8fc1cf315 100644 --- a/google/resource_container_node_pool_test.go +++ b/google/resource_container_node_pool_test.go @@ -1606,12 +1606,6 @@ resource "google_container_node_pool" "np_with_node_config" { ] preemptible = true min_cpu_platform = "Intel Broadwell" - - tags = ["ga"] - - resource_labels = { - "key1" = "value" - } taint { key = "taint_key" @@ -1627,6 +1621,16 @@ resource "google_container_node_pool" "np_with_node_config" { // Updatable fields image_type = "COS_CONTAINERD" + + tags = ["foo"] + + labels = { + "test.terraform.io/key1" = "foo" + } + + resource_labels = { + "key1" = "foo" + } } } `, cluster, nodePool) @@ -1657,13 +1661,6 @@ resource "google_container_node_pool" "np_with_node_config" { preemptible = true min_cpu_platform = "Intel Broadwell" - tags = ["beta"] - - resource_labels = { - "key1" = "value1" - "key2" = "value2" - } - taint { key = "taint_key" value = "taint_value" @@ -1678,6 +1675,18 @@ resource "google_container_node_pool" "np_with_node_config" { // Updatable fields image_type = "UBUNTU_CONTAINERD" + + tags = ["bar", "foobar"] + + labels = { + "test.terraform.io/key1" = "bar" + "test.terraform.io/key2" = "foo" + } + + resource_labels = { + "key1" = "bar" + "key2" = "foo" + } } } `, cluster, nodePool)