mirror of
https://github.com/optim-enterprises-bv/kubernetes.git
synced 2025-11-02 03:08:15 +00:00
Merge pull request #5265 from ddysher/kubelet-post-status
kubelet post node status to master
This commit is contained in:
@@ -33,6 +33,8 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/resource"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/client/record"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/cadvisor"
|
||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/dockertools"
|
||||
@@ -50,18 +52,26 @@ func init() {
|
||||
util.ReallyCrash = true
|
||||
}
|
||||
|
||||
// TODO(vmarmol): Consider compacting these return types of handling this better.
|
||||
func newTestKubelet(t *testing.T) (*Kubelet, *dockertools.FakeDockerClient, *sync.WaitGroup, *cadvisor.Mock) {
|
||||
fakeDocker := &dockertools.FakeDockerClient{
|
||||
RemovedImages: util.StringSet{},
|
||||
}
|
||||
type TestKubelet struct {
|
||||
kubelet *Kubelet
|
||||
fakeDocker *dockertools.FakeDockerClient
|
||||
fakeCadvisor *cadvisor.Mock
|
||||
fakeKubeClient *client.Fake
|
||||
waitGroup *sync.WaitGroup
|
||||
}
|
||||
|
||||
func newTestKubelet(t *testing.T) *TestKubelet {
|
||||
fakeDocker := &dockertools.FakeDockerClient{RemovedImages: util.StringSet{}}
|
||||
fakeDockerCache := dockertools.NewFakeDockerCache(fakeDocker)
|
||||
recorder := &record.FakeRecorder{}
|
||||
fakeRecorder := &record.FakeRecorder{}
|
||||
fakeKubeClient := &client.Fake{}
|
||||
|
||||
kubelet := &Kubelet{}
|
||||
kubelet.dockerClient = fakeDocker
|
||||
kubelet.dockerCache = fakeDockerCache
|
||||
kubelet.kubeClient = fakeKubeClient
|
||||
kubelet.dockerPuller = &dockertools.FakeDockerPuller{}
|
||||
kubelet.hostname = "testnode"
|
||||
if tempDir, err := ioutil.TempDir("/tmp", "kubelet_test."); err != nil {
|
||||
t.Fatalf("can't make a temp rootdir: %v", err)
|
||||
} else {
|
||||
@@ -78,12 +88,12 @@ func newTestKubelet(t *testing.T) (*Kubelet, *dockertools.FakeDockerClient, *syn
|
||||
waitGroup.Done()
|
||||
return err
|
||||
},
|
||||
recorder)
|
||||
fakeRecorder)
|
||||
kubelet.sourcesReady = func() bool { return true }
|
||||
kubelet.masterServiceNamespace = api.NamespaceDefault
|
||||
kubelet.serviceLister = testServiceLister{}
|
||||
kubelet.readiness = newReadinessStates()
|
||||
kubelet.recorder = recorder
|
||||
kubelet.recorder = fakeRecorder
|
||||
kubelet.podStatuses = map[string]api.PodStatus{}
|
||||
if err := kubelet.setupDataDirs(); err != nil {
|
||||
t.Fatalf("can't initialize kubelet data dirs: %v", err)
|
||||
@@ -91,7 +101,7 @@ func newTestKubelet(t *testing.T) (*Kubelet, *dockertools.FakeDockerClient, *syn
|
||||
mockCadvisor := &cadvisor.Mock{}
|
||||
kubelet.cadvisor = mockCadvisor
|
||||
|
||||
return kubelet, fakeDocker, waitGroup, mockCadvisor
|
||||
return &TestKubelet{kubelet, fakeDocker, mockCadvisor, fakeKubeClient, waitGroup}
|
||||
}
|
||||
|
||||
func verifyCalls(t *testing.T, fakeDocker *dockertools.FakeDockerClient, calls []string) {
|
||||
@@ -143,7 +153,8 @@ func verifyBoolean(t *testing.T, expected, value bool) {
|
||||
}
|
||||
|
||||
func TestKubeletDirs(t *testing.T) {
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
root := kubelet.rootDirectory
|
||||
|
||||
var exp, got string
|
||||
@@ -204,7 +215,8 @@ func TestKubeletDirs(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestKubeletDirsCompat(t *testing.T) {
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
root := kubelet.rootDirectory
|
||||
if err := os.MkdirAll(root, 0750); err != nil {
|
||||
t.Fatalf("can't mkdir(%q): %s", root, err)
|
||||
@@ -310,7 +322,8 @@ func TestKillContainerWithError(t *testing.T) {
|
||||
Err: fmt.Errorf("sample error"),
|
||||
ContainerList: append([]docker.APIContainers{}, containers...),
|
||||
}
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
for _, c := range fakeDocker.ContainerList {
|
||||
kubelet.readiness.set(c.ID, true)
|
||||
}
|
||||
@@ -341,7 +354,9 @@ func TestKillContainer(t *testing.T) {
|
||||
Names: []string{"/k8s_bar_qux_5678_42"},
|
||||
},
|
||||
}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
fakeDocker.ContainerList = append([]docker.APIContainers{}, containers...)
|
||||
fakeDocker.Container = &docker.Container{
|
||||
Name: "foobar",
|
||||
@@ -394,7 +409,11 @@ func (cr *channelReader) GetList() [][]api.BoundPod {
|
||||
var emptyPodUIDs map[types.UID]metrics.SyncPodType
|
||||
|
||||
func TestSyncPodsDoesNothing(t *testing.T) {
|
||||
kubelet, fakeDocker, waitGroup, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
waitGroup := testKubelet.waitGroup
|
||||
|
||||
container := api.Container{Name: "bar"}
|
||||
fakeDocker.ContainerList = []docker.APIContainers{
|
||||
{
|
||||
@@ -432,7 +451,10 @@ func TestSyncPodsDoesNothing(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodsWithTerminationLog(t *testing.T) {
|
||||
kubelet, fakeDocker, waitGroup, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
waitGroup := testKubelet.waitGroup
|
||||
container := api.Container{
|
||||
Name: "bar",
|
||||
TerminationMessagePath: "/dev/somepath",
|
||||
@@ -481,7 +503,10 @@ func matchString(t *testing.T, pattern, str string) bool {
|
||||
}
|
||||
|
||||
func TestSyncPodsCreatesNetAndContainer(t *testing.T) {
|
||||
kubelet, fakeDocker, waitGroup, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
waitGroup := testKubelet.waitGroup
|
||||
kubelet.podInfraContainerImage = "custom_image_name"
|
||||
fakeDocker.ContainerList = []docker.APIContainers{}
|
||||
kubelet.pods = []api.BoundPod{
|
||||
@@ -529,7 +554,10 @@ func TestSyncPodsCreatesNetAndContainer(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodsCreatesNetAndContainerPullsImage(t *testing.T) {
|
||||
kubelet, fakeDocker, waitGroup, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
waitGroup := testKubelet.waitGroup
|
||||
puller := kubelet.dockerPuller.(*dockertools.FakeDockerPuller)
|
||||
puller.HasImages = []string{}
|
||||
kubelet.podInfraContainerImage = "custom_image_name"
|
||||
@@ -573,7 +601,10 @@ func TestSyncPodsCreatesNetAndContainerPullsImage(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodsWithPodInfraCreatesContainer(t *testing.T) {
|
||||
kubelet, fakeDocker, waitGroup, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
waitGroup := testKubelet.waitGroup
|
||||
fakeDocker.ContainerList = []docker.APIContainers{
|
||||
{
|
||||
// pod infra container
|
||||
@@ -614,7 +645,10 @@ func TestSyncPodsWithPodInfraCreatesContainer(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodsWithPodInfraCreatesContainerCallsHandler(t *testing.T) {
|
||||
kubelet, fakeDocker, waitGroup, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
waitGroup := testKubelet.waitGroup
|
||||
fakeHttp := fakeHTTP{}
|
||||
kubelet.httpClient = &fakeHttp
|
||||
fakeDocker.ContainerList = []docker.APIContainers{
|
||||
@@ -671,7 +705,10 @@ func TestSyncPodsWithPodInfraCreatesContainerCallsHandler(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodsDeletesWithNoPodInfraContainer(t *testing.T) {
|
||||
kubelet, fakeDocker, waitGroup, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
waitGroup := testKubelet.waitGroup
|
||||
fakeDocker.ContainerList = []docker.APIContainers{
|
||||
{
|
||||
// format is // k8s_<container-id>_<pod-fullname>_<pod-uid>
|
||||
@@ -717,7 +754,9 @@ func TestSyncPodsDeletesWithNoPodInfraContainer(t *testing.T) {
|
||||
|
||||
func TestSyncPodsDeletesWhenSourcesAreReady(t *testing.T) {
|
||||
ready := false
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.sourcesReady = func() bool { return ready }
|
||||
|
||||
fakeDocker.ContainerList = []docker.APIContainers{
|
||||
@@ -759,7 +798,9 @@ func TestSyncPodsDeletesWhenSourcesAreReady(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodsDeletes(t *testing.T) {
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
fakeDocker.ContainerList = []docker.APIContainers{
|
||||
{
|
||||
// the k8s prefix is required for the kubelet to manage the container
|
||||
@@ -797,7 +838,9 @@ func TestSyncPodsDeletes(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodDeletesDuplicate(t *testing.T) {
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
dockerContainers := dockertools.DockerContainers{
|
||||
"1234": &docker.APIContainers{
|
||||
// the k8s prefix is required for the kubelet to manage the container
|
||||
@@ -841,7 +884,9 @@ func TestSyncPodDeletesDuplicate(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodBadHash(t *testing.T) {
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
dockerContainers := dockertools.DockerContainers{
|
||||
"1234": &docker.APIContainers{
|
||||
// the k8s prefix is required for the kubelet to manage the container
|
||||
@@ -889,7 +934,9 @@ func TestSyncPodBadHash(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodUnhealthy(t *testing.T) {
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
dockerContainers := dockertools.DockerContainers{
|
||||
"1234": &docker.APIContainers{
|
||||
// the k8s prefix is required for the kubelet to manage the container
|
||||
@@ -938,7 +985,8 @@ func TestSyncPodUnhealthy(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestMountExternalVolumes(t *testing.T) {
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
kubelet.volumePluginMgr.InitPlugins([]volume.Plugin{&volume.FakePlugin{"fake", nil}}, &volumeHost{kubelet})
|
||||
|
||||
pod := api.BoundPod{
|
||||
@@ -972,7 +1020,8 @@ func TestMountExternalVolumes(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetPodVolumesFromDisk(t *testing.T) {
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
plug := &volume.FakePlugin{"fake", nil}
|
||||
kubelet.volumePluginMgr.InitPlugins([]volume.Plugin{plug}, &volumeHost{kubelet})
|
||||
|
||||
@@ -1194,9 +1243,13 @@ func TestGetContainerInfo(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
kubelet, fakeDocker, _, mockCadvisor := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
mockCadvisor := testKubelet.fakeCadvisor
|
||||
cadvisorReq := &cadvisorApi.ContainerInfoRequest{}
|
||||
mockCadvisor.On("DockerContainer", containerID, cadvisorReq).Return(containerInfo, nil)
|
||||
|
||||
fakeDocker.ContainerList = []docker.APIContainers{
|
||||
{
|
||||
ID: containerID,
|
||||
@@ -1246,7 +1299,10 @@ func TestGetRootInfo(t *testing.T) {
|
||||
func TestGetContainerInfoWhenCadvisorFailed(t *testing.T) {
|
||||
containerID := "ab2cdf"
|
||||
|
||||
kubelet, fakeDocker, _, mockCadvisor := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
mockCadvisor := testKubelet.fakeCadvisor
|
||||
cadvisorApiFailure := fmt.Errorf("cAdvisor failure")
|
||||
containerInfo := cadvisorApi.ContainerInfo{}
|
||||
cadvisorReq := &cadvisorApi.ContainerInfoRequest{}
|
||||
@@ -1275,7 +1331,10 @@ func TestGetContainerInfoWhenCadvisorFailed(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetContainerInfoOnNonExistContainer(t *testing.T) {
|
||||
kubelet, fakeDocker, _, mockCadvisor := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
mockCadvisor := testKubelet.fakeCadvisor
|
||||
fakeDocker.ContainerList = []docker.APIContainers{}
|
||||
|
||||
stats, _ := kubelet.GetContainerInfo("qux", "", "foo", nil)
|
||||
@@ -1286,7 +1345,9 @@ func TestGetContainerInfoOnNonExistContainer(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetContainerInfoWhenDockerToolsFailed(t *testing.T) {
|
||||
kubelet, _, _, mockCadvisor := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
mockCadvisor := testKubelet.fakeCadvisor
|
||||
expectedErr := fmt.Errorf("List containers error")
|
||||
kubelet.dockerClient = &errorTestingDockerClient{listContainersError: expectedErr}
|
||||
|
||||
@@ -1304,7 +1365,9 @@ func TestGetContainerInfoWhenDockerToolsFailed(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetContainerInfoWithNoContainers(t *testing.T) {
|
||||
kubelet, _, _, mockCadvisor := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
mockCadvisor := testKubelet.fakeCadvisor
|
||||
|
||||
kubelet.dockerClient = &errorTestingDockerClient{listContainersError: nil}
|
||||
stats, err := kubelet.GetContainerInfo("qux_ns", "", "foo", nil)
|
||||
@@ -1321,7 +1384,9 @@ func TestGetContainerInfoWithNoContainers(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetContainerInfoWithNoMatchingContainers(t *testing.T) {
|
||||
kubelet, _, _, mockCadvisor := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
mockCadvisor := testKubelet.fakeCadvisor
|
||||
|
||||
containerList := []docker.APIContainers{
|
||||
{
|
||||
@@ -1385,7 +1450,9 @@ func (f *fakeContainerCommandRunner) PortForward(podInfraContainerID string, por
|
||||
|
||||
func TestRunInContainerNoSuchPod(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
fakeDocker.ContainerList = []docker.APIContainers{}
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
@@ -1407,7 +1474,9 @@ func TestRunInContainerNoSuchPod(t *testing.T) {
|
||||
|
||||
func TestRunInContainer(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
containerID := "abc1234"
|
||||
@@ -1447,7 +1516,9 @@ func TestRunInContainer(t *testing.T) {
|
||||
|
||||
func TestRunHandlerExec(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
containerID := "abc1234"
|
||||
@@ -1495,7 +1566,8 @@ func (f *fakeHTTP) Get(url string) (*http.Response, error) {
|
||||
func TestRunHandlerHttp(t *testing.T) {
|
||||
fakeHttp := fakeHTTP{}
|
||||
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
kubelet.httpClient = &fakeHttp
|
||||
|
||||
podName := "podFoo"
|
||||
@@ -1524,7 +1596,8 @@ func TestRunHandlerHttp(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestNewHandler(t *testing.T) {
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
handler := &api.Handler{
|
||||
HTTPGet: &api.HTTPGetAction{
|
||||
Host: "foo",
|
||||
@@ -1555,7 +1628,9 @@ func TestNewHandler(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodEventHandlerFails(t *testing.T) {
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.httpClient = &fakeHTTP{
|
||||
err: fmt.Errorf("test error"),
|
||||
}
|
||||
@@ -1780,7 +1855,9 @@ func TestKubeletGarbageCollection(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.maxContainerCount = 2
|
||||
fakeDocker.ContainerList = test.containers
|
||||
fakeDocker.ContainerMap = test.containerDetails
|
||||
@@ -1945,7 +2022,9 @@ func TestPurgeOldest(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.maxContainerCount = 5
|
||||
fakeDocker.ContainerMap = test.containerDetails
|
||||
kubelet.purgeOldest(test.ids)
|
||||
@@ -1956,7 +2035,10 @@ func TestPurgeOldest(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSyncPodsWithPullPolicy(t *testing.T) {
|
||||
kubelet, fakeDocker, waitGroup, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
waitGroup := testKubelet.waitGroup
|
||||
puller := kubelet.dockerPuller.(*dockertools.FakeDockerPuller)
|
||||
puller.HasImages = []string{"existing_one", "want:latest"}
|
||||
kubelet.podInfraContainerImage = "custom_image_name"
|
||||
@@ -2298,7 +2380,8 @@ func TestMakeEnvironmentVariables(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
kl, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kl := testKubelet.kubelet
|
||||
kl.masterServiceNamespace = tc.masterServiceNamespace
|
||||
if tc.nilLister {
|
||||
kl.serviceLister = nil
|
||||
@@ -2735,7 +2818,9 @@ func TestGetPodReadyCondition(t *testing.T) {
|
||||
|
||||
func TestExecInContainerNoSuchPod(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
fakeDocker.ContainerList = []docker.APIContainers{}
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
@@ -2762,7 +2847,9 @@ func TestExecInContainerNoSuchPod(t *testing.T) {
|
||||
|
||||
func TestExecInContainerNoSuchContainer(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
podName := "podFoo"
|
||||
@@ -2814,7 +2901,9 @@ func (f *fakeReadWriteCloser) Close() error {
|
||||
|
||||
func TestExecInContainer(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
podName := "podFoo"
|
||||
@@ -2872,7 +2961,9 @@ func TestExecInContainer(t *testing.T) {
|
||||
|
||||
func TestPortForwardNoSuchPod(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
fakeDocker.ContainerList = []docker.APIContainers{}
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
@@ -2896,7 +2987,9 @@ func TestPortForwardNoSuchPod(t *testing.T) {
|
||||
|
||||
func TestPortForwardNoSuchContainer(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
podName := "podFoo"
|
||||
@@ -2930,7 +3023,9 @@ func TestPortForwardNoSuchContainer(t *testing.T) {
|
||||
|
||||
func TestPortForward(t *testing.T) {
|
||||
fakeCommandRunner := fakeContainerCommandRunner{}
|
||||
kubelet, fakeDocker, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
fakeDocker := testKubelet.fakeDocker
|
||||
kubelet.runner = &fakeCommandRunner
|
||||
|
||||
podName := "podFoo"
|
||||
@@ -3003,7 +3098,8 @@ func TestGetHostPortConflicts(t *testing.T) {
|
||||
|
||||
// Tests that we handle port conflicts correctly by setting the failed status in status map.
|
||||
func TestHandlePortConflicts(t *testing.T) {
|
||||
kl, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kl := testKubelet.kubelet
|
||||
spec := api.PodSpec{Containers: []api.Container{{Ports: []api.ContainerPort{{HostPort: 80}}}}}
|
||||
pods := []api.BoundPod{
|
||||
{
|
||||
@@ -3054,7 +3150,8 @@ func TestHandlePortConflicts(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestPurgingObsoleteStatusMapEntries(t *testing.T) {
|
||||
kl, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kl := testKubelet.kubelet
|
||||
pods := []api.BoundPod{
|
||||
{Spec: api.PodSpec{Containers: []api.Container{{Ports: []api.ContainerPort{{HostPort: 80}}}}}},
|
||||
{Spec: api.PodSpec{Containers: []api.Container{{Ports: []api.ContainerPort{{HostPort: 80}}}}}},
|
||||
@@ -3072,7 +3169,8 @@ func TestPurgingObsoleteStatusMapEntries(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestValidatePodStatus(t *testing.T) {
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
testCases := []struct {
|
||||
podPhase api.PodPhase
|
||||
success bool
|
||||
@@ -3097,7 +3195,8 @@ func TestValidatePodStatus(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestValidateContainerStatus(t *testing.T) {
|
||||
kubelet, _, _, _ := newTestKubelet(t)
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
containerName := "x"
|
||||
testCases := []struct {
|
||||
podInfo api.PodInfo
|
||||
@@ -3135,3 +3234,143 @@ func TestValidateContainerStatus(t *testing.T) {
|
||||
t.Errorf("expected error with invalid container name")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateNewNodeStatus(t *testing.T) {
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
kubeClient := testKubelet.fakeKubeClient
|
||||
mockCadvisor := testKubelet.fakeCadvisor
|
||||
kubeClient.MinionsList = api.NodeList{Items: []api.Node{
|
||||
{ObjectMeta: api.ObjectMeta{Name: "testnode"}},
|
||||
}}
|
||||
machineInfo := &cadvisorApi.MachineInfo{MachineID: "123", SystemUUID: "abc", NumCores: 2, MemoryCapacity: 1024}
|
||||
mockCadvisor.On("MachineInfo").Return(machineInfo, nil)
|
||||
expectedNode := &api.Node{
|
||||
ObjectMeta: api.ObjectMeta{Name: "testnode"},
|
||||
Spec: api.NodeSpec{
|
||||
Capacity: api.ResourceList{
|
||||
api.ResourceCPU: *resource.NewMilliQuantity(2000, resource.DecimalSI),
|
||||
api.ResourceMemory: *resource.NewQuantity(1024, resource.BinarySI),
|
||||
},
|
||||
},
|
||||
Status: api.NodeStatus{
|
||||
Conditions: []api.NodeCondition{
|
||||
{
|
||||
Type: api.NodeReady,
|
||||
Status: api.ConditionFull,
|
||||
Reason: fmt.Sprintf("kubelet is posting ready status"),
|
||||
LastProbeTime: util.Time{},
|
||||
},
|
||||
},
|
||||
NodeInfo: api.NodeSystemInfo{
|
||||
MachineID: "123",
|
||||
SystemUUID: "abc",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if err := kubelet.updateNodeStatus(); err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
if len(kubeClient.Actions) != 2 {
|
||||
t.Errorf("unexpected actions: %v", kubeClient.Actions)
|
||||
}
|
||||
updatedNode, ok := kubeClient.Actions[1].Value.(*api.Node)
|
||||
if !ok {
|
||||
t.Errorf("unexpected object type")
|
||||
}
|
||||
if updatedNode.Status.Conditions[0].LastProbeTime.IsZero() {
|
||||
t.Errorf("unexpected zero last probe timestamp")
|
||||
}
|
||||
updatedNode.Status.Conditions[0].LastProbeTime = util.Time{}
|
||||
if !reflect.DeepEqual(expectedNode, updatedNode) {
|
||||
t.Errorf("expected \n%v\n, got \n%v", expectedNode, updatedNode)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateExistingNodeStatus(t *testing.T) {
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
kubeClient := testKubelet.fakeKubeClient
|
||||
mockCadvisor := testKubelet.fakeCadvisor
|
||||
kubeClient.MinionsList = api.NodeList{Items: []api.Node{
|
||||
{
|
||||
ObjectMeta: api.ObjectMeta{Name: "testnode"},
|
||||
Spec: api.NodeSpec{
|
||||
Capacity: api.ResourceList{
|
||||
api.ResourceCPU: *resource.NewMilliQuantity(3000, resource.DecimalSI),
|
||||
api.ResourceMemory: *resource.NewQuantity(2048, resource.BinarySI),
|
||||
},
|
||||
},
|
||||
Status: api.NodeStatus{
|
||||
Conditions: []api.NodeCondition{
|
||||
{
|
||||
Type: api.NodeReady,
|
||||
Status: api.ConditionFull,
|
||||
Reason: fmt.Sprintf("kubelet is posting ready status"),
|
||||
LastProbeTime: util.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}}
|
||||
machineInfo := &cadvisorApi.MachineInfo{MachineID: "123", SystemUUID: "abc", NumCores: 2, MemoryCapacity: 1024}
|
||||
mockCadvisor.On("MachineInfo").Return(machineInfo, nil)
|
||||
expectedNode := &api.Node{
|
||||
ObjectMeta: api.ObjectMeta{Name: "testnode"},
|
||||
Spec: api.NodeSpec{
|
||||
Capacity: api.ResourceList{
|
||||
api.ResourceCPU: *resource.NewMilliQuantity(2000, resource.DecimalSI),
|
||||
api.ResourceMemory: *resource.NewQuantity(1024, resource.BinarySI),
|
||||
},
|
||||
},
|
||||
Status: api.NodeStatus{
|
||||
Conditions: []api.NodeCondition{
|
||||
{
|
||||
Type: api.NodeReady,
|
||||
Status: api.ConditionFull,
|
||||
Reason: fmt.Sprintf("kubelet is posting ready status"),
|
||||
LastProbeTime: util.Time{}, // placeholder
|
||||
},
|
||||
},
|
||||
NodeInfo: api.NodeSystemInfo{
|
||||
MachineID: "123",
|
||||
SystemUUID: "abc",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if err := kubelet.updateNodeStatus(); err != nil {
|
||||
t.Errorf("unexpected error: %v", err)
|
||||
}
|
||||
if len(kubeClient.Actions) != 2 {
|
||||
t.Errorf("unexpected actions: %v", kubeClient.Actions)
|
||||
}
|
||||
updatedNode, ok := kubeClient.Actions[1].Value.(*api.Node)
|
||||
if !ok {
|
||||
t.Errorf("unexpected object type")
|
||||
}
|
||||
if reflect.DeepEqual(updatedNode.Status.Conditions[0].LastProbeTime, util.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC)) {
|
||||
t.Errorf("expected \n%v\n, got \n%v", updatedNode.Status.Conditions[0].LastProbeTime,
|
||||
util.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC))
|
||||
}
|
||||
updatedNode.Status.Conditions[0].LastProbeTime = util.Time{}
|
||||
if !reflect.DeepEqual(expectedNode, updatedNode) {
|
||||
t.Errorf("expected \n%v\n, got \n%v", expectedNode, updatedNode)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateNodeStatusError(t *testing.T) {
|
||||
testKubelet := newTestKubelet(t)
|
||||
kubelet := testKubelet.kubelet
|
||||
kubeClient := testKubelet.fakeKubeClient
|
||||
// No matching node for the kubelet
|
||||
kubeClient.MinionsList = api.NodeList{Items: []api.Node{}}
|
||||
|
||||
if err := kubelet.updateNodeStatus(); err == nil {
|
||||
t.Errorf("unexpected non error: %v")
|
||||
}
|
||||
if len(kubeClient.Actions) != nodeStatusUpdateRetry {
|
||||
t.Errorf("unexpected actions: %v", kubeClient.Actions)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user