Skip to content

Commit

Permalink
add field for PersistentVolumeClaim resource
Browse files Browse the repository at this point in the history
  • Loading branch information
JaylonmcShan03 committed Dec 9, 2024
1 parent 384d2da commit da07bf8
Show file tree
Hide file tree
Showing 4 changed files with 162 additions and 0 deletions.
9 changes: 9 additions & 0 deletions kubernetes/resource_kubernetes_persistent_volume_claim_v1.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,15 @@ func resourceKubernetesPersistentVolumeClaimV1Create(ctx context.Context, d *sch
if err != nil {
return diag.FromErr(err)
}
if claim.Spec.DataSource != nil {
_, err := conn.CoreV1().PersistentVolumeClaims(claim.Namespace).Get(ctx, claim.Spec.DataSource.Name, metav1.GetOptions{})
if err != nil {
if errors.IsNotFound(err) {
return diag.Errorf("data source PersistentVolumeClaim '%s' not found", claim.Spec.DataSource.Name)
}
return diag.FromErr(err)
}
}
log.Printf("[INFO] Creating new persistent volume claim: %#v", claim)
out, err := conn.CoreV1().PersistentVolumeClaims(claim.Namespace).Create(ctx, claim, metav1.CreateOptions{})
if err != nil {
Expand Down
105 changes: 105 additions & 0 deletions kubernetes/resource_kubernetes_persistent_volume_claim_v1_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"context"
"fmt"
"os"
"regexp"
"testing"
"time"

Expand Down Expand Up @@ -562,6 +563,61 @@ func TestAccKubernetesPersistentVolumeClaimV1_volumeMode(t *testing.T) {
})
}

func TestAccKubernetesPersistentVolumeClaimV1_dataSource(t *testing.T) {
var conf corev1.PersistentVolumeClaim
originalPVC := fmt.Sprintf("tf-acc-test-original-%s", acctest.RandString(10))
clonedPVC := fmt.Sprintf("tf-acc-test-clone-%s", acctest.RandString(10))
resourceName := "kubernetes_persistent_volume_claim_v1.test_clone"

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_dataSourceOriginal(originalPVC),
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckKubernetesPersistentVolumeClaimV1Exists("kubernetes_persistent_volume_claim_v1.test_original", &conf),
resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim_v1.test_original", "metadata.0.name", originalPVC),
resource.TestCheckResourceAttr("kubernetes_persistent_volume_claim_v1.test_original", "spec.0.resources.0.requests.storage", "1Gi"),
),
},
{
Config: testAccKubernetesPersistentVolumeClaimV1Config_dataSourceClone(originalPVC, clonedPVC),
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckKubernetesPersistentVolumeClaimV1Exists(resourceName, &conf),
resource.TestCheckResourceAttr(resourceName, "metadata.0.name", clonedPVC),
resource.TestCheckResourceAttr(resourceName, "spec.0.data_source.0.persistent_volume_claim.0.claim_name", originalPVC),
),
},
},
})
}

func TestAccKubernetesPersistentVolumeClaimV1_invalidDataSource(t *testing.T) {
invalidSourcePVC := fmt.Sprintf("tf-acc-test-nonexistent-%s", acctest.RandString(10))
clonedPVC := fmt.Sprintf("tf-acc-test-clone-%s", acctest.RandString(10))
resourceName := "kubernetes_persistent_volume_claim_v1.test_clone_invalid"

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_dataSourceClone(invalidSourcePVC, clonedPVC),
ExpectError: regexp.MustCompile(
fmt.Sprintf(`data source PersistentVolumeClaim '%s' not found`, invalidSourcePVC),
),
},
},
})
}

func testAccCheckKubernetesPersistentVolumeClaimV1Destroy(s *terraform.State) error {
conn, err := testAccProvider.Meta().(KubeClientsets).MainClientset()
if err != nil {
Expand Down Expand Up @@ -961,6 +1017,55 @@ resource "kubernetes_persistent_volume_claim_v1" "test" {
`, volumeName, diskName, zone, claimName)
}

func testAccKubernetesPersistentVolumeClaimV1Config_dataSourceOriginal(name string) string {
return fmt.Sprintf(`
resource "kubernetes_persistent_volume_claim_v1" "test_original" {
metadata {
name = "%s"
}
spec {
access_modes = ["ReadWriteOnce"]
resources {
requests = {
storage = "1Gi"
}
}
}
wait_until_bound = false
}
`, name)
}
func testAccKubernetesPersistentVolumeClaimV1Config_dataSourceClone(sourceName, cloneName string) string {
return fmt.Sprintf(`
resource "kubernetes_persistent_volume_claim_v1" "test_clone" {
metadata {
name = "%s"
}
spec {
access_modes = ["ReadWriteOnce"]
resources {
requests = {
storage = "1Gi"
}
}
data_source {
persistent_volume_claim {
claim_name = "%s"
}
}
}
wait_until_bound = false
}
`, cloneName, sourceName)
}

// func testAccKubernetesPersistentVolumeClaimConfig_labelsMatch(volumeName, claimName string) string {
// return fmt.Sprintf(`// resource "kubernetes_persistent_volume" "test" {
// metadata {
Expand Down
25 changes: 25 additions & 0 deletions kubernetes/schema_persistent_volume_claim.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,31 @@ func persistentVolumeClaimSpecFields() map[string]*schema.Schema {
},
},
},
"data_source": {
Type: schema.TypeList,
Description: "Specifies the data source for the PVC. Allows creating a PVC from another PVC, VolumeSnapshot, or VolumePopulator.",
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"persistent_volume_claim": {
Type: schema.TypeList,
Description: "Details of the source PersistentVolumeClaim.",
Required: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"claim_name": {
Type: schema.TypeString,
Description: "The name of the source PersistentVolumeClaim.",
Required: true,
},
},
},
},
},
},
},
"selector": {
Type: schema.TypeList,
Description: "A label query over volumes to consider for binding.",
Expand Down
23 changes: 23 additions & 0 deletions kubernetes/structure_persistent_volume_claim.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,17 @@ func flattenPersistentVolumeClaimSpec(in corev1.PersistentVolumeClaimSpec) []int
if in.VolumeMode != nil {
att["volume_mode"] = in.VolumeMode
}
if in.DataSource != nil {
dataSource := make(map[string]interface{})
if in.DataSource.Kind == "PersistentVolumeClaim" && in.DataSource.Name != "" {
dataSource["persistent_volume_claim"] = []interface{}{
map[string]interface{}{
"claim_name": in.DataSource.Name,
},
}
}
att["data_source"] = []interface{}{dataSource}
}
return []interface{}{att}
}

Expand Down Expand Up @@ -91,6 +102,18 @@ func expandPersistentVolumeClaimSpec(l []interface{}) (*corev1.PersistentVolumeC
if v, ok := in["volume_mode"].(string); ok && v != "" {
obj.VolumeMode = ptr.To(corev1.PersistentVolumeMode(v))
}
if v, ok := in["data_source"].([]interface{}); ok && len(v) > 0 && v[0] != nil {
dataSource := v[0].(map[string]interface{})
if pvcSource, ok := dataSource["persistent_volume_claim"].([]interface{}); ok && len(pvcSource) > 0 && pvcSource[0] != nil {
pvcData := pvcSource[0].(map[string]interface{})
if claimName, ok := pvcData["claim_name"].(string); ok && claimName != "" {
obj.DataSource = &corev1.TypedLocalObjectReference{
Kind: "PersistentVolumeClaim",
Name: claimName,
}
}
}
}
return obj, nil
}

Expand Down

0 comments on commit da07bf8

Please sign in to comment.