1515package util
1616
1717import (
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
8991func 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
113116func 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+
216279func filterNonControllerPods (pods * corev1.PodList ) * corev1.PodList {
217280 var filteredPods []corev1.Pod
218281
0 commit comments