mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-24 12:15:52 +00:00
Merge pull request #103906 from pacoxu/unsafe-e2e-test
sysctl-test: use status reason check instead of events check
This commit is contained in:
commit
92ddd4dcd6
@ -114,56 +114,10 @@ var _ = SIGDescribe("Sysctls [LinuxOnly] [NodeConformance]", func() {
|
||||
|
||||
/*
|
||||
Release: v1.21
|
||||
Testname: Sysctl, allow specified unsafe sysctls
|
||||
Description: Pod is created with kernel.shm_rmid_forced. Should allow unsafe sysctls that are specified.
|
||||
Testname: Sysctls, reject invalid sysctls
|
||||
Description: Pod is created with one valid and two invalid sysctls. Pod should not apply invalid sysctls.
|
||||
[LinuxOnly]: This test is marked as LinuxOnly since Windows does not support sysctls
|
||||
*/
|
||||
ginkgo.It("should support unsafe sysctls which are actually allowed [MinimumKubeletVersion:1.21]", func() {
|
||||
pod := testPod()
|
||||
pod.Spec.SecurityContext = &v1.PodSecurityContext{
|
||||
Sysctls: []v1.Sysctl{
|
||||
{
|
||||
Name: "kernel.shm_rmid_forced",
|
||||
Value: "1",
|
||||
},
|
||||
},
|
||||
}
|
||||
pod.Spec.Containers[0].Command = []string{"/bin/sysctl", "kernel.shm_rmid_forced"}
|
||||
|
||||
ginkgo.By("Creating a pod with the kernel.shm_rmid_forced sysctl")
|
||||
pod = podClient.Create(pod)
|
||||
|
||||
ginkgo.By("Watching for error events or started pod")
|
||||
// watch for events instead of termination of pod because the kubelet deletes
|
||||
// failed pods without running containers. This would create a race as the pod
|
||||
// might have already been deleted here.
|
||||
ev, err := f.PodClient().WaitForErrorEventOrSuccess(pod)
|
||||
framework.ExpectNoError(err)
|
||||
gomega.Expect(ev).To(gomega.BeNil())
|
||||
|
||||
ginkgo.By("Waiting for pod completion")
|
||||
err = e2epod.WaitForPodNoLongerRunningInNamespace(f.ClientSet, pod.Name, f.Namespace.Name)
|
||||
framework.ExpectNoError(err)
|
||||
pod, err = podClient.Get(context.TODO(), pod.Name, metav1.GetOptions{})
|
||||
framework.ExpectNoError(err)
|
||||
|
||||
ginkgo.By("Checking that the pod succeeded")
|
||||
framework.ExpectEqual(pod.Status.Phase, v1.PodSucceeded)
|
||||
|
||||
ginkgo.By("Getting logs from the pod")
|
||||
log, err := e2epod.GetPodLogs(f.ClientSet, f.Namespace.Name, pod.Name, pod.Spec.Containers[0].Name)
|
||||
framework.ExpectNoError(err)
|
||||
|
||||
ginkgo.By("Checking that the sysctl is actually updated")
|
||||
gomega.Expect(log).To(gomega.ContainSubstring("kernel.shm_rmid_forced = 1"))
|
||||
})
|
||||
|
||||
/*
|
||||
Release: v1.21
|
||||
Testname: Sysctls, reject invalid sysctls
|
||||
Description: Pod is created with one valid and two invalid sysctls. Pod should not apply invalid sysctls.
|
||||
[LinuxOnly]: This test is marked as LinuxOnly since Windows does not support sysctls
|
||||
*/
|
||||
framework.ConformanceIt("should reject invalid sysctls [MinimumKubeletVersion:1.21]", func() {
|
||||
pod := testPod()
|
||||
pod.Spec.SecurityContext = &v1.PodSecurityContext{
|
||||
@ -199,6 +153,7 @@ var _ = SIGDescribe("Sysctls [LinuxOnly] [NodeConformance]", func() {
|
||||
gomega.Expect(err.Error()).NotTo(gomega.ContainSubstring("kernel.shmmax"))
|
||||
})
|
||||
|
||||
// Pod is created with kernel.msgmax, an unsafe sysctl.
|
||||
ginkgo.It("should not launch unsafe, but not explicitly enabled sysctls on the node [MinimumKubeletVersion:1.21]", func() {
|
||||
pod := testPod()
|
||||
pod.Spec.SecurityContext = &v1.PodSecurityContext{
|
||||
@ -213,15 +168,9 @@ var _ = SIGDescribe("Sysctls [LinuxOnly] [NodeConformance]", func() {
|
||||
ginkgo.By("Creating a pod with an ignorelisted, but not allowlisted sysctl on the node")
|
||||
pod = podClient.Create(pod)
|
||||
|
||||
ginkgo.By("Watching for error events or started pod")
|
||||
// watch for events instead of termination of pod because the kubelet deletes
|
||||
// failed pods without running containers. This would create a race as the pod
|
||||
// might have already been deleted here.
|
||||
ev, err := f.PodClient().WaitForErrorEventOrSuccess(pod)
|
||||
ginkgo.By("Wait for pod failed reason")
|
||||
// watch for pod failed reason instead of termination of pod
|
||||
err := e2epod.WaitForPodFailedReason(f.ClientSet, pod, "SysctlForbidden", f.Timeouts.PodStart)
|
||||
framework.ExpectNoError(err)
|
||||
|
||||
ginkgo.By("Checking that the pod was rejected")
|
||||
gomega.Expect(ev).ToNot(gomega.BeNil())
|
||||
framework.ExpectEqual(ev.Reason, "SysctlForbidden")
|
||||
})
|
||||
})
|
||||
|
@ -547,3 +547,21 @@ func WaitForPodContainerToFail(c clientset.Interface, namespace, podName string,
|
||||
func WaitForPodContainerStarted(c clientset.Interface, namespace, podName string, containerIndex int, timeout time.Duration) error {
|
||||
return wait.PollImmediate(poll, timeout, podContainerStarted(c, namespace, podName, containerIndex))
|
||||
}
|
||||
|
||||
// WaitForPodFailedReason wait for pod failed reason in status, for example "SysctlForbidden".
|
||||
func WaitForPodFailedReason(c clientset.Interface, pod *v1.Pod, reason string, timeout time.Duration) error {
|
||||
waitErr := wait.PollImmediate(poll, timeout, func() (bool, error) {
|
||||
pod, err := c.CoreV1().Pods(pod.Namespace).Get(context.TODO(), pod.Name, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
if pod.Status.Reason == reason {
|
||||
return true, nil
|
||||
}
|
||||
return false, nil
|
||||
})
|
||||
if waitErr != nil {
|
||||
return fmt.Errorf("error waiting for pod SysctlForbidden status: %v", waitErr)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user