mirror of https://github.com/knative/func.git
test: adding e2e test for config volumes EmptyDir and PersistentVolumeClaim (#2078)
This commit is contained in:
parent
e5f7fa7db3
commit
6f0b90d8aa
|
@ -9,6 +9,10 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
"k8s.io/apimachinery/pkg/util/rand"
|
||||||
|
|
||||||
"gotest.tools/v3/assert"
|
"gotest.tools/v3/assert"
|
||||||
"knative.dev/func/test/common"
|
"knative.dev/func/test/common"
|
||||||
"knative.dev/func/test/testhttp"
|
"knative.dev/func/test/testhttp"
|
||||||
|
@ -166,3 +170,128 @@ func TestConfigVolumes(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// enableKnativeVolumeExtentions ensures EmptyDir and PersitentVolumeClaim can be used with knative/functions. More at:
|
||||||
|
// https://knative.dev/docs/serving/configuration/feature-flags/#kubernetes-emptydir-volume
|
||||||
|
// https://knative.dev/docs/serving/configuration/feature-flags/#kubernetes-persistentvolumeclaim-pvc
|
||||||
|
func enableKnativeVolumeExtension(t *testing.T) {
|
||||||
|
config, _ := k8s.GetClientConfig().ClientConfig()
|
||||||
|
client, _ := kubernetes.NewForConfig(config)
|
||||||
|
namespace := "knative-serving"
|
||||||
|
|
||||||
|
// Enable EmptyDir extended feature for Knative
|
||||||
|
_, err := client.CoreV1().ConfigMaps(namespace).Patch(context.Background(), "config-features", types.MergePatchType,
|
||||||
|
[]byte(`{"data":{"kubernetes.podspec-volumes-emptydir":"enabled"}}`),
|
||||||
|
metav1.PatchOptions{})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable Persistent Volumes Claim extended feature for Knative
|
||||||
|
_, err = client.CoreV1().ConfigMaps(namespace).Patch(context.Background(), "config-features", types.MergePatchType,
|
||||||
|
[]byte(`{"data":{"kubernetes.podspec-persistent-volume-claim":"enabled","kubernetes.podspec-persistent-volume-write":"enabled"}}`),
|
||||||
|
metav1.PatchOptions{})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Log("Enabled Knative PVC and EmptyDir extensions")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// setupTestPvc adds a test Persistent Volume Claim used by PVC test
|
||||||
|
func setupTestPvc(t *testing.T, pvcName string) {
|
||||||
|
config, _ := k8s.GetClientConfig().ClientConfig()
|
||||||
|
client, _ := kubernetes.NewForConfig(config)
|
||||||
|
namespace, _, _ := k8s.GetClientConfig().Namespace()
|
||||||
|
|
||||||
|
// Add Testing PVC
|
||||||
|
pvc := &corev1.PersistentVolumeClaim{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: pvcName},
|
||||||
|
Spec: corev1.PersistentVolumeClaimSpec{
|
||||||
|
AccessModes: []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce},
|
||||||
|
Resources: corev1.ResourceRequirements{
|
||||||
|
Requests: corev1.ResourceList{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
pvc.Spec.Resources.Requests[corev1.ResourceStorage] = resource.MustParse("1Mi")
|
||||||
|
_, err := client.CoreV1().PersistentVolumeClaims(namespace).Create(context.Background(), pvc, metav1.CreateOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Log("Created test PVC " + pvcName)
|
||||||
|
|
||||||
|
t.Cleanup(func() {
|
||||||
|
client.CoreV1().PersistentVolumeClaims(namespace).Delete(context.Background(), pvcName, metav1.DeleteOptions{})
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestConfigVolumesPvcEmptyDir verifies PersistentVolumeClaim and EmptyDir Volumes can be added and can be accessible
|
||||||
|
// by the function by writing and reading an arbitrary file on the volumes
|
||||||
|
func TestConfigVolumesPvcEmptyDir(t *testing.T) {
|
||||||
|
|
||||||
|
enableKnativeVolumeExtension(t)
|
||||||
|
pvcName := "test-pvc-" + rand.String(5)
|
||||||
|
setupTestPvc(t, pvcName)
|
||||||
|
|
||||||
|
knFunc := common.NewTestShellInteractiveCmd(t)
|
||||||
|
knFunc.TestCmd.ShouldDumpOnSuccess = false
|
||||||
|
knFunc.CommandSleepInterval = time.Millisecond * 1500
|
||||||
|
|
||||||
|
// On When...
|
||||||
|
funcName := "test-config-vol-pvc"
|
||||||
|
funcPath := filepath.Join(t.TempDir(), funcName)
|
||||||
|
|
||||||
|
knFunc.TestCmd.Exec("create",
|
||||||
|
"--language", "go",
|
||||||
|
"--template", "volumes",
|
||||||
|
"--repository", "http://github.com/boson-project/test-templates.git",
|
||||||
|
funcPath)
|
||||||
|
knFunc.TestCmd.SourceDir = funcPath
|
||||||
|
|
||||||
|
/*
|
||||||
|
? What do you want to mount as a Volume? [Use arrows to move, type to filter]
|
||||||
|
*/
|
||||||
|
configVolumesAdd := ConfigVolumesAdd(knFunc)
|
||||||
|
|
||||||
|
configVolumesAdd(
|
||||||
|
"PersistentVolumeClaim", enter,
|
||||||
|
pvcName, enter, // ? Which "PersistentVolumeClaim" do you want to mount?
|
||||||
|
"/test/pvc", enter, // ? Please specify the path where the PersistentVolumeClaim should be mounted:
|
||||||
|
"N", enter) // ? Is this volume read-only? (y/N)
|
||||||
|
|
||||||
|
configVolumesAdd(
|
||||||
|
"EmptyDir", enter,
|
||||||
|
"/test/empty-dir", enter) // ? Please specify the path where the EmptyDir should be mounted:
|
||||||
|
|
||||||
|
// Deploy
|
||||||
|
|
||||||
|
knFunc.TestCmd.Exec("deploy", "--builder", "pack", "--registry", common.GetRegistry())
|
||||||
|
t.Cleanup(func() {
|
||||||
|
knFunc.TestCmd.Exec("delete")
|
||||||
|
})
|
||||||
|
_, functionUrl := common.WaitForFunctionReady(t, funcName)
|
||||||
|
|
||||||
|
// Validation
|
||||||
|
// The function template used by this test will help by read/write a file to the volume
|
||||||
|
filesPath := []string{"/test/pvc/a.txt", "/test/empty-dir/a.txt"}
|
||||||
|
fileContentToWrite := "A_CONTENT"
|
||||||
|
|
||||||
|
for _, filePath := range filesPath {
|
||||||
|
// - Write to volume test
|
||||||
|
targetUrl := fmt.Sprintf("%s?v=%s&w=%s", functionUrl, filePath, fileContentToWrite)
|
||||||
|
_, funcResponse := testhttp.TestGet(t, targetUrl)
|
||||||
|
assert.Assert(t, funcResponse == fileContentToWrite, "Write volume test failed writing to file %s", filePath)
|
||||||
|
|
||||||
|
// - Read from volume test
|
||||||
|
targetUrl = fmt.Sprintf("%s?v=%s", functionUrl, filePath)
|
||||||
|
_, funcResponse = testhttp.TestGet(t, targetUrl)
|
||||||
|
assert.Assert(t, funcResponse == fileContentToWrite,
|
||||||
|
"Read volume test failed. File %s content should be %s but it is %s", filePath, fileContentToWrite, funcResponse)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue