From 1d44a0cdfa01411c0d20e6409eefa197ab364bad Mon Sep 17 00:00:00 2001 From: Matt Moyer Date: Thu, 3 Dec 2020 09:34:46 -0600 Subject: [PATCH] Add a small integration test library to dump pod logs on test failures. Signed-off-by: Matt Moyer --- test/library/dumplogs.go | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 test/library/dumplogs.go diff --git a/test/library/dumplogs.go b/test/library/dumplogs.go new file mode 100644 index 00000000..33f33694 --- /dev/null +++ b/test/library/dumplogs.go @@ -0,0 +1,49 @@ +// Copyright 2020 the Pinniped contributors. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package library + +import ( + "bufio" + "context" + "testing" + "time" + + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// DumpLogs is meant to be called in a `defer` to dump the logs of components in the cluster on a test failure. +func DumpLogs(t *testing.T, namespace string) { + // Only trigger on failed tests. + if !t.Failed() { + return + } + + kubeClient := NewClientset(t) + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) + defer cancel() + + logTailLines := int64(40) + pods, err := kubeClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{}) + require.NoError(t, err) + + for _, pod := range pods.Items { + for _, container := range pod.Status.ContainerStatuses { + t.Logf("pod %s/%s container %s restarted %d times:", pod.Namespace, pod.Name, container.Name, container.RestartCount) + req := kubeClient.CoreV1().Pods(namespace).GetLogs(pod.Name, &corev1.PodLogOptions{ + Container: container.Name, + TailLines: &logTailLines, + }) + logReader, err := req.Stream(ctx) + require.NoError(t, err) + + scanner := bufio.NewScanner(logReader) + for scanner.Scan() { + t.Logf("%s/%s/%s > %s", pod.Namespace, pod.Name, container.Name, scanner.Text()) + } + require.NoError(t, scanner.Err()) + } + } +}