diff --git a/pkg/kubelet/server/BUILD b/pkg/kubelet/server/BUILD index 87ea8f01d82..43d943603dd 100644 --- a/pkg/kubelet/server/BUILD +++ b/pkg/kubelet/server/BUILD @@ -93,6 +93,7 @@ go_test( "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", "//vendor/golang.org/x/net/websocket:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/pkg/kubelet/server/server_test.go b/pkg/kubelet/server/server_test.go index 85b1bc2586e..abc2c4547f6 100644 --- a/pkg/kubelet/server/server_test.go +++ b/pkg/kubelet/server/server_test.go @@ -51,6 +51,7 @@ import ( runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" api "k8s.io/kubernetes/pkg/apis/core" statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + "k8s.io/utils/pointer" // Do some initialization to decode the query parameters correctly. _ "k8s.io/kubernetes/pkg/apis/core/install" @@ -948,110 +949,45 @@ func setGetContainerLogsFunc(fw *serverTestFramework, t *testing.T, expectedPodN } } -// TODO: I really want to be a table driven test func TestContainerLogs(t *testing.T) { fw := newServerTest() defer fw.testHTTPServer.Close() - output := "foo bar" - podNamespace := "other" - podName := "foo" - expectedPodName := getPodName(podName, podNamespace) - expectedContainerName := "baz" - setPodByNameFunc(fw, podNamespace, podName, expectedContainerName) - setGetContainerLogsFunc(fw, t, expectedPodName, expectedContainerName, &v1.PodLogOptions{}, output) - resp, err := http.Get(fw.testHTTPServer.URL + "/containerLogs/" + podNamespace + "/" + podName + "/" + expectedContainerName) - if err != nil { - t.Errorf("Got error GETing: %v", err) - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Errorf("Error reading container logs: %v", err) + tests := map[string]struct { + query string + podLogOption *v1.PodLogOptions + }{ + "without tail": {"", &v1.PodLogOptions{}}, + "with tail": {"?tailLines=5", &v1.PodLogOptions{TailLines: pointer.Int64Ptr(5)}}, + "with legacy tail": {"?tail=5", &v1.PodLogOptions{TailLines: pointer.Int64Ptr(5)}}, + "with tail all": {"?tail=all", &v1.PodLogOptions{}}, + "with follow": {"?follow=1", &v1.PodLogOptions{Follow: true}}, } - result := string(body) - if result != output { - t.Errorf("Expected: '%v', got: '%v'", output, result) - } -} -func TestContainerLogsWithTail(t *testing.T) { - fw := newServerTest() - defer fw.testHTTPServer.Close() - output := "foo bar" - podNamespace := "other" - podName := "foo" - expectedPodName := getPodName(podName, podNamespace) - expectedContainerName := "baz" - expectedTail := int64(5) - setPodByNameFunc(fw, podNamespace, podName, expectedContainerName) - setGetContainerLogsFunc(fw, t, expectedPodName, expectedContainerName, &v1.PodLogOptions{TailLines: &expectedTail}, output) - resp, err := http.Get(fw.testHTTPServer.URL + "/containerLogs/" + podNamespace + "/" + podName + "/" + expectedContainerName + "?tailLines=5") - if err != nil { - t.Errorf("Got error GETing: %v", err) - } - defer resp.Body.Close() + for desc, test := range tests { + t.Run(desc, func(t *testing.T) { + output := "foo bar" + podNamespace := "other" + podName := "foo" + expectedPodName := getPodName(podName, podNamespace) + expectedContainerName := "baz" + setPodByNameFunc(fw, podNamespace, podName, expectedContainerName) + setGetContainerLogsFunc(fw, t, expectedPodName, expectedContainerName, test.podLogOption, output) + resp, err := http.Get(fw.testHTTPServer.URL + "/containerLogs/" + podNamespace + "/" + podName + "/" + expectedContainerName + test.query) + if err != nil { + t.Errorf("Got error GETing: %v", err) + } + defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Errorf("Error reading container logs: %v", err) - } - result := string(body) - if result != output { - t.Errorf("Expected: '%v', got: '%v'", output, result) - } -} - -func TestContainerLogsWithLegacyTail(t *testing.T) { - fw := newServerTest() - defer fw.testHTTPServer.Close() - output := "foo bar" - podNamespace := "other" - podName := "foo" - expectedPodName := getPodName(podName, podNamespace) - expectedContainerName := "baz" - expectedTail := int64(5) - setPodByNameFunc(fw, podNamespace, podName, expectedContainerName) - setGetContainerLogsFunc(fw, t, expectedPodName, expectedContainerName, &v1.PodLogOptions{TailLines: &expectedTail}, output) - resp, err := http.Get(fw.testHTTPServer.URL + "/containerLogs/" + podNamespace + "/" + podName + "/" + expectedContainerName + "?tail=5") - if err != nil { - t.Errorf("Got error GETing: %v", err) - } - defer resp.Body.Close() - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Errorf("Error reading container logs: %v", err) - } - result := string(body) - if result != output { - t.Errorf("Expected: '%v', got: '%v'", output, result) - } -} - -func TestContainerLogsWithTailAll(t *testing.T) { - fw := newServerTest() - defer fw.testHTTPServer.Close() - output := "foo bar" - podNamespace := "other" - podName := "foo" - expectedPodName := getPodName(podName, podNamespace) - expectedContainerName := "baz" - setPodByNameFunc(fw, podNamespace, podName, expectedContainerName) - setGetContainerLogsFunc(fw, t, expectedPodName, expectedContainerName, &v1.PodLogOptions{}, output) - resp, err := http.Get(fw.testHTTPServer.URL + "/containerLogs/" + podNamespace + "/" + podName + "/" + expectedContainerName + "?tail=all") - if err != nil { - t.Errorf("Got error GETing: %v", err) - } - defer resp.Body.Close() - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Errorf("Error reading container logs: %v", err) - } - result := string(body) - if result != output { - t.Errorf("Expected: '%v', got: '%v'", output, result) + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + t.Errorf("Error reading container logs: %v", err) + } + result := string(body) + if result != output { + t.Errorf("Expected: '%v', got: '%v'", output, result) + } + }) } } @@ -1075,32 +1011,6 @@ func TestContainerLogsWithInvalidTail(t *testing.T) { } } -func TestContainerLogsWithFollow(t *testing.T) { - fw := newServerTest() - defer fw.testHTTPServer.Close() - output := "foo bar" - podNamespace := "other" - podName := "foo" - expectedPodName := getPodName(podName, podNamespace) - expectedContainerName := "baz" - setPodByNameFunc(fw, podNamespace, podName, expectedContainerName) - setGetContainerLogsFunc(fw, t, expectedPodName, expectedContainerName, &v1.PodLogOptions{Follow: true}, output) - resp, err := http.Get(fw.testHTTPServer.URL + "/containerLogs/" + podNamespace + "/" + podName + "/" + expectedContainerName + "?follow=1") - if err != nil { - t.Errorf("Got error GETing: %v", err) - } - defer resp.Body.Close() - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Errorf("Error reading container logs: %v", err) - } - result := string(body) - if result != output { - t.Errorf("Expected: '%v', got: '%v'", output, result) - } -} - func TestServeExecInContainerIdleTimeout(t *testing.T) { ss, err := newTestStreamingServer(100 * time.Millisecond) require.NoError(t, err)