Skip to content

Commit

Permalink
Add a new attribute 'volume_mode' to persistentVolumeClaim resources (h…
Browse files Browse the repository at this point in the history
  • Loading branch information
arybolovlev authored Nov 30, 2023
1 parent bf5dfec commit 96b44b0
Show file tree
Hide file tree
Showing 13 changed files with 201 additions and 28 deletions.
23 changes: 23 additions & 0 deletions .changelog/2353.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
```release-note:enhancement
`resource/kubernetes_persistent_volume_claim`: add a new attribute `spec.volume_mode`.
```

```release-note:enhancement
`resource/kubernetes_persistent_volume_claim_v1`: add a new attribute `spec.volume_mode`.
```

```release-note:enhancement
`resource/kubernetes_stateful_set`: add a new attribute `spec.volume_claim_template.spec.volume_mode`.
```

```release-note:enhancement
`resource/kubernetes_stateful_set_v1`: add a new attribute `spec.volume_claim_template.spec.volume_mode`.
```

```release-note:enhancement
`data_source/kubernetes_persistent_volume_claim`: add a new attribute `spec.volume_mode`.
```

```release-note:enhancement
`data_source/kubernetes_persistent_volume_claim_v1`: add a new attribute `spec.volume_mode`.
```
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ func dataSourceKubernetesPersistentVolumeClaimV1() *schema.Resource {
Optional: true,
Computed: true,
},
"volume_mode": {
Type: schema.TypeString,
Description: "Defines what type of volume is required by the claim.",
Optional: true,
Computed: true,
},
},
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
corev1 "k8s.io/api/core/v1"
)

func TestAccKubernetesDataSourcePersistentVolumeClaimV1_basic(t *testing.T) {
Expand All @@ -32,7 +33,7 @@ func TestAccKubernetesDataSourcePersistentVolumeClaimV1_basic(t *testing.T) {
resource.TestCheckResourceAttr(resourceName, "spec.0.resources.#", "1"),
resource.TestCheckResourceAttr(resourceName, "spec.0.resources.0.requests.%", "1"),
resource.TestCheckResourceAttr(resourceName, "spec.0.resources.0.requests.storage", "1Gi"),
resource.TestCheckResourceAttr(resourceName, "metadata.0.name", name),
resource.TestCheckResourceAttr(resourceName, "spec.0.volume_mode", string(corev1.PersistentVolumeFilesystem)),
),
},
{
Expand All @@ -48,6 +49,7 @@ func TestAccKubernetesDataSourcePersistentVolumeClaimV1_basic(t *testing.T) {
resource.TestCheckResourceAttr(dataSourceName, "spec.0.resources.#", "1"),
resource.TestCheckResourceAttr(dataSourceName, "spec.0.resources.0.requests.%", "1"),
resource.TestCheckResourceAttr(dataSourceName, "spec.0.resources.0.requests.storage", "1Gi"),
resource.TestCheckResourceAttr(dataSourceName, "spec.0.volume_mode", string(corev1.PersistentVolumeFilesystem)),
),
},
},
Expand Down
122 changes: 106 additions & 16 deletions kubernetes/resource_kubernetes_persistent_volume_claim_v1_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
api "k8s.io/api/core/v1"
corev1 "k8s.io/api/core/v1"
storageapi "k8s.io/api/storage/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func TestAccKubernetesPersistentVolumeClaimV1_basic(t *testing.T) {
var conf api.PersistentVolumeClaim
var conf corev1.PersistentVolumeClaim
name := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
resourceName := "kubernetes_persistent_volume_claim_v1.test"

Expand Down Expand Up @@ -131,8 +131,8 @@ func TestAccKubernetesPersistentVolumeClaimV1_basic(t *testing.T) {
}

