Skip to content
This repository was archived by the owner on Jun 29, 2022. It is now read-only.

Commit da23121

Browse files
authored
Merge pull request #763 from kinvolk/invidian/tprint-pod-logs-on-test-failure
test/components/util: print pod logs if waiting for pods fails
2 parents dc175c3 + 904706b commit da23121

File tree

1 file changed

+72
-9
lines changed

1 file changed

+72
-9
lines changed

test/components/util/util.go

Lines changed: 72 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package util
1616

1717
import (
18+
"bufio"
1819
"bytes"
1920
"context"
2021
"fmt"
@@ -31,6 +32,7 @@ import (
3132
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3233
"k8s.io/apimachinery/pkg/util/wait"
3334
"k8s.io/client-go/kubernetes"
35+
corev1typed "k8s.io/client-go/kubernetes/typed/core/v1"
3436
restclient "k8s.io/client-go/rest"
3537
"k8s.io/client-go/tools/clientcmd"
3638
"k8s.io/client-go/tools/portforward"
@@ -87,14 +89,15 @@ func CreateKubeClient(t *testing.T) *kubernetes.Clientset {
8789
}
8890

8991
func WaitForStatefulSet(t *testing.T, client kubernetes.Interface, ns, name string, replicas int, retryInterval, timeout time.Duration) {
90-
if err := wait.Poll(retryInterval, timeout, func() (done bool, err error) {
92+
if err := wait.PollImmediate(retryInterval, timeout, func() (done bool, err error) {
9193
ds, err := client.AppsV1().StatefulSets(ns).Get(context.TODO(), name, metav1.GetOptions{})
9294
if err != nil {
9395
if k8serrors.IsNotFound(err) {
9496
t.Logf("waiting for statefulset %s to be available", name)
9597
return false, nil
9698
}
97-
return false, err
99+
100+
return false, fmt.Errorf("getting StatefulSet %q: %w", name, err)
98101
}
99102

100103
t.Logf("statefulset: %s, replicas: %d/%d", name, int(ds.Status.ReadyReplicas), replicas)
@@ -111,14 +114,17 @@ func WaitForStatefulSet(t *testing.T, client kubernetes.Interface, ns, name stri
111114
}
112115

113116
func WaitForDaemonSet(t *testing.T, client kubernetes.Interface, ns, name string, retryInterval, timeout time.Duration) {
114-
if err := wait.Poll(retryInterval, timeout, func() (done bool, err error) {
115-
ds, err := client.AppsV1().DaemonSets(ns).Get(context.TODO(), name, metav1.GetOptions{})
117+
var ds *appsv1.DaemonSet
118+
119+
if err := wait.PollImmediate(retryInterval, timeout, func() (done bool, err error) {
120+
ds, err = client.AppsV1().DaemonSets(ns).Get(context.TODO(), name, metav1.GetOptions{})
116121
if err != nil {
117122
if k8serrors.IsNotFound(err) {
118123
t.Logf("waiting for daemonset %s to be available", name)
119124
return false, nil
120125
}
121-
return false, err
126+
127+
return false, fmt.Errorf("getting DaemonSet %q: %w", name, err)
122128
}
123129
replicas := ds.Status.DesiredNumberScheduled
124130

@@ -135,6 +141,10 @@ func WaitForDaemonSet(t *testing.T, client kubernetes.Interface, ns, name string
135141
}
136142
return false, nil
137143
}); err != nil {
144+
if err := PrintPodsLogs(t, client.CoreV1().Pods(ns), ds.Spec.Selector); err != nil {
145+
t.Logf("reading pod logs: %v", err)
146+
}
147+
138148
t.Errorf("error while waiting for the daemonset: %v", err)
139149
}
140150
}
@@ -151,7 +161,8 @@ func WaitForDeployment(t *testing.T, client kubernetes.Interface, ns, name strin
151161
t.Logf("waiting for deployment %s to be available", name)
152162
return false, nil
153163
}
154-
return false, err
164+
165+
return false, fmt.Errorf("getting Deployment %q: %w", name, err)
155166
}
156167

157168
replicas := int(deploy.Status.Replicas)
@@ -170,8 +181,11 @@ func WaitForDeployment(t *testing.T, client kubernetes.Interface, ns, name strin
170181
}
171182
return false, nil
172183
}); err != nil {
173-
t.Errorf("error while waiting for the deployment: %v", err)
174-
return
184+
if err := PrintPodsLogs(t, client.CoreV1().Pods(ns), deploy.Spec.Selector); err != nil {
185+
t.Logf("reading pod logs: %v", err)
186+
}
187+
188+
t.Fatalf("error while waiting for the deployment: %v", err)
175189
}
176190

177191
// Check the readiness of the pods
@@ -184,7 +198,7 @@ func WaitForDeployment(t *testing.T, client kubernetes.Interface, ns, name strin
184198
listOptions := metav1.ListOptions{LabelSelector: selector.String()}
185199
pods, err := client.CoreV1().Pods(ns).List(context.TODO(), listOptions)
186200
if err != nil {
187-
return false, err
201+
return false, fmt.Errorf("getting pods: %w", err)
188202
}
189203
pods = filterNonControllerPods(pods)
190204

@@ -209,10 +223,59 @@ func WaitForDeployment(t *testing.T, client kubernetes.Interface, ns, name strin
209223
t.Logf("all pods for deployment %s, are in ready state", deploy.Name)
210224
return true, nil
211225
}); err != nil {
226+
if err := PrintPodsLogs(t, client.CoreV1().Pods(ns), deploy.Spec.Selector); err != nil {
227+
t.Logf("reading pod logs: %v", err)
228+
}
229+
212230
t.Errorf("error while waiting for the pods: %v", err)
213231
}
214232
}
215233

234+
// PrintPodsLogs print logs from all pods and containers selected by given selector.
235+
func PrintPodsLogs(t *testing.T, p corev1typed.PodInterface, selector *metav1.LabelSelector) error {
236+
s, err := metav1.LabelSelectorAsSelector(selector)
237+
if err != nil {
238+
return fmt.Errorf("converting label selector to map: %w", err)
239+
}
240+
241+
pods, err := p.List(context.TODO(), metav1.ListOptions{LabelSelector: s.String()})
242+
if err != nil {
243+
return fmt.Errorf("listing pods: %w", err)
244+
}
245+
246+
if len(pods.Items) == 0 {
247+
return fmt.Errorf("no pods selected")
248+
}
249+
250+
for _, pod := range pods.Items {
251+
for _, container := range pod.Spec.Containers {
252+
podLogOpts := corev1.PodLogOptions{
253+
Container: container.Name,
254+
}
255+
256+
req := p.GetLogs(pod.Name, &podLogOpts)
257+
258+
podLogs, err := req.Stream(context.TODO())
259+
if err != nil {
260+
return fmt.Errorf("opening stream: %w", err)
261+
}
262+
263+
defer func() {
264+
if err := podLogs.Close(); err != nil {
265+
t.Logf("closing stream: %v\n", err)
266+
}
267+
}()
268+
269+
scanner := bufio.NewScanner(podLogs)
270+
for scanner.Scan() {
271+
t.Logf("%s/%s: %s", pod.Name, container.Name, scanner.Text())
272+
}
273+
}
274+
}
275+
276+
return nil
277+
}
278+
216279
func filterNonControllerPods(pods *corev1.PodList) *corev1.PodList {
217280
var filteredPods []corev1.Pod
218281

0 commit comments

Comments
 (0)