Merge pull request #90135 from claudiubelu/tests/subpath-retry-exec

tests: Retries exec after container restart due to liveness
This commit is contained in:
Kubernetes Prow Robot 2020-05-02 06:02:25 -07:00 committed by GitHub
commit e01f553ddd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -44,37 +44,21 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
Description: Create a Pod with environment variables. Environment variables defined using previously defined environment variables MUST expand to proper values.
*/
framework.ConformanceIt("should allow composing env vars into new env vars [NodeConformance]", func() {
podName := "var-expansion-" + string(uuid.NewUUID())
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
envVars := []v1.EnvVar{
{
Name: "FOO",
Value: "foo-value",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "dapi-container",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"sh", "-c", "env"},
Env: []v1.EnvVar{
{
Name: "FOO",
Value: "foo-value",
},
{
Name: "BAR",
Value: "bar-value",
},
{
Name: "FOOBAR",
Value: "$(FOO);;$(BAR)",
},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
{
Name: "BAR",
Value: "bar-value",
},
{
Name: "FOOBAR",
Value: "$(FOO);;$(BAR)",
},
}
pod := newPod([]string{"sh", "-c", "env"}, envVars, nil, nil)
f.TestContainerOutput("env composition", pod, 0, []string{
"FOO=foo-value",
@ -89,29 +73,13 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
Description: Create a Pod with environment variables and container command using them. Container command using the defined environment variables MUST expand to proper values.
*/
framework.ConformanceIt("should allow substituting values in a container's command [NodeConformance]", func() {
podName := "var-expansion-" + string(uuid.NewUUID())
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "dapi-container",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"sh", "-c", "TEST_VAR=wrong echo \"$(TEST_VAR)\""},
Env: []v1.EnvVar{
{
Name: "TEST_VAR",
Value: "test-value",
},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
envVars := []v1.EnvVar{
{
Name: "TEST_VAR",
Value: "test-value",
},
}
pod := newPod([]string{"sh", "-c", "TEST_VAR=wrong echo \"$(TEST_VAR)\""}, envVars, nil, nil)
f.TestContainerOutput("substitution in container's command", pod, 0, []string{
"test-value",
@ -124,30 +92,14 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
Description: Create a Pod with environment variables and container command arguments using them. Container command arguments using the defined environment variables MUST expand to proper values.
*/
framework.ConformanceIt("should allow substituting values in a container's args [NodeConformance]", func() {
podName := "var-expansion-" + string(uuid.NewUUID())
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "dapi-container",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"sh", "-c"},
Args: []string{"TEST_VAR=wrong echo \"$(TEST_VAR)\""},
Env: []v1.EnvVar{
{
Name: "TEST_VAR",
Value: "test-value",
},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
envVars := []v1.EnvVar{
{
Name: "TEST_VAR",
Value: "test-value",
},
}
pod := newPod([]string{"sh", "-c"}, envVars, nil, nil)
pod.Spec.Containers[0].Args = []string{"TEST_VAR=wrong echo \"$(TEST_VAR)\""}
f.TestContainerOutput("substitution in container's args", pod, 0, []string{
"test-value",
@ -160,48 +112,34 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
Description: Make sure a container's subpath can be set using an expansion of environment variables.
*/
framework.ConformanceIt("should allow substituting values in a volume subpath [sig-storage]", func() {
podName := "var-expansion-" + string(uuid.NewUUID())
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
envVars := []v1.EnvVar{
{
Name: "POD_NAME",
Value: "foo",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "dapi-container",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"sh", "-c", "test -d /testcontainer/" + podName + ";echo $?"},
Env: []v1.EnvVar{
{
Name: "POD_NAME",
Value: podName,
},
},
VolumeMounts: []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/logscontainer",
SubPathExpr: "$(POD_NAME)",
},
{
Name: "workdir1",
MountPath: "/testcontainer",
},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
Volumes: []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
mounts := []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/logscontainer",
SubPathExpr: "$(POD_NAME)",
},
{
Name: "workdir1",
MountPath: "/testcontainer",
},
}
volumes := []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
pod := newPod([]string{}, envVars, mounts, volumes)
envVars[0].Value = pod.ObjectMeta.Name
pod.Spec.Containers[0].Command = []string{"sh", "-c", "test -d /testcontainer/" + pod.ObjectMeta.Name + ";echo $?"}
f.TestContainerOutput("substitution in volume subpath", pod, 0, []string{
"0",
@ -215,43 +153,28 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
*/
framework.ConformanceIt("should fail substituting values in a volume subpath with backticks [sig-storage][Slow]", func() {
podName := "var-expansion-" + string(uuid.NewUUID())
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
envVars := []v1.EnvVar{
{
Name: "POD_NAME",
Value: "..",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "dapi-container",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Env: []v1.EnvVar{
{
Name: "POD_NAME",
Value: "..",
},
},
VolumeMounts: []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/logscontainer",
SubPathExpr: "$(POD_NAME)",
},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
Volumes: []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
mounts := []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/logscontainer",
SubPathExpr: "$(POD_NAME)",
},
}
volumes := []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
pod := newPod(nil, envVars, mounts, volumes)
// Pod should fail
testPodFailSubpath(f, pod)
@ -264,43 +187,28 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
*/
framework.ConformanceIt("should fail substituting values in a volume subpath with absolute path [sig-storage][Slow]", func() {
podName := "var-expansion-" + string(uuid.NewUUID())
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
envVars := []v1.EnvVar{
{
Name: "POD_NAME",
Value: "/tmp",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "dapi-container",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Env: []v1.EnvVar{
{
Name: "POD_NAME",
Value: "/tmp",
},
},
VolumeMounts: []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/logscontainer",
SubPathExpr: "$(POD_NAME)",
},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
Volumes: []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
mounts := []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/logscontainer",
SubPathExpr: "$(POD_NAME)",
},
}
volumes := []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
pod := newPod(nil, envVars, mounts, volumes)
// Pod should fail
testPodFailSubpath(f, pod)
@ -313,58 +221,42 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
*/
framework.ConformanceIt("should verify that a failing subpath expansion can be modified during the lifecycle of a container [sig-storage][Slow]", func() {
podName := "var-expansion-" + string(uuid.NewUUID())
containerName := "dapi-container"
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
Annotations: map[string]string{"notmysubpath": "mypath"},
envVars := []v1.EnvVar{
{
Name: "POD_NAME",
Value: "foo",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: containerName,
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"sh", "-c", "tail -f /dev/null"},
Env: []v1.EnvVar{
{
Name: "POD_NAME",
Value: "foo",
},
{
Name: "ANNOTATION",
ValueFrom: &v1.EnvVarSource{
FieldRef: &v1.ObjectFieldSelector{
APIVersion: "v1",
FieldPath: "metadata.annotations['mysubpath']",
},
},
},
},
VolumeMounts: []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/subpath_mount",
SubPathExpr: "$(ANNOTATION)/$(POD_NAME)",
},
{
Name: "workdir1",
MountPath: "/volume_mount",
},
},
},
},
Volumes: []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
{
Name: "ANNOTATION",
ValueFrom: &v1.EnvVarSource{
FieldRef: &v1.ObjectFieldSelector{
APIVersion: "v1",
FieldPath: "metadata.annotations['mysubpath']",
},
},
},
}
mounts := []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/subpath_mount",
SubPathExpr: "$(ANNOTATION)/$(POD_NAME)",
},
{
Name: "workdir1",
MountPath: "/volume_mount",
},
}
volumes := []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
pod := newPod([]string{"sh", "-c", "tail -f /dev/null"}, envVars, mounts, volumes)
pod.ObjectMeta.Annotations = map[string]string{"notmysubpath": "mypath"}
ginkgo.By("creating the pod with failed condition")
var podClient *framework.PodClient = f.PodClient()
@ -374,7 +266,7 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
framework.ExpectError(err, "while waiting for pod to be running")
ginkgo.By("updating the pod")
podClient.Update(podName, func(pod *v1.Pod) {
podClient.Update(pod.ObjectMeta.Name, func(pod *v1.Pod) {
pod.ObjectMeta.Annotations = map[string]string{"mysubpath": "mypath"}
})
@ -398,59 +290,42 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
*/
framework.ConformanceIt("should succeed in writing subpaths in container [sig-storage][Slow]", func() {
podName := "var-expansion-" + string(uuid.NewUUID())
containerName := "dapi-container"
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
Annotations: map[string]string{"mysubpath": "mypath"},
envVars := []v1.EnvVar{
{
Name: "POD_NAME",
Value: "foo",
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: containerName,
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"sh", "-c", "tail -f /dev/null"},
Env: []v1.EnvVar{
{
Name: "POD_NAME",
Value: "foo",
},
{
Name: "ANNOTATION",
ValueFrom: &v1.EnvVarSource{
FieldRef: &v1.ObjectFieldSelector{
APIVersion: "v1",
FieldPath: "metadata.annotations['mysubpath']",
},
},
},
},
VolumeMounts: []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/subpath_mount",
SubPathExpr: "$(ANNOTATION)/$(POD_NAME)",
},
{
Name: "workdir1",
MountPath: "/volume_mount",
},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
Volumes: []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
{
Name: "ANNOTATION",
ValueFrom: &v1.EnvVarSource{
FieldRef: &v1.ObjectFieldSelector{
APIVersion: "v1",
FieldPath: "metadata.annotations['mysubpath']",
},
},
},
}
mounts := []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/subpath_mount",
SubPathExpr: "$(ANNOTATION)/$(POD_NAME)",
},
{
Name: "workdir1",
MountPath: "/volume_mount",
},
}
volumes := []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
pod := newPod([]string{"sh", "-c", "tail -f /dev/null"}, envVars, mounts, volumes)
pod.ObjectMeta.Annotations = map[string]string{"mysubpath": "mypath"}
ginkgo.By("creating the pod")
var podClient *framework.PodClient = f.PodClient()
@ -475,7 +350,7 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
}
ginkgo.By("updating the annotation value")
podClient.Update(podName, func(pod *v1.Pod) {
podClient.Update(pod.ObjectMeta.Name, func(pod *v1.Pod) {
pod.ObjectMeta.Annotations["mysubpath"] = "mynewpath"
})
@ -499,75 +374,54 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
*/
framework.ConformanceIt("should not change the subpath mount on a container restart if the environment variable changes [sig-storage][Slow]", func() {
suffix := string(uuid.NewUUID())
podName := fmt.Sprintf("var-expansion-%s", suffix)
containerName := "dapi-container"
pod := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
Annotations: map[string]string{"mysubpath": "foo"},
},
Spec: v1.PodSpec{
InitContainers: []v1.Container{
{
Name: fmt.Sprintf("init-volume-%s", suffix),
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"sh", "-c", "mkdir -p /volume_mount/foo; touch /volume_mount/foo/test.log"},
VolumeMounts: []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/subpath_mount",
},
{
Name: "workdir1",
MountPath: "/volume_mount",
},
},
},
},
Containers: []v1.Container{
{
Name: containerName,
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"/bin/sh", "-ec", "sleep 100000"},
Env: []v1.EnvVar{
{
Name: "POD_NAME",
ValueFrom: &v1.EnvVarSource{
FieldRef: &v1.ObjectFieldSelector{
APIVersion: "v1",
FieldPath: "metadata.annotations['mysubpath']",
},
},
},
},
VolumeMounts: []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/subpath_mount",
SubPathExpr: "$(POD_NAME)",
},
{
Name: "workdir1",
MountPath: "/volume_mount",
},
},
},
},
RestartPolicy: v1.RestartPolicyOnFailure,
Volumes: []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
envVars := []v1.EnvVar{
{
Name: "POD_NAME",
ValueFrom: &v1.EnvVarSource{
FieldRef: &v1.ObjectFieldSelector{
APIVersion: "v1",
FieldPath: "metadata.annotations['mysubpath']",
},
},
},
}
mounts := []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/subpath_mount",
},
{
Name: "workdir1",
MountPath: "/volume_mount",
},
}
subpathMounts := []v1.VolumeMount{
{
Name: "workdir1",
MountPath: "/subpath_mount",
SubPathExpr: "$(POD_NAME)",
},
{
Name: "workdir1",
MountPath: "/volume_mount",
},
}
volumes := []v1.Volume{
{
Name: "workdir1",
VolumeSource: v1.VolumeSource{
EmptyDir: &v1.EmptyDirVolumeSource{},
},
},
}
pod := newPod([]string{"/bin/sh", "-ec", "sleep 100000"}, envVars, subpathMounts, volumes)
pod.Spec.RestartPolicy = v1.RestartPolicyOnFailure
pod.ObjectMeta.Annotations = map[string]string{"mysubpath": "foo"}
sideContainerName := "side-container"
pod.Spec.Containers = append(pod.Spec.Containers, newContainer(sideContainerName, []string{"/bin/sh", "-ec", "sleep 100000"}, envVars, subpathMounts))
suffix := string(uuid.NewUUID())
pod.Spec.InitContainers = []v1.Container{newContainer(
fmt.Sprintf("init-volume-%s", suffix), []string{"sh", "-c", "mkdir -p /volume_mount/foo; touch /volume_mount/foo/test.log"}, nil, mounts)}
// Add liveness probe to subpath container
pod.Spec.Containers[0].LivenessProbe = &v1.Probe{
@ -593,7 +447,7 @@ var _ = framework.KubeDescribe("Variable Expansion", func() {
framework.ExpectNoError(err, "while waiting for pod to be running")
ginkgo.By("updating the pod")
podClient.Update(podName, func(pod *v1.Pod) {
podClient.Update(pod.ObjectMeta.Name, func(pod *v1.Pod) {
pod.ObjectMeta.Annotations = map[string]string{"mysubpath": "newsubpath"}
})
@ -660,9 +514,8 @@ func waitForPodContainerRestart(f *framework.Framework, pod *v1.Pod, volumeMount
// Fix liveness probe
ginkgo.By("Rewriting the file")
stdout, _, err = f.ExecShellInPodWithFullOutput(pod.Name, fmt.Sprintf("echo test-after > %v", volumeMount))
stdout = f.ExecShellInContainer(pod.Name, pod.Spec.Containers[1].Name, fmt.Sprintf("echo test-after > %v", volumeMount))
framework.Logf("Pod exec output: %v", stdout)
framework.ExpectNoError(err, "while rewriting the probe file")
// Wait for container restarts to stabilize
ginkgo.By("Waiting for container to stop restarting")
@ -693,3 +546,28 @@ func waitForPodContainerRestart(f *framework.Framework, pod *v1.Pod, volumeMount
})
framework.ExpectNoError(err, "while waiting for container to stabilize")
}
func newPod(command []string, envVars []v1.EnvVar, mounts []v1.VolumeMount, volumes []v1.Volume) *v1.Pod {
podName := "var-expansion-" + string(uuid.NewUUID())
return &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: podName,
Labels: map[string]string{"name": podName},
},
Spec: v1.PodSpec{
Containers: []v1.Container{newContainer("dapi-container", command, envVars, mounts)},
RestartPolicy: v1.RestartPolicyNever,
Volumes: volumes,
},
}
}
func newContainer(containerName string, command []string, envVars []v1.EnvVar, mounts []v1.VolumeMount) v1.Container {
return v1.Container{
Name: containerName,
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: command,
Env: envVars,
VolumeMounts: mounts,
}
}