diff --git a/.changelog/1458.txt b/.changelog/1458.txt new file mode 100644 index 000000000..dcb438244 --- /dev/null +++ b/.changelog/1458.txt @@ -0,0 +1,3 @@ +```release-note:bug +`resource/helm_release`: Fix: only recompute metadata when the version in the metadata changes +``` diff --git a/helm/resource_release.go b/helm/resource_release.go index 8b0299be7..7aafd64f1 100644 --- a/helm/resource_release.go +++ b/helm/resource_release.go @@ -930,18 +930,16 @@ func resourceDiff(ctx context.Context, d *schema.ResourceDiff, meta interface{}) } if d.HasChanges(recomputeMetadataFields...) { d.SetNewComputed("metadata") - } - - if !useChartVersion(d.Get("chart").(string), d.Get("repository").(string)) { - if d.HasChange("version") { + } else if !useChartVersion(d.Get("chart").(string), d.Get("repository").(string)) { + if d.HasChange("metadata.0.version") { // only recompute metadata if the version actually changes // chart versioning is not consistent and some will add // a `v` prefix to the chart version after installation - old, new := d.GetChange("version") + old, new := d.GetChange("metadata.0.version") oldVersion := strings.TrimPrefix(old.(string), "v") newVersion := strings.TrimPrefix(new.(string), "v") debug("%s oldVersion: %s, newVersion: %s", logID, oldVersion, newVersion) - if oldVersion != newVersion && newVersion != "" { + if oldVersion != newVersion { d.SetNewComputed("metadata") } } diff --git a/helm/resource_release_test.go b/helm/resource_release_test.go index 01a2c52d6..4187f3de0 100644 --- a/helm/resource_release_test.go +++ b/helm/resource_release_test.go @@ -111,6 +111,48 @@ func TestAccResourceRelease_emptyVersion(t *testing.T) { }) } +// NOTE this is a regression test for: https://github.com/hashicorp/terraform-provider-helm/issues/1344 +func TestAccResourceRelease_inexactVersion(t *testing.T) { + name := randName("basic") + namespace := createRandomNamespace(t) + defer deleteNamespace(t, namespace) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProviderFactories: map[string]func() (*schema.Provider, error){ + "helm": func() (*schema.Provider, error) { + return Provider(), nil + }, + }, + CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + Steps: []resource.TestStep{ + { + Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "v1.2"), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("helm_release.test", "version", "1.2.3"), + resource.TestCheckResourceAttr("helm_release.test", "metadata.0.version", "1.2.3"), + ), + }, + { + Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "1.2"), + PlanOnly: true, + }, + { + Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "v1.2.x"), + PlanOnly: true, + }, + { + Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "1.2.x"), + PlanOnly: true, + }, + { + Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "~1.2.2"), + PlanOnly: true, + }, + }, + }) +} + // "upgrade_install" without a previously installed release (effectively equivalent to TestAccResourceRelease_basic) func TestAccResourceRelease_upgrade_with_install_coldstart(t *testing.T) { name := randName("basic")