diff --git a/kubernetes/resource_kubernetes_persistent_volume.go b/kubernetes/resource_kubernetes_persistent_volume.go index 834d35b38d..1b2b95765e 100644 --- a/kubernetes/resource_kubernetes_persistent_volume.go +++ b/kubernetes/resource_kubernetes_persistent_volume.go @@ -5,6 +5,7 @@ import ( "log" "time" + gversion "github.com/hashicorp/go-version" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "k8s.io/apimachinery/pkg/api/errors" @@ -25,6 +26,44 @@ func resourceKubernetesPersistentVolume() *schema.Resource { State: schema.ImportStatePassthrough, }, + CustomizeDiff: func(diff *schema.ResourceDiff, meta interface{}) error { + if diff.Id() == "" { + // We only care about updates, not creation + return nil + } + + // Mutation of PersistentVolumeSource after creation is no longer allowed in 1.9+ + // See https://github.com/kubernetes/kubernetes/blob/v1.9.3/CHANGELOG-1.9.md#storage-3 + conn := meta.(*kubernetes.Clientset) + serverVersion, err := conn.ServerVersion() + if err != nil { + return err + } + + k8sVersion, err := gversion.NewVersion(serverVersion.String()) + if err != nil { + return err + } + + v1_9_0, _ := gversion.NewVersion("1.9.0") + if k8sVersion.Equal(v1_9_0) || k8sVersion.GreaterThan(v1_9_0) { + if diff.HasChange("spec.0.persistent_volume_source") { + keys := diff.GetChangedKeysPrefix("spec.0.persistent_volume_source") + for _, key := range keys { + if diff.HasChange(key) { + err := diff.ForceNew(key) + if err != nil { + return err + } + } + } + return nil + } + } + + return nil + }, + Schema: map[string]*schema.Schema{ "metadata": metadataSchema("persistent volume", false), "spec": { diff --git a/kubernetes/resource_kubernetes_persistent_volume_test.go b/kubernetes/resource_kubernetes_persistent_volume_test.go index 661f6d5c95..6624072b99 100644 --- a/kubernetes/resource_kubernetes_persistent_volume_test.go +++ b/kubernetes/resource_kubernetes_persistent_volume_test.go @@ -216,7 +216,6 @@ func TestAccKubernetesPersistentVolume_googleCloud_volumeSource(t *testing.T) { name := fmt.Sprintf("tf-acc-test-%s", randString) diskName := fmt.Sprintf("tf-acc-test-disk-%s", randString) - region := os.Getenv("GOOGLE_REGION") zone := os.Getenv("GOOGLE_ZONE") resource.Test(t, resource.TestCase{ @@ -232,10 +231,7 @@ func TestAccKubernetesPersistentVolume_googleCloud_volumeSource(t *testing.T) { resource.TestCheckResourceAttr("kubernetes_persistent_volume.test", "metadata.0.annotations.%", "0"), testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{}), resource.TestCheckResourceAttr("kubernetes_persistent_volume.test", "metadata.0.labels.%", "0"), - testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{ - "failure-domain.beta.kubernetes.io/region": region, - "failure-domain.beta.kubernetes.io/zone": zone, - }), + testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{}), resource.TestCheckResourceAttr("kubernetes_persistent_volume.test", "metadata.0.name", name), resource.TestCheckResourceAttrSet("kubernetes_persistent_volume.test", "metadata.0.generation"), resource.TestCheckResourceAttrSet("kubernetes_persistent_volume.test", "metadata.0.resource_version"), @@ -256,10 +252,7 @@ func TestAccKubernetesPersistentVolume_googleCloud_volumeSource(t *testing.T) { resource.TestCheckResourceAttr("kubernetes_persistent_volume.test", "metadata.0.annotations.%", "0"), testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{}), resource.TestCheckResourceAttr("kubernetes_persistent_volume.test", "metadata.0.labels.%", "0"), - testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{ - "failure-domain.beta.kubernetes.io/region": region, - "failure-domain.beta.kubernetes.io/zone": zone, - }), + testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{}), resource.TestCheckResourceAttr("kubernetes_persistent_volume.test", "metadata.0.name", name), resource.TestCheckResourceAttrSet("kubernetes_persistent_volume.test", "metadata.0.generation"), resource.TestCheckResourceAttrSet("kubernetes_persistent_volume.test", "metadata.0.resource_version"),