Immutable secrets/configmaps tests
This commit is contained in:
@@ -23,6 +23,7 @@ import (
|
||||
"github.com/onsi/ginkgo"
|
||||
"github.com/onsi/gomega"
|
||||
"k8s.io/api/core/v1"
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/util/uuid"
|
||||
"k8s.io/kubernetes/test/e2e/framework"
|
||||
@@ -549,6 +550,52 @@ var _ = ginkgo.Describe("[sig-storage] ConfigMap", func() {
|
||||
|
||||
})
|
||||
|
||||
// It should be forbidden to change data for configmaps marked as immutable, but
|
||||
// allowed to modify its metadata independently of its state.
|
||||
ginkgo.It("should be immutable if `immutable` field is set [Feature:ImmutableEphemeralVolume]", func() {
|
||||
name := "immutable"
|
||||
configMap := newConfigMap(f, name)
|
||||
|
||||
currentConfigMap, err := f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Create(configMap)
|
||||
framework.ExpectNoError(err, "Failed to create config map %q in namespace %q", configMap.Name, configMap.Namespace)
|
||||
|
||||
currentConfigMap.Data["data-4"] = "value-4"
|
||||
currentConfigMap, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Update(currentConfigMap)
|
||||
framework.ExpectNoError(err, "Failed to update config map %q in namespace %q", configMap.Name, configMap.Namespace)
|
||||
|
||||
// Mark config map as immutable.
|
||||
trueVal := true
|
||||
currentConfigMap.Immutable = &trueVal
|
||||
currentConfigMap, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Update(currentConfigMap)
|
||||
framework.ExpectNoError(err, "Failed to mark config map %q in namespace %q as immutable", configMap.Name, configMap.Namespace)
|
||||
|
||||
// Ensure data can't be changed now.
|
||||
currentConfigMap.Data["data-5"] = "value-5"
|
||||
_, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Update(currentConfigMap)
|
||||
framework.ExpectEqual(apierrors.IsInvalid(err), true)
|
||||
|
||||
// Ensure config map can't be switched from immutable to mutable.
|
||||
currentConfigMap, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Get(name, metav1.GetOptions{})
|
||||
framework.ExpectNoError(err, "Failed to get config map %q in namespace %q", configMap.Name, configMap.Namespace)
|
||||
framework.ExpectEqual(*currentConfigMap.Immutable, true)
|
||||
|
||||
falseVal := false
|
||||
currentConfigMap.Immutable = &falseVal
|
||||
_, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Update(currentConfigMap)
|
||||
framework.ExpectEqual(apierrors.IsInvalid(err), true)
|
||||
|
||||
// Ensure that metadata can be changed.
|
||||
currentConfigMap, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Get(name, metav1.GetOptions{})
|
||||
framework.ExpectNoError(err, "Failed to get config map %q in namespace %q", configMap.Name, configMap.Namespace)
|
||||
currentConfigMap.Labels = map[string]string{"label1": "value1"}
|
||||
_, err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Update(currentConfigMap)
|
||||
framework.ExpectNoError(err, "Failed to update config map %q in namespace %q", configMap.Name, configMap.Namespace)
|
||||
|
||||
// Ensure that immutable config map can be deleted.
|
||||
err = f.ClientSet.CoreV1().ConfigMaps(f.Namespace.Name).Delete(name, &metav1.DeleteOptions{})
|
||||
framework.ExpectNoError(err, "Failed to delete config map %q in namespace %q", configMap.Name, configMap.Namespace)
|
||||
})
|
||||
|
||||
// The pod is in pending during volume creation until the configMap objects are available
|
||||
// or until mount the configMap volume times out. There is no configMap object defined for the pod, so it should return timout exception unless it is marked optional.
|
||||
// Slow (~5 mins)
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
"path"
|
||||
|
||||
"k8s.io/api/core/v1"
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/util/uuid"
|
||||
"k8s.io/kubernetes/test/e2e/framework"
|
||||
@@ -368,6 +369,52 @@ var _ = ginkgo.Describe("[sig-storage] Secrets", func() {
|
||||
gomega.Eventually(pollDeleteLogs, podLogTimeout, framework.Poll).Should(gomega.ContainSubstring("Error reading file /etc/secret-volumes/delete/data-1"))
|
||||
})
|
||||
|
||||
// It should be forbidden to change data for secrets marked as immutable, but
|
||||
// allowed to modify its metadata independently of its state.
|
||||
ginkgo.It("should be immutable if `immutable` field is set [Feature:ImmutableEphemeralVolume]", func() {
|
||||
name := "immutable"
|
||||
secret := secretForTest(f.Namespace.Name, name)
|
||||
|
||||
currentSecret, err := f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Create(secret)
|
||||
framework.ExpectNoError(err, "Failed to create secret %q in namespace %q", secret.Name, secret.Namespace)
|
||||
|
||||
currentSecret.Data["data-4"] = []byte("value-4\n")
|
||||
currentSecret, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Update(currentSecret)
|
||||
framework.ExpectNoError(err, "Failed to update secret %q in namespace %q", secret.Name, secret.Namespace)
|
||||
|
||||
// Mark secret as immutable.
|
||||
trueVal := true
|
||||
currentSecret.Immutable = &trueVal
|
||||
currentSecret, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Update(currentSecret)
|
||||
framework.ExpectNoError(err, "Failed to mark secret %q in namespace %q as immutable", secret.Name, secret.Namespace)
|
||||
|
||||
// Ensure data can't be changed now.
|
||||
currentSecret.Data["data-5"] = []byte("value-5\n")
|
||||
_, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Update(currentSecret)
|
||||
framework.ExpectEqual(apierrors.IsInvalid(err), true)
|
||||
|
||||
// Ensure secret can't be switched from immutable to mutable.
|
||||
currentSecret, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Get(name, metav1.GetOptions{})
|
||||
framework.ExpectNoError(err, "Failed to get secret %q in namespace %q", secret.Name, secret.Namespace)
|
||||
framework.ExpectEqual(*currentSecret.Immutable, true)
|
||||
|
||||
falseVal := false
|
||||
currentSecret.Immutable = &falseVal
|
||||
_, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Update(currentSecret)
|
||||
framework.ExpectEqual(apierrors.IsInvalid(err), true)
|
||||
|
||||
// Ensure that metadata can be changed.
|
||||
currentSecret, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Get(name, metav1.GetOptions{})
|
||||
framework.ExpectNoError(err, "Failed to get secret %q in namespace %q", secret.Name, secret.Namespace)
|
||||
currentSecret.Labels = map[string]string{"label1": "value1"}
|
||||
_, err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Update(currentSecret)
|
||||
framework.ExpectNoError(err, "Failed to update secret %q in namespace %q", secret.Name, secret.Namespace)
|
||||
|
||||
// Ensure that immutable secret can be deleted.
|
||||
err = f.ClientSet.CoreV1().Secrets(f.Namespace.Name).Delete(name, &metav1.DeleteOptions{})
|
||||
framework.ExpectNoError(err, "Failed to delete secret %q in namespace %q", secret.Name, secret.Namespace)
|
||||
})
|
||||
|
||||
// The secret is in pending during volume creation until the secret objects are available
|
||||
// or until mount the secret volume times out. There is no secret object defined for the pod, so it should return timout exception unless it is marked optional.
|
||||
// Slow (~5 mins)
|
||||
|
||||
Reference in New Issue
Block a user