diff --git a/metakube/resource_cluster.go b/metakube/resource_cluster.go index f9459de..44de543 100644 --- a/metakube/resource_cluster.go +++ b/metakube/resource_cluster.go @@ -324,18 +324,12 @@ func metakubeResourceClusterRead(ctx context.Context, d *schema.ResourceData, m _ = d.Set("dc_name", r.Payload.Spec.Cloud.DatacenterName) _ = d.Set("name", r.Payload.Name) if len(r.Payload.Labels) > 0 { - resourceProject, err := getProject(k, projectID) - if err != nil { - return diag.FromErr(err) - } - if labels := mapExclude(r.Payload.Labels, resourceProject.Labels); len(labels) > 0 { - if err := d.Set("labels", labels); err != nil { - return diag.Diagnostics{{ - Severity: diag.Error, - Summary: "Invalid value", - AttributePath: cty.Path{cty.GetAttrStep{Name: "labels"}}, - }} - } + if err := d.Set("labels", r.Payload.Labels); err != nil { + return diag.Diagnostics{{ + Severity: diag.Error, + Summary: "Invalid value", + AttributePath: cty.Path{cty.GetAttrStep{Name: "labels"}}, + }} } } @@ -638,20 +632,29 @@ func metakubeResourceClusterSendPatchReq(ctx context.Context, d *schema.Resource "spec": clusterSpec, }) + var patchedCluster *models.Cluster err := retry.RetryContext(ctx, d.Timeout(schema.TimeoutUpdate), func() *retry.RetryError { - _, err := k.client.Project.PatchClusterV2(p, k.auth) + patchResult, err := k.client.Project.PatchClusterV2(p, k.auth) if err != nil { if e, ok := err.(*project.PatchClusterV2Default); ok && e.Code() == http.StatusConflict { return retry.RetryableError(fmt.Errorf("cluster patch conflict: %v", err)) } return retry.NonRetryableError(fmt.Errorf("patch cluster '%s': %v", d.Id(), stringifyResponseError(err))) } + patchedCluster = patchResult.GetPayload() return nil }) if err != nil { return err } + if patchedCluster.Labels == nil { + // if the cluster has no labels after patching, set them to nil in the state data explicitly + // otherwise, if the cluster had labels before that were all removed by the patch, remnants + // (empty labels) would remain in the data, showing up as a permanent difference on subsequent runs + _ = d.Set("labels", nil) + } + return nil }