@@ -21,14 +21,17 @@ package shared
2121
2222import (
2323 "context"
24+ "encoding/base64"
2425 "fmt"
2526 "os"
2627 "path"
2728 "path/filepath"
29+ "strings"
2830 "time"
2931
3032 . "github.com/onsi/ginkgo/v2"
3133 . "github.com/onsi/gomega"
34+ "github.com/pkg/errors"
3235 corev1 "k8s.io/api/core/v1"
3336 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3437 crclient "sigs.k8s.io/controller-runtime/pkg/client"
@@ -203,8 +206,18 @@ func DumpMachine(ctx context.Context, e2eCtx *E2EContext, machine infrav1.AWSMac
203206 title : "containerd" ,
204207 cmd : "journalctl --no-pager -u containerd.service" ,
205208 },
209+ {
210+ title : "pod-logs" ,
211+ cmd : "sudo tar -czf - -C /var/log pods | base64 -w0" ,
212+ },
206213 },
207214 )
215+
216+ // Post-process pod-logs to have a tar.gz file instead of base64 date encoded in the log file.
217+ // Note: It is not possible to directly output the raw tar.gz data because something truncates it.
218+ if err := postProcessBase64LogData (filepath .Dir (f .Name ()), "pod-logs.log" , "pod-logs.tar.gz" ); err != nil {
219+ fmt .Fprintf (GinkgoWriter , "Failed to post-process pod-logs: %v\n " , err )
220+ }
208221}
209222
210223func DumpSpecResources (ctx context.Context , e2eCtx * E2EContext , namespace * corev1.Namespace ) {
@@ -287,3 +300,39 @@ func CreateAWSClusterControllerIdentity(k8sclient crclient.Client) {
287300func Byf (format string , a ... interface {}) {
288301 By (fmt .Sprintf (format , a ... ))
289302}
303+
304+ func postProcessBase64LogData (dir , src , dst string ) error {
305+ sourceFile := filepath .Clean (path .Join (dir , src ))
306+ destinationFile := filepath .Clean (path .Join (dir , dst ))
307+
308+ // Read input data
309+ inputData , err := os .ReadFile (sourceFile )
310+ if err != nil {
311+ return errors .Wrapf (err , "unable to read source file %q" , sourceFile )
312+ }
313+
314+ // Extract second line which contains the data (first line contains the command)
315+ inputStringData := strings .Split (string (inputData ), "\n " )[1 ]
316+
317+ // Trim spaces and the $ suffix.
318+ inputStringData = strings .TrimSpace (inputStringData )
319+ inputStringData = strings .TrimSuffix (inputStringData , "$" )
320+
321+ // Base64 decode the data
322+ outputData , err := base64 .StdEncoding .DecodeString (inputStringData )
323+ if err != nil {
324+ return errors .Wrapf (err , "unable to base64 decode input data" )
325+ }
326+
327+ // Write the destination file
328+ if err := os .WriteFile (destinationFile , outputData , 0600 ); err != nil {
329+ return errors .Wrapf (err , "unable to write destination file at %q" , destinationFile )
330+ }
331+
332+ // Delete the source file.
333+ if err := os .Remove (sourceFile ); err != nil {
334+ return errors .Wrapf (err , "unable to delete source file at %q" , sourceFile )
335+ }
336+
337+ return nil
338+ }
0 commit comments