Merge pull request #28517 from Random-Liu/better-image-pull-test

Automatic merge from submit-queue

Node E2E: Use waiting reason to figure out image pulling error.

Addresses https://github.com/kubernetes/kubernetes/pull/28323#issuecomment-230002158, using `Waiting` reason to check whether the image pulling failures as expected.

@yujuhong 

[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/.github/PULL_REQUEST_TEMPLATE.md?pixel)]()
pull/6/head
k8s-merge-robot 2016-07-07 19:36:25 -07:00 committed by GitHub
commit d6d846f4e5
1 changed files with 22 additions and 12 deletions

View File

@ -22,6 +22,7 @@ import (
"time"
"k8s.io/kubernetes/pkg/api"
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/test/e2e/framework"
@ -189,44 +190,44 @@ while true; do sleep 1; done
image string
secret bool
phase api.PodPhase
state ContainerState
waiting bool
}{
{
description: "should not be able to pull image from invalid registry",
image: "invalid.com/invalid/alpine:3.1",
phase: api.PodPending,
state: ContainerStateWaiting,
waiting: true,
},
{
description: "should not be able to pull non-existing image from gcr.io",
image: "gcr.io/google_containers/invalid-image:invalid-tag",
phase: api.PodPending,
state: ContainerStateWaiting,
waiting: true,
},
{
description: "should be able to pull image from gcr.io",
image: NoPullImageRegistry[pullTestAlpineWithBash],
phase: api.PodRunning,
state: ContainerStateRunning,
waiting: false,
},
{
description: "should be able to pull image from docker hub",
image: NoPullImageRegistry[pullTestAlpine],
phase: api.PodRunning,
state: ContainerStateRunning,
waiting: false,
},
{
description: "should not be able to pull from private registry without secret",
image: NoPullImageRegistry[pullTestAuthenticatedAlpine],
phase: api.PodPending,
state: ContainerStateWaiting,
waiting: true,
},
{
description: "should be able to pull from private registry with secret",
image: NoPullImageRegistry[pullTestAuthenticatedAlpine],
secret: true,
phase: api.PodRunning,
state: ContainerStateRunning,
waiting: false,
},
} {
testCase := testCase
@ -261,15 +262,24 @@ while true; do sleep 1; done
// pod phase first, and the expected pod phase is Pending, the container status may not
// even show up when we check it.
By("check the container state")
getState := func() (ContainerState, error) {
checkContainerState := func() (bool, error) {
status, err := container.GetStatus()
if err != nil {
return ContainerStateUnknown, err
return false, err
}
return GetContainerState(status.State), nil
if !testCase.waiting && status.State.Running != nil {
return true, nil
}
if testCase.waiting && status.State.Waiting != nil {
reason := status.State.Waiting.Reason
return reason == kubecontainer.ErrImagePull.Error() ||
reason == kubecontainer.ErrImagePullBackOff.Error(), nil
}
return false, nil
}
Eventually(getState, retryTimeout, pollInterval).Should(Equal(testCase.state))
Consistently(getState, consistentCheckTimeout, pollInterval).Should(Equal(testCase.state))
Eventually(checkContainerState, retryTimeout, pollInterval).Should(BeTrue())
Consistently(checkContainerState, consistentCheckTimeout, pollInterval).Should(BeTrue())
By("check the pod phase")
Expect(container.GetPhase()).To(Equal(testCase.phase))