diff --git a/assets/auto-deploy-app/templates/pvc.yaml b/assets/auto-deploy-app/templates/pvc.yaml index 4655ed128a1e10d91640c1be458eee83689d41a5..5ec254f0554bab766c60ddb2bd6d1c369c4e5a4b 100644 --- a/assets/auto-deploy-app/templates/pvc.yaml +++ b/assets/auto-deploy-app/templates/pvc.yaml @@ -20,5 +20,8 @@ spec: {{- if $volume.claim.storageClass }} storageClassName: {{ $volume.claim.storageClass | quote }} {{- end }} + {{- if $volume.claim.volumeName }} + volumeName: {{ $volume.claim.volumeName | quote }} + {{- end }} {{- end }} {{- end -}} diff --git a/assets/auto-deploy-app/test/templates/pvc_test.go b/assets/auto-deploy-app/test/templates/pvc_test.go index cc429c21b492320081c2518f886db7af6ae338ef..63f7eb12ea1247eb68c1e9bb00f5682866f271bd 100644 --- a/assets/auto-deploy-app/test/templates/pvc_test.go +++ b/assets/auto-deploy-app/test/templates/pvc_test.go @@ -16,6 +16,7 @@ func TestPvcTemplate_Single(t *testing.T) { templates := []string{"templates/pvc.yaml"} releaseName := "test" customStorageClassName := "MyStorageClass" + customVolumeName := "MyVolumeName" expectedLabels := map[string]string{ "app": releaseName, "chart": chartName, @@ -53,6 +54,7 @@ func TestPvcTemplate_Single(t *testing.T) { "persistence.volumes[0].claim.accessMode": "ReadOnlyMany", "persistence.volumes[0].claim.size": "20Gi", "persistence.volumes[0].claim.storageClass": customStorageClassName, + "persistence.volumes[0].claim.volumeName": customVolumeName, "persistence.volumes[0].mount.path": "/log", }, expectedMeta: metav1.ObjectMeta{Name: "test-auto-deploy-log-dir", Labels: expectedLabels}, @@ -60,6 +62,7 @@ func TestPvcTemplate_Single(t *testing.T) { AccessModes: [](coreV1.PersistentVolumeAccessMode){coreV1.ReadOnlyMany}, Resources: coreV1.ResourceRequirements{Requests: coreV1.ResourceList{"storage": resource.MustParse("20Gi")}}, StorageClassName: &customStorageClassName, + VolumeName: customVolumeName, }, }, { @@ -72,7 +75,7 @@ func TestPvcTemplate_Single(t *testing.T) { for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { opts := &helm.Options{ - SetValues: tc.values, + SetValues: tc.values, } output := mustRenderTemplate(t, opts, releaseName, templates, tc.expectedErrorRegexp) @@ -83,6 +86,7 @@ func TestPvcTemplate_Single(t *testing.T) { require.Equal(t, tc.expectedPVC.AccessModes, pvc.Spec.AccessModes) require.Equal(t, tc.expectedPVC.Resources.Requests["storage"], pvc.Spec.Resources.Requests["storage"]) require.Equal(t, tc.expectedPVC.StorageClassName, pvc.Spec.StorageClassName) + require.Equal(t, tc.expectedPVC.VolumeName, pvc.Spec.VolumeName) }) } } @@ -91,6 +95,7 @@ func TestPvcTemplate_Multiple(t *testing.T) { templates := []string{"templates/pvc.yaml"} releaseName := "test" customStorageClassName := "MyStorageClass" + customVolumeName := "MyVolumeName" expectedLabels := map[string]string{ "app": releaseName, "chart": chartName, @@ -123,6 +128,7 @@ func TestPvcTemplate_Multiple(t *testing.T) { "persistence.volumes[1].claim.accessMode": "ReadOnlyMany", "persistence.volumes[1].claim.size": "20Gi", "persistence.volumes[1].claim.storageClass": customStorageClassName, + "persistence.volumes[1].claim.volumeName": customVolumeName, "persistence.volumes[1].mount.path": "/log", }, expectedMetas: []metav1.ObjectMeta{ @@ -138,6 +144,7 @@ func TestPvcTemplate_Multiple(t *testing.T) { AccessModes: [](coreV1.PersistentVolumeAccessMode){coreV1.ReadOnlyMany}, Resources: coreV1.ResourceRequirements{Requests: coreV1.ResourceList{"storage": resource.MustParse("20Gi")}}, StorageClassName: &customStorageClassName, + VolumeName: customVolumeName, }, }, }, @@ -146,7 +153,7 @@ func TestPvcTemplate_Multiple(t *testing.T) { for _, tc := range tcs { t.Run(tc.name, func(t *testing.T) { opts := &helm.Options{ - SetValues: tc.values, + SetValues: tc.values, } output := mustRenderTemplate(t, opts, releaseName, templates, tc.expectedErrorRegexp) @@ -158,6 +165,7 @@ func TestPvcTemplate_Multiple(t *testing.T) { require.Equal(t, tc.expectedPVCs[i].AccessModes, pvc.Spec.AccessModes) require.Equal(t, tc.expectedPVCs[i].Resources.Requests["storage"], pvc.Spec.Resources.Requests["storage"]) require.Equal(t, tc.expectedPVCs[i].StorageClassName, pvc.Spec.StorageClassName) + require.Equal(t, tc.expectedPVCs[i].VolumeName, pvc.Spec.VolumeName) } }) } diff --git a/assets/auto-deploy-app/values.yaml b/assets/auto-deploy-app/values.yaml index 24ee43addc0c85113503a033ab92c089ba085125..64e837d6136d35cbf24791206c8655f443e25bf7 100644 --- a/assets/auto-deploy-app/values.yaml +++ b/assets/auto-deploy-app/values.yaml @@ -197,6 +197,9 @@ persistence: # For example, GKE automatically chooses a default storage class and allocate a physical storage. # See https://cloud.google.com/kubernetes-engine/docs/concepts/persistent-volumes for more information. # storageClass: "myStorage" + # You can also reserve a persistent volume using `volumeName` + # See https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reserving-a-persistentvolume + # volumeName: "my-vol" ## Configure extra Volumes ## ref: https://kubernetes.io/docs/concepts/storage/volumes/