func TestAccKubernetesPersistentVolumeClaimV1_googleCloud_volumeMatch(t *testing.T) {
var pvcConf api.PersistentVolumeClaim
var pvConf api.PersistentVolume
var pvcConf corev1.PersistentVolumeClaim
var pvConf corev1.PersistentVolume
claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
volumeNameModified := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
Expand Down Expand Up @@ -200,7 +200,7 @@ func TestAccKubernetesPersistentVolumeClaimV1_googleCloud_volumeMatch(t *testing
// TODO: Re-enable when we build test env for K8S that supports it

// func TestAccKubernetesPersistentVolumeClaim_labelsMatch(t *testing.T) {
// var conf api.PersistentVolumeClaim
// var conf corev1.PersistentVolumeClaim
// claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
// volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))

Expand Down Expand Up @@ -235,7 +235,7 @@ func TestAccKubernetesPersistentVolumeClaimV1_googleCloud_volumeMatch(t *testing
// }

// func TestAccKubernetesPersistentVolumeClaim_labelsMatchExpression(t *testing.T) {
// var conf api.PersistentVolumeClaim
// var conf corev1.PersistentVolumeClaim
// claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
// volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))

Expand Down Expand Up @@ -275,8 +275,8 @@ func TestAccKubernetesPersistentVolumeClaimV1_googleCloud_volumeMatch(t *testing
// }

func TestAccKubernetesPersistentVolumeClaimV1_googleCloud_volumeUpdate(t *testing.T) {
var pvcConf api.PersistentVolumeClaim
var pvConf api.PersistentVolume
var pvcConf corev1.PersistentVolumeClaim
var pvConf corev1.PersistentVolume

claimName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
volumeName := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
Expand Down Expand Up @@ -337,7 +337,7 @@ func TestAccKubernetesPersistentVolumeClaimV1_googleCloud_volumeUpdate(t *testin
}

func TestAccKubernetesPersistentVolumeClaimV1_googleCloud_storageClass(t *testing.T) {
var pvcConf api.PersistentVolumeClaim
var pvcConf corev1.PersistentVolumeClaim
var storageClass storageapi.StorageClass
var secondStorageClass storageapi.StorageClass

Expand Down Expand Up @@ -404,7 +404,7 @@ func TestAccKubernetesPersistentVolumeClaimV1_googleCloud_storageClass(t *testin
}

func TestAccKubernetesPersistentVolumeClaimV1_expansionGoogleCloud(t *testing.T) {
var conf1, conf2 api.PersistentVolumeClaim
var conf1, conf2 corev1.PersistentVolumeClaim
name := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
imageName := busyboxImage
resourceName := "kubernetes_persistent_volume_claim_v1.test"
Expand Down Expand Up @@ -447,7 +447,7 @@ func TestAccKubernetesPersistentVolumeClaimV1_expansionGoogleCloud(t *testing.T)
}

func TestAccKubernetesPersistentVolumeClaimV1_expansionMinikube(t *testing.T) {
var conf1, conf2 api.PersistentVolumeClaim
var conf1, conf2 corev1.PersistentVolumeClaim
name := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
resourceName := "kubernetes_persistent_volume_claim_v1.test"

Expand Down Expand Up @@ -512,6 +512,55 @@ func TestAccKubernetesPersistentVolumeClaimV1_expansionMinikube(t *testing.T) {
})
}

func TestAccKubernetesPersistentVolumeClaimV1_volumeMode(t *testing.T) {
var conf corev1.PersistentVolumeClaim
name := fmt.Sprintf("tf-acc-test-%s", acctest.RandString(10))
resourceName := "kubernetes_persistent_volume_claim_v1.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
IDRefreshName: resourceName,
IDRefreshIgnore: []string{"metadata.0.resource_version"},
ProviderFactories: testAccProviderFactories,
CheckDestroy: testAccCheckKubernetesPersistentVolumeClaimV1Destroy,
Steps: []resource.TestStep{
{
Config: testAccKubernetesPersistentVolumeClaimV1Config_volumeModeDefault(name),
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckKubernetesPersistentVolumeClaimV1Exists(resourceName, &conf),
resource.TestCheckResourceAttr(resourceName, "metadata.0.name", name),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.generation"),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.resource_version"),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.uid"),
resource.TestCheckResourceAttr(resourceName, "spec.0.volume_mode", string(corev1.PersistentVolumeFilesystem)),
),
},
{
Config: testAccKubernetesPersistentVolumeClaimV1Config_volumeMode(name, string(corev1.PersistentVolumeFilesystem)),
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckKubernetesPersistentVolumeClaimV1Exists(resourceName, &conf),
resource.TestCheckResourceAttr(resourceName, "metadata.0.name", name),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.generation"),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.resource_version"),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.uid"),
resource.TestCheckResourceAttr(resourceName, "spec.0.volume_mode", string(corev1.PersistentVolumeFilesystem)),
),
},
{
Config: testAccKubernetesPersistentVolumeClaimV1Config_volumeMode(name, string(corev1.PersistentVolumeBlock)),
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckKubernetesPersistentVolumeClaimV1Exists(resourceName, &conf),
resource.TestCheckResourceAttr(resourceName, "metadata.0.name", name),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.generation"),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.resource_version"),
resource.TestCheckResourceAttrSet(resourceName, "metadata.0.uid"),
resource.TestCheckResourceAttr(resourceName, "spec.0.volume_mode", string(corev1.PersistentVolumeBlock)),
),
},
},
})
}

