diff --git a/pkg/kubelet/kubelet_server_journal.go b/pkg/kubelet/kubelet_server_journal.go index cd3a02649b2..82b137a544b 100644 --- a/pkg/kubelet/kubelet_server_journal.go +++ b/pkg/kubelet/kubelet_server_journal.go @@ -343,7 +343,7 @@ func copyFileLogs(ctx context.Context, w io.Writer, services []string) { } for _, service := range services { - heuristicsCopyFileLogs(ctx, w, service) + heuristicsCopyFileLogs(ctx, w, nodeLogDir, service) } } @@ -352,7 +352,7 @@ func copyFileLogs(ctx context.Context, w io.Writer, services []string) { // /var/log/service.log or // /var/log/service/service.log or // in that order stopping on first success. -func heuristicsCopyFileLogs(ctx context.Context, w io.Writer, service string) { +func heuristicsCopyFileLogs(ctx context.Context, w io.Writer, logDir, service string) { logFileNames := [3]string{ service, fmt.Sprintf("%s.log", service), @@ -362,7 +362,7 @@ func heuristicsCopyFileLogs(ctx context.Context, w io.Writer, service string) { var err error for _, logFileName := range logFileNames { var logFile string - logFile, err = securejoin.SecureJoin(nodeLogDir, logFileName) + logFile, err = securejoin.SecureJoin(logDir, logFileName) if err != nil { break } diff --git a/pkg/kubelet/kubelet_server_journal_test.go b/pkg/kubelet/kubelet_server_journal_test.go index 3625d0d6819..7e8c13c1f84 100644 --- a/pkg/kubelet/kubelet_server_journal_test.go +++ b/pkg/kubelet/kubelet_server_journal_test.go @@ -17,7 +17,11 @@ limitations under the License. package kubelet import ( + "bytes" + "context" "net/url" + "os" + "path/filepath" "reflect" "runtime" "strings" @@ -221,3 +225,64 @@ func Test_nodeLogQuery_validate(t *testing.T) { }) } } + +func Test_heuristicsCopyFileLogs(t *testing.T) { + ctx := context.TODO() + buf := &bytes.Buffer{} + + dir, err := os.MkdirTemp("", "logs") + if err != nil { + t.Fatal(err) + } + defer func() { _ = os.RemoveAll(dir) }() + + // Check missing logs + heuristicsCopyFileLogs(ctx, buf, dir, "service.log") + if !strings.Contains(buf.String(), "log not found for service.log") { + t.Fail() + } + buf.Reset() + + // Check missing service logs + heuristicsCopyFileLogs(ctx, buf, dir, "service") + if !strings.Contains(buf.String(), "log not found for service") { + t.Fail() + } + buf.Reset() + + // Check explicitly-named files + if err := os.WriteFile(filepath.Join(dir, "service.log"), []byte("valid logs"), 0o444); err != nil { + t.Fatal(err) + } + heuristicsCopyFileLogs(ctx, buf, dir, "service.log") + if buf.String() != "valid logs" { + t.Fail() + } + buf.Reset() + + // Check service logs + heuristicsCopyFileLogs(ctx, buf, dir, "service") + if buf.String() != "valid logs" { + t.Fail() + } + buf.Reset() + + // Check that a directory doesn't cause errors + if err := os.Mkdir(filepath.Join(dir, "service"), 0o755); err != nil { + t.Fatal(err) + } + heuristicsCopyFileLogs(ctx, buf, dir, "service") + if buf.String() != "valid logs" { + t.Fail() + } + buf.Reset() + + // Check that service logs return the first matching file + if err := os.WriteFile(filepath.Join(dir, "service", "service.log"), []byte("error"), 0o444); err != nil { + t.Fatal(err) + } + heuristicsCopyFileLogs(ctx, buf, dir, "service") + if buf.String() != "valid logs" { + t.Fail() + } +}