github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/kubernetes/resource_kubernetes_persistent_volume_claim_test.go (about)

     1  package kubernetes
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/hashicorp/terraform/helper/acctest"
     9  	"github.com/hashicorp/terraform/helper/resource"
    10  	"github.com/hashicorp/terraform/terraform"
    11  	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	api "k8s.io/kubernetes/pkg/api/v1"
    13  	kubernetes "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
    14  )
    15  
    16  func TestAccKubernetesPersistentVolumeClaim_basic(t *testing.T) {
    17  	var conf api.PersistentVolumeClaim
    18  	name := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
    19  
    20  	resource.Test(t, resource.TestCase{
    21  		PreCheck:      func() { testAccPreCheck(t) },
    22  		IDRefreshName: "kubernetes_persistent_volume_claim.test",
    23  		Providers:     testAccProviders,
    24  		CheckDestroy:  testAccCheckKubernetesPersistentVolumeClaimDestroy,
    25  		Steps: []resource.TestStep{
    26  			{
    27  				Config: testAccKubernetesPersistentVolumeClaimConfig_basic(name),
    28  				Check: resource.ComposeAggregateTestCheckFunc(
    29  					testAccCheckKubernetesPersistentVolumeClaimExists("kubernetes_persistent_volume_claim.test", &conf),
    30  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.%", "1"),
    31  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.TestAnnotationOne", "one"),
    32  					testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{
    33  						"TestAnnotationOne":                             "one",
    34  						"volume.beta.kubernetes.io/storage-provisioner": "kubernetes.io/gce-pd",
    35  					}),
    36  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.%", "3"),
    37  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.TestLabelOne", "one"),
    38  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.TestLabelThree", "three"),
    39  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.TestLabelFour", "four"),
    40  					testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{"TestLabelOne": "one", "TestLabelThree": "three", "TestLabelFour": "four"}),
    41  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.name", name),
    42  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.generation"),
    43  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.resource_version"),
    44  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.self_link"),
    45  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.uid"),
    46  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.#", "1"),
    47  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.1254135962", "ReadWriteMany"),
    48  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.#", "1"),
    49  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.%", "1"),
    50  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.storage", "5Gi"),
    51  				),
    52  			},
    53  			{
    54  				Config: testAccKubernetesPersistentVolumeClaimConfig_metaModified(name),
    55  				Check: resource.ComposeAggregateTestCheckFunc(
    56  					testAccCheckKubernetesPersistentVolumeClaimExists("kubernetes_persistent_volume_claim.test", &conf),
    57  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.%", "2"),
    58  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.TestAnnotationOne", "one"),
    59  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.TestAnnotationTwo", "two"),
    60  					testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{
    61  						"TestAnnotationOne":                             "one",
    62  						"TestAnnotationTwo":                             "two",
    63  						"volume.beta.kubernetes.io/storage-provisioner": "kubernetes.io/gce-pd",
    64  					}),
    65  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.%", "3"),
    66  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.TestLabelOne", "one"),
    67  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.TestLabelTwo", "two"),
    68  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.TestLabelThree", "three"),
    69  					testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{"TestLabelOne": "one", "TestLabelTwo": "two", "TestLabelThree": "three"}),
    70  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.name", name),
    71  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.generation"),
    72  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.resource_version"),
    73  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.self_link"),
    74  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.uid"),
    75  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.#", "1"),
    76  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.1254135962", "ReadWriteMany"),
    77  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.#", "1"),
    78  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.%", "1"),
    79  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.storage", "5Gi"),
    80  				),
    81  			},
    82  		},
    83  	})
    84  }
    85  
    86  func TestAccKubernetesPersistentVolumeClaim_importBasic(t *testing.T) {
    87  	resourceName := "kubernetes_persistent_volume_claim.test"
    88  	volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
    89  	claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
    90  	diskName := fmt.Sprintf("tf-acc-test-disk-%s", acctest.RandString(10))
    91  	zone := os.Getenv("GOOGLE_ZONE")
    92  
    93  	resource.Test(t, resource.TestCase{
    94  		PreCheck:     func() { testAccPreCheck(t) },
    95  		Providers:    testAccProviders,
    96  		CheckDestroy: testAccCheckKubernetesPersistentVolumeClaimDestroy,
    97  		Steps: []resource.TestStep{
    98  			{
    99  				Config: testAccKubernetesPersistentVolumeClaimConfig_import(volumeName, claimName, diskName, zone),
   100  			},
   101  			{
   102  				ResourceName:      resourceName,
   103  				ImportState:       true,
   104  				ImportStateVerify: true,
   105  			},
   106  		},
   107  	})
   108  }
   109  
   110  func TestAccKubernetesPersistentVolumeClaim_volumeMatch(t *testing.T) {
   111  	var pvcConf api.PersistentVolumeClaim
   112  	var pvConf api.PersistentVolume
   113  
   114  	claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   115  	volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   116  	volumeNameModified := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   117  	diskName := fmt.Sprintf("tf-acc-test-disk-%s", acctest.RandString(10))
   118  	zone := os.Getenv("GOOGLE_ZONE")
   119  
   120  	resource.Test(t, resource.TestCase{
   121  		PreCheck:      func() { testAccPreCheck(t) },
   122  		IDRefreshName: "kubernetes_persistent_volume_claim.test",
   123  		Providers:     testAccProviders,
   124  		CheckDestroy:  testAccCheckKubernetesPersistentVolumeClaimDestroy,
   125  		Steps: []resource.TestStep{
   126  			{
   127  				Config: testAccKubernetesPersistentVolumeClaimConfig_volumeMatch(volumeName, claimName, diskName, zone),
   128  				Check: resource.ComposeAggregateTestCheckFunc(
   129  					testAccCheckKubernetesPersistentVolumeClaimExists("kubernetes_persistent_volume_claim.test", &pvcConf),
   130  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.%", "0"),
   131  					testAccCheckMetaAnnotations(&pvcConf.ObjectMeta, map[string]string{"pv.kubernetes.io/bind-completed": "yes"}),
   132  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.%", "0"),
   133  					testAccCheckMetaLabels(&pvcConf.ObjectMeta, map[string]string{}),
   134  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.name", claimName),
   135  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.generation"),
   136  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.resource_version"),
   137  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.self_link"),
   138  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.uid"),
   139  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.#", "1"),
   140  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.1254135962", "ReadWriteMany"),
   141  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.#", "1"),
   142  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.%", "1"),
   143  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.storage", "5Gi"),
   144  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.volume_name", volumeName),
   145  					testAccCheckKubernetesPersistentVolumeExists("kubernetes_persistent_volume.test", &pvConf),
   146  					testAccCheckMetaAnnotations(&pvConf.ObjectMeta, map[string]string{"pv.kubernetes.io/bound-by-controller": "yes"}),
   147  				),
   148  			},
   149  			{
   150  				Config: testAccKubernetesPersistentVolumeClaimConfig_volumeMatch_modified(volumeNameModified, claimName, diskName, zone),
   151  				Check: resource.ComposeAggregateTestCheckFunc(
   152  					testAccCheckKubernetesPersistentVolumeClaimExists("kubernetes_persistent_volume_claim.test", &pvcConf),
   153  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.%", "0"),
   154  					testAccCheckMetaAnnotations(&pvcConf.ObjectMeta, map[string]string{"pv.kubernetes.io/bind-completed": "yes"}),
   155  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.%", "0"),
   156  					testAccCheckMetaLabels(&pvcConf.ObjectMeta, map[string]string{}),
   157  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.name", claimName),
   158  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.generation"),
   159  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.resource_version"),
   160  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.self_link"),
   161  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.uid"),
   162  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.#", "1"),
   163  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.1254135962", "ReadWriteMany"),
   164  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.#", "1"),
   165  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.%", "1"),
   166  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.storage", "5Gi"),
   167  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.volume_name", volumeNameModified),
   168  					testAccCheckKubernetesPersistentVolumeExists("kubernetes_persistent_volume.test2", &pvConf),
   169  					testAccCheckMetaAnnotations(&pvConf.ObjectMeta, map[string]string{"pv.kubernetes.io/bound-by-controller": "yes"}),
   170  				),
   171  			},
   172  		},
   173  	})
   174  }
   175  
   176  // Label matching isn't supported on GCE
   177  // TODO: Re-enable when we build test env for K8S that supports it
   178  
   179  // func TestAccKubernetesPersistentVolumeClaim_labelsMatch(t *testing.T) {
   180  // 	var conf api.PersistentVolumeClaim
   181  // 	claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   182  // 	volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   183  
   184  // 	resource.Test(t, resource.TestCase{
   185  // 		PreCheck:      func() { testAccPreCheck(t) },
   186  // 		IDRefreshName: "kubernetes_persistent_volume_claim.test",
   187  // 		Providers:     testAccProviders,
   188  // 		CheckDestroy:  testAccCheckKubernetesPersistentVolumeClaimDestroy,
   189  // 		Steps: []resource.TestStep{
   190  // 			{
   191  // 				Config: testAccKubernetesPersistentVolumeClaimConfig_labelsMatch(volumeName, claimName),
   192  // 				Check: resource.ComposeAggregateTestCheckFunc(
   193  // 					testAccCheckKubernetesPersistentVolumeClaimExists("kubernetes_persistent_volume_claim.test", &conf),
   194  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.%", "0"),
   195  // 					testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{"pv.kubernetes.io/bind-completed": "yes", "pv.kubernetes.io/bound-by-controller": "yes"}),
   196  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.%", "0"),
   197  // 					testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{}),
   198  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.name", claimName),
   199  // 					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.generation"),
   200  // 					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.resource_version"),
   201  // 					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.self_link"),
   202  // 					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.uid"),
   203  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.#", "1"),
   204  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.1254135962", "ReadWriteMany"),
   205  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.#", "1"),
   206  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.%", "1"),
   207  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.storage", "5Gi"),
   208  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.#", "1"),
   209  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_labels.%", "1"),
   210  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_labels.TfAccTestEnvironment", "blablah"),
   211  // 				),
   212  // 			},
   213  // 		},
   214  // 	})
   215  // }
   216  
   217  // func TestAccKubernetesPersistentVolumeClaim_labelsMatchExpression(t *testing.T) {
   218  // 	var conf api.PersistentVolumeClaim
   219  // 	claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   220  // 	volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   221  
   222  // 	resource.Test(t, resource.TestCase{
   223  // 		PreCheck:      func() { testAccPreCheck(t) },
   224  // 		IDRefreshName: "kubernetes_persistent_volume_claim.test",
   225  // 		Providers:     testAccProviders,
   226  // 		CheckDestroy:  testAccCheckKubernetesPersistentVolumeClaimDestroy,
   227  // 		Steps: []resource.TestStep{
   228  // 			{
   229  // 				Config: testAccKubernetesPersistentVolumeClaimConfig_labelsMatchExpression(volumeName, claimName),
   230  // 				Check: resource.ComposeAggregateTestCheckFunc(
   231  // 					testAccCheckKubernetesPersistentVolumeClaimExists("kubernetes_persistent_volume_claim.test", &conf),
   232  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.%", "0"),
   233  // 					testAccCheckMetaAnnotations(&conf.ObjectMeta, map[string]string{"pv.kubernetes.io/bind-completed": "yes", "pv.kubernetes.io/bound-by-controller": "yes"}),
   234  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.%", "0"),
   235  // 					testAccCheckMetaLabels(&conf.ObjectMeta, map[string]string{}),
   236  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.name", claimName),
   237  // 					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.generation"),
   238  // 					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.resource_version"),
   239  // 					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.self_link"),
   240  // 					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.uid"),
   241  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.#", "1"),
   242  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.1254135962", "ReadWriteMany"),
   243  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.#", "1"),
   244  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.%", "1"),
   245  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.storage", "5Gi"),
   246  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.#", "1"),
   247  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_expressions.#", "1"),
   248  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_expressions.0.key", "TfAccTestEnvironment"),
   249  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_expressions.0.operator", "In"),
   250  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_expressions.0.values.#", "3"),
   251  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_expressions.0.values.1187371253", "three"),
   252  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_expressions.0.values.2053932785", "one"),
   253  // 					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.selector.0.match_expressions.0.values.298486374", "two"),
   254  // 				),
   255  // 			},
   256  // 		},
   257  // 	})
   258  // }
   259  
   260  func TestAccKubernetesPersistentVolumeClaim_volumeUpdate(t *testing.T) {
   261  	var pvcConf api.PersistentVolumeClaim
   262  	var pvConf api.PersistentVolume
   263  
   264  	claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   265  	volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
   266  	diskName := fmt.Sprintf("tf-acc-test-disk-%s", acctest.RandString(10))
   267  	zone := os.Getenv("GOOGLE_ZONE")
   268  
   269  	resource.Test(t, resource.TestCase{
   270  		PreCheck:      func() { testAccPreCheck(t) },
   271  		IDRefreshName: "kubernetes_persistent_volume_claim.test",
   272  		Providers:     testAccProviders,
   273  		CheckDestroy:  testAccCheckKubernetesPersistentVolumeClaimDestroy,
   274  		Steps: []resource.TestStep{
   275  			{
   276  				Config: testAccKubernetesPersistentVolumeClaimConfig_volumeUpdate(volumeName, claimName, "5Gi", diskName, zone),
   277  				Check: resource.ComposeAggregateTestCheckFunc(
   278  					testAccCheckKubernetesPersistentVolumeClaimExists("kubernetes_persistent_volume_claim.test", &pvcConf),
   279  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.%", "0"),
   280  					testAccCheckMetaAnnotations(&pvcConf.ObjectMeta, map[string]string{"pv.kubernetes.io/bind-completed": "yes"}),
   281  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.%", "0"),
   282  					testAccCheckMetaLabels(&pvcConf.ObjectMeta, map[string]string{}),
   283  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.name", claimName),
   284  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.generation"),
   285  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.resource_version"),
   286  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.self_link"),
   287  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.uid"),
   288  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.#", "1"),
   289  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.1254135962", "ReadWriteMany"),
   290  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.#", "1"),
   291  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.%", "1"),
   292  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.storage", "5Gi"),
   293  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.volume_name", volumeName),
   294  					testAccCheckKubernetesPersistentVolumeExists("kubernetes_persistent_volume.test", &pvConf),
   295  					testAccCheckMetaAnnotations(&pvConf.ObjectMeta, map[string]string{"pv.kubernetes.io/bound-by-controller": "yes"}),
   296  					testAccCheckClaimRef(&pvConf, &ObjectRefStatic{Namespace: "default", Name: claimName}),
   297  				),
   298  			},
   299  			{
   300  				Config: testAccKubernetesPersistentVolumeClaimConfig_volumeUpdate(volumeName, claimName, "10Gi", diskName, zone),
   301  				Check: resource.ComposeAggregateTestCheckFunc(
   302  					testAccCheckKubernetesPersistentVolumeClaimExists("kubernetes_persistent_volume_claim.test", &pvcConf),
   303  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.annotations.%", "0"),
   304  					testAccCheckMetaAnnotations(&pvcConf.ObjectMeta, map[string]string{"pv.kubernetes.io/bind-completed": "yes"}),
   305  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.labels.%", "0"),
   306  					testAccCheckMetaLabels(&pvcConf.ObjectMeta, map[string]string{}),
   307  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "metadata.0.name", claimName),
   308  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.generation"),
   309  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.resource_version"),
   310  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.self_link"),
   311  					resource.TestCheckResourceAttrSet("kubernetes_persistent_volume_claim.test", "metadata.0.uid"),
   312  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.#", "1"),
   313  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.access_modes.1254135962", "ReadWriteMany"),
   314  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.#", "1"),
   315  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.%", "1"),
   316  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.resources.0.requests.storage", "5Gi"),
   317  					resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim.test", "spec.0.volume_name", volumeName),
   318  					testAccCheckKubernetesPersistentVolumeExists("kubernetes_persistent_volume.test", &pvConf),
   319  					testAccCheckMetaAnnotations(&pvConf.ObjectMeta, map[string]string{"pv.kubernetes.io/bound-by-controller": "yes"}),
   320  					testAccCheckClaimRef(&pvConf, &ObjectRefStatic{Namespace: "default", Name: claimName}),
   321  				),
   322  			},
   323  		},
   324  	})
   325  }
   326  
   327  func testAccCheckKubernetesPersistentVolumeClaimDestroy(s *terraform.State) error {
   328  	conn := testAccProvider.Meta().(*kubernetes.Clientset)
   329  
   330  	for _, rs := range s.RootModule().Resources {
   331  		if rs.Type != "kubernetes_persistent_volume_claim" {
   332  			continue
   333  		}
   334  		namespace, name := idParts(rs.Primary.ID)
   335  		resp, err := conn.CoreV1().PersistentVolumeClaims(namespace).Get(name, meta_v1.GetOptions{})
   336  		if err == nil {
   337  			if resp.Namespace == namespace && resp.Name == name {
   338  				return fmt.Errorf("Persistent Volume still exists: %s", rs.Primary.ID)
   339  			}
   340  		}
   341  	}
   342  
   343  	return nil
   344  }
   345  
   346  func testAccCheckKubernetesPersistentVolumeClaimExists(n string, obj *api.PersistentVolumeClaim) resource.TestCheckFunc {
   347  	return func(s *terraform.State) error {
   348  		rs, ok := s.RootModule().Resources[n]
   349  		if !ok {
   350  			return fmt.Errorf("Not found: %s", n)
   351  		}
   352  
   353  		conn := testAccProvider.Meta().(*kubernetes.Clientset)
   354  		namespace, name := idParts(rs.Primary.ID)
   355  		out, err := conn.CoreV1().PersistentVolumeClaims(namespace).Get(name, meta_v1.GetOptions{})
   356  		if err != nil {
   357  			return err
   358  		}
   359  
   360  		*obj = *out
   361  		return nil
   362  	}
   363  }
   364  
   365  func testAccCheckClaimRef(pv *api.PersistentVolume, expected *ObjectRefStatic) resource.TestCheckFunc {
   366  	return func(s *terraform.State) error {
   367  		or := pv.Spec.ClaimRef
   368  		if or == nil {
   369  			return fmt.Errorf("Expected ClaimRef to be not-nil, specifically %#v", *expected)
   370  		}
   371  		if or.Namespace != expected.Namespace {
   372  			return fmt.Errorf("Expected object reference %q, given: %q", expected.Namespace, or.Namespace)
   373  		}
   374  		if or.Name != expected.Name {
   375  			return fmt.Errorf("Expected object reference %q, given: %q", expected.Name, or.Name)
   376  		}
   377  		return nil
   378  	}
   379  }
   380  
   381  type ObjectRefStatic struct {
   382  	Namespace string
   383  	Name      string
   384  }
   385  
   386  func testAccKubernetesPersistentVolumeClaimConfig_basic(name string) string {
   387  	return fmt.Sprintf(`
   388  resource "kubernetes_persistent_volume_claim" "test" {
   389  	metadata {
   390  		annotations {
   391  			TestAnnotationOne = "one"
   392  		}
   393  		labels {
   394  			TestLabelOne = "one"
   395  			TestLabelThree = "three"
   396  			TestLabelFour = "four"
   397  		}
   398  		name = "%s"
   399  	}
   400  	spec {
   401  		access_modes = ["ReadWriteMany"]
   402  		resources {
   403  			requests {
   404  				storage = "5Gi"
   405  			}
   406  		}
   407  		selector {
   408  			match_expressions {
   409  				key = "environment"
   410  				operator = "In"
   411  				values = ["non-exists-12345"]
   412  			}
   413  		}
   414  	}
   415  	wait_until_bound = false
   416  }
   417  `, name)
   418  }
   419  
   420  func testAccKubernetesPersistentVolumeClaimConfig_metaModified(name string) string {
   421  	return fmt.Sprintf(`
   422  resource "kubernetes_persistent_volume_claim" "test" {
   423  	metadata {
   424  		annotations {
   425  			TestAnnotationOne = "one"
   426  			TestAnnotationTwo = "two"
   427  		}
   428  		labels {
   429  			TestLabelOne = "one"
   430  			TestLabelTwo = "two"
   431  			TestLabelThree = "three"
   432  		}
   433  		name = "%s"
   434  	}
   435  	spec {
   436  		access_modes = ["ReadWriteMany"]
   437  		resources {
   438  			requests {
   439  				storage = "5Gi"
   440  			}
   441  		}
   442  		selector {
   443  			match_expressions {
   444  				key = "environment"
   445  				operator = "In"
   446  				values = ["non-exists-12345"]
   447  			}
   448  		}
   449  	}
   450  	wait_until_bound = false
   451  }
   452  `, name)
   453  }
   454  
   455  func testAccKubernetesPersistentVolumeClaimConfig_import(volumeName, claimName, diskName, zone string) string {
   456  	return fmt.Sprintf(`
   457  resource "kubernetes_persistent_volume" "test" {
   458  	metadata {
   459  		name = "%s"
   460  	}
   461  	spec {
   462  		capacity {
   463  			storage = "10Gi"
   464  		}
   465  		access_modes = ["ReadWriteMany"]
   466  		persistent_volume_source {
   467  			gce_persistent_disk {
   468  				pd_name = "${google_compute_disk.test.name}"
   469  			}
   470  		}
   471  	}
   472  }
   473  
   474  resource "google_compute_disk" "test" {
   475    name  = "%s"
   476    type  = "pd-ssd"
   477    zone  = "%s"
   478    image = "debian-8-jessie-v20170523"
   479    size = 10
   480  }
   481  
   482  resource "kubernetes_persistent_volume_claim" "test" {
   483  	metadata {
   484  		name = "%s"
   485  	}
   486  	spec {
   487  		access_modes = ["ReadWriteMany"]
   488  		resources {
   489  			requests {
   490  				storage = "5Gi"
   491  			}
   492  		}
   493  		volume_name = "${kubernetes_persistent_volume.test.metadata.0.name}"
   494  	}
   495  }
   496  `, volumeName, diskName, zone, claimName)
   497  }
   498  
   499  func testAccKubernetesPersistentVolumeClaimConfig_volumeMatch(volumeName, claimName, diskName, zone string) string {
   500  	return fmt.Sprintf(`
   501  resource "kubernetes_persistent_volume" "test" {
   502  	metadata {
   503  		name = "%s"
   504  	}
   505  	spec {
   506  		capacity {
   507  			storage = "10Gi"
   508  		}
   509  		access_modes = ["ReadWriteMany"]
   510  		persistent_volume_source {
   511  			gce_persistent_disk {
   512  				pd_name = "${google_compute_disk.test.name}"
   513  			}
   514  		}
   515  	}
   516  }
   517  
   518  resource "google_compute_disk" "test" {
   519    name  = "%s"
   520    type  = "pd-ssd"
   521    zone  = "%s"
   522    image = "debian-8-jessie-v20170523"
   523    size = 10
   524  }
   525  
   526  resource "kubernetes_persistent_volume_claim" "test" {
   527  	metadata {
   528  		name = "%s"
   529  	}
   530  	spec {
   531  		access_modes = ["ReadWriteMany"]
   532  		resources {
   533  			requests {
   534  				storage = "5Gi"
   535  			}
   536  		}
   537  		volume_name = "${kubernetes_persistent_volume.test.metadata.0.name}"
   538  	}
   539  }
   540  `, volumeName, diskName, zone, claimName)
   541  }
   542  
   543  func testAccKubernetesPersistentVolumeClaimConfig_volumeMatch_modified(volumeName, claimName, diskName, zone string) string {
   544  	return fmt.Sprintf(`
   545  resource "kubernetes_persistent_volume" "test2" {
   546  	metadata {
   547  		name = "%s"
   548  	}
   549  	spec {
   550  		capacity {
   551  			storage = "10Gi"
   552  		}
   553  		access_modes = ["ReadWriteMany"]
   554  		persistent_volume_source {
   555  			gce_persistent_disk {
   556  				pd_name = "${google_compute_disk.test.name}"
   557  			}
   558  		}
   559  	}
   560  }
   561  
   562  resource "google_compute_disk" "test" {
   563    name  = "%s"
   564    type  = "pd-ssd"
   565    zone  = "%s"
   566    image = "debian-8-jessie-v20170523"
   567    size = 10
   568  }
   569  
   570  resource "kubernetes_persistent_volume_claim" "test" {
   571  	metadata {
   572  		name = "%s"
   573  	}
   574  	spec {
   575  		access_modes = ["ReadWriteMany"]
   576  		resources {
   577  			requests {
   578  				storage = "5Gi"
   579  			}
   580  		}
   581  		volume_name = "${kubernetes_persistent_volume.test2.metadata.0.name}"
   582  	}
   583  }
   584  `, volumeName, diskName, zone, claimName)
   585  }
   586  
   587  // func testAccKubernetesPersistentVolumeClaimConfig_labelsMatch(volumeName, claimName string) string {
   588  // 	return fmt.Sprintf(`
   589  // resource "kubernetes_persistent_volume" "test" {
   590  // 	metadata {
   591  // 		labels {
   592  // 			TfAccTestEnvironment = "blablah"
   593  // 		}
   594  // 		name = "%s"
   595  // 	}
   596  // 	spec {
   597  // 		capacity {
   598  // 			storage = "10Gi"
   599  // 		}
   600  // 		access_modes = ["ReadWriteMany"]
   601  // 		persistent_volume_source {
   602  // 			gce_persistent_disk {
   603  // 				pd_name = "test123"
   604  // 			}
   605  // 		}
   606  // 	}
   607  // }
   608  
   609  // resource "kubernetes_persistent_volume_claim" "test" {
   610  // 	metadata {
   611  // 		name = "%s"
   612  // 	}
   613  // 	spec {
   614  // 		access_modes = ["ReadWriteMany"]
   615  // 		resources {
   616  // 			requests {
   617  // 				storage = "5Gi"
   618  // 			}
   619  // 		}
   620  // 		selector {
   621  // 			match_labels {
   622  // 				TfAccTestEnvironment = "blablah"
   623  // 			}
   624  // 		}
   625  // 	}
   626  // }
   627  // `, volumeName, claimName)
   628  // }
   629  
   630  // func testAccKubernetesPersistentVolumeClaimConfig_labelsMatchExpression(volumeName, claimName string) string {
   631  // 	return fmt.Sprintf(`
   632  // resource "kubernetes_persistent_volume" "test" {
   633  // 	metadata {
   634  // 		labels {
   635  // 			TfAccTestEnvironment = "two"
   636  // 		}
   637  // 		name = "%s"
   638  // 	}
   639  // 	spec {
   640  // 		capacity {
   641  // 			storage = "10Gi"
   642  // 		}
   643  // 		access_modes = ["ReadWriteMany"]
   644  // 		persistent_volume_source {
   645  // 			gce_persistent_disk {
   646  // 				pd_name = "test123"
   647  // 			}
   648  // 		}
   649  // 	}
   650  // }
   651  
   652  // resource "kubernetes_persistent_volume_claim" "test" {
   653  // 	metadata {
   654  // 		name = "%s"
   655  // 	}
   656  // 	spec {
   657  // 		access_modes = ["ReadWriteMany"]
   658  // 		resources {
   659  // 			requests {
   660  // 				storage = "5Gi"
   661  // 			}
   662  // 		}
   663  // 		selector {
   664  // 			match_expressions {
   665  // 				key = "TfAccTestEnvironment"
   666  // 				operator = "In"
   667  // 				values = ["one", "three", "two"]
   668  // 			}
   669  // 		}
   670  // 	}
   671  // }
   672  // `, volumeName, claimName)
   673  // }
   674  
   675  func testAccKubernetesPersistentVolumeClaimConfig_volumeUpdate(volumeName, claimName, storage, diskName, zone string) string {
   676  	return fmt.Sprintf(`
   677  resource "kubernetes_persistent_volume" "test" {
   678  	metadata {
   679  		name = "%s"
   680  	}
   681  	spec {
   682  		capacity {
   683  			storage = "%s"
   684  		}
   685  		access_modes = ["ReadWriteMany"]
   686  		persistent_volume_source {
   687  			gce_persistent_disk {
   688  				pd_name = "${google_compute_disk.test.name}"
   689  			}
   690  		}
   691  	}
   692  }
   693  
   694  resource "google_compute_disk" "test" {
   695    name  = "%s"
   696    type  = "pd-ssd"
   697    zone  = "%s"
   698    image = "debian-8-jessie-v20170523"
   699    size = 10
   700  }
   701  
   702  resource "kubernetes_persistent_volume_claim" "test" {
   703  	metadata {
   704  		name = "%s"
   705  	}
   706  	spec {
   707  		access_modes = ["ReadWriteMany"]
   708  		resources {
   709  			requests {
   710  				storage = "5Gi"
   711  			}
   712  		}
   713  		volume_name = "${kubernetes_persistent_volume.test.metadata.0.name}"
   714  	}
   715  }
   716  `, volumeName, storage, diskName, zone, claimName)
   717  }