func testAccCheckKubernetesPersistentVolumeClaimV1Destroy(s *terraform.State) error {
conn, err := testAccProvider.Meta().(KubeClientsets).MainClientset()
if err != nil {
Expand All @@ -529,7 +578,7 @@ func testAccCheckKubernetesPersistentVolumeClaimV1Destroy(s *terraform.State) er
return err
}

var resp *api.PersistentVolumeClaim
var resp *corev1.PersistentVolumeClaim
err = resource.RetryContext(ctx, 3*time.Minute, func() *resource.RetryError {
resp, err = conn.CoreV1().PersistentVolumeClaims(namespace).Get(ctx, name, metav1.GetOptions{})
if errors.IsNotFound(err) {
Expand All @@ -551,7 +600,7 @@ func testAccCheckKubernetesPersistentVolumeClaimV1Destroy(s *terraform.State) er
return nil
}

func testAccCheckKubernetesPersistentVolumeClaimV1Exists(n string, obj *api.PersistentVolumeClaim) resource.TestCheckFunc {
func testAccCheckKubernetesPersistentVolumeClaimV1Exists(n string, obj *corev1.PersistentVolumeClaim) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
Expand All @@ -578,7 +627,7 @@ func testAccCheckKubernetesPersistentVolumeClaimV1Exists(n string, obj *api.Pers
}
}

func testAccCheckKubernetesPersistentVolumeClaimV1IsDestroyed(obj *api.PersistentVolumeClaim) resource.TestCheckFunc {
func testAccCheckKubernetesPersistentVolumeClaimV1IsDestroyed(obj *corev1.PersistentVolumeClaim) resource.TestCheckFunc {
return func(s *terraform.State) error {
meta := obj.GetObjectMeta()
conn, err := testAccProvider.Meta().(KubeClientsets).MainClientset()
Expand All @@ -598,7 +647,7 @@ func testAccCheckKubernetesPersistentVolumeClaimV1IsDestroyed(obj *api.Persisten
}
}

func testAccCheckClaimRef(pv *api.PersistentVolume, expected *ObjectRefStatic) resource.TestCheckFunc {
func testAccCheckClaimRef(pv *corev1.PersistentVolume, expected *ObjectRefStatic) resource.TestCheckFunc {
return func(s *terraform.State) error {
or := pv.Spec.ClaimRef
if or == nil {
Expand Down Expand Up @@ -1133,7 +1182,48 @@ resource "kubernetes_persistent_volume_claim_v1" "test" {
`, className, className, claimName)
}

func testAccCheckKubernetesPersistentVolumeClaimV1ForceNew(old, new *api.PersistentVolumeClaim, wantNew bool) resource.TestCheckFunc {
func testAccKubernetesPersistentVolumeClaimV1Config_volumeModeDefault(name string) string {
return fmt.Sprintf(`resource "kubernetes_persistent_volume_claim_v1" "test" {
metadata {
name = %q
}
spec {
access_modes = ["ReadWriteOnce"]
resources {
requests = {
storage = "1Gi"
}
}
}
wait_until_bound = false
}
`, name)
}

func testAccKubernetesPersistentVolumeClaimV1Config_volumeMode(name, volumeMode string) string {
return fmt.Sprintf(`resource "kubernetes_persistent_volume_claim_v1" "test" {
metadata {
name = %q
}
spec {
access_modes = ["ReadWriteOnce"]
volume_mode = %q
resources {
requests = {
storage = "1Gi"
}
}
}
wait_until_bound = false
}
`, name, volumeMode)
}

func testAccCheckKubernetesPersistentVolumeClaimV1ForceNew(old, new *corev1.PersistentVolumeClaim, wantNew bool) resource.TestCheckFunc {
return func(s *terraform.State) error {
if wantNew {
if old.ObjectMeta.UID == new.ObjectMeta.UID {
Expand Down
12 changes: 12 additions & 0 deletions kubernetes/schema_persistent_volume_claim.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package kubernetes
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
corev1 "k8s.io/api/core/v1"
)

func persistentVolumeClaimFields() map[string]*schema.Schema {
Expand Down Expand Up @@ -88,5 +89,16 @@ func persistentVolumeClaimSpecFields() map[string]*schema.Schema {
Computed: true,
ForceNew: true,
},
"volume_mode": {
Type: schema.TypeString,
Description: "Defines what type of volume is required by the claim.",
Optional: true,
Computed: true,
ForceNew: true,
ValidateFunc: validation.StringInSlice([]string{
string(corev1.PersistentVolumeBlock),
string(corev1.PersistentVolumeFilesystem),
}, false),
},
}
}
20 changes: 13 additions & 7 deletions kubernetes/structure_persistent_volume_claim.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import (
"errors"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"k8s.io/api/core/v1"
api "k8s.io/api/core/v1"
corev1 "k8s.io/api/core/v1"
)

// Flatteners

func flattenPersistentVolumeClaimSpec(in v1.PersistentVolumeClaimSpec) []interface{} {
func flattenPersistentVolumeClaimSpec(in corev1.PersistentVolumeClaimSpec) []interface{} {
att := make(map[string]interface{})
att["access_modes"] = flattenPersistentVolumeAccessModes(in.AccessModes)
att["resources"] = flattenResourceRequirements(in.Resources)
Expand All @@ -26,10 +26,13 @@ func flattenPersistentVolumeClaimSpec(in v1.PersistentVolumeClaimSpec) []interfa
if in.StorageClassName != nil {
att["storage_class_name"] = *in.StorageClassName
}
if in.VolumeMode != nil {
att["volume_mode"] = in.VolumeMode
}
return []interface{}{att}
}

func flattenResourceRequirements(in v1.ResourceRequirements) []interface{} {
func flattenResourceRequirements(in corev1.ResourceRequirements) []interface{} {
att := make(map[string]interface{})
if len(in.Limits) > 0 {
att["limits"] = flattenResourceList(in.Limits)
Expand Down Expand Up @@ -64,8 +67,8 @@ func expandPersistentVolumeClaim(p map[string]interface{}) (*corev1.PersistentVo
return pvc, nil
}

func expandPersistentVolumeClaimSpec(l []interface{}) (*v1.PersistentVolumeClaimSpec, error) {
obj := &v1.PersistentVolumeClaimSpec{}
func expandPersistentVolumeClaimSpec(l []interface{}) (*corev1.PersistentVolumeClaimSpec, error) {
obj := &corev1.PersistentVolumeClaimSpec{}
if len(l) == 0 || l[0] == nil {
return obj, nil
}
Expand All @@ -85,11 +88,14 @@ func expandPersistentVolumeClaimSpec(l []interface{}) (*v1.PersistentVolumeClaim
if v, ok := in["storage_class_name"].(string); ok && v != "" {
obj.StorageClassName = ptrToString(v)
}
if v, ok := in["volume_mode"].(string); ok && v != "" {
obj.VolumeMode = pointerOf(api.PersistentVolumeMode(v))
}
return obj, nil
}

func expandResourceRequirements(l []interface{}) (*v1.ResourceRequirements, error) {
obj := &v1.ResourceRequirements{}
func expandResourceRequirements(l []interface{}) (*corev1.ResourceRequirements, error) {
obj := &corev1.ResourceRequirements{}
if len(l) == 0 || l[0] == nil {
return obj, nil
}
Expand Down
4 changes: 4 additions & 0 deletions kubernetes/structures.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,10 @@ func ptrToInt64(i int64) *int64 {
return &i
}

func pointerOf[A any](a A) *A {
return &a
}

func sliceOfString(slice []interface{}) []string {
result := make([]string, len(slice))
for i, s := range slice {
Expand Down
Loading

0 comments on commit 96b44b0

Please sign in to comment.