@@ -2,12 +2,13 @@ package framework
22
33import (
44 "archive/tar"
5+ "bufio"
56 "bytes"
67 "context"
78 "encoding/binary"
89 "fmt"
910 "github.com/docker/docker/api/types/container"
10- filters2 "github.com/docker/docker/api/types/filters"
11+ dfilter "github.com/docker/docker/api/types/filters"
1112 "github.com/docker/docker/client"
1213 "github.com/docker/go-connections/nat"
1314 "github.com/google/uuid"
@@ -17,8 +18,10 @@ import (
1718 "os"
1819 "os/exec"
1920 "path/filepath"
21+ "regexp"
2022 "strings"
2123 "sync"
24+ "testing"
2225)
2326
2427const (
@@ -176,30 +179,70 @@ func (dc *DockerClient) copyToContainer(containerID, sourceFile, targetPath stri
176179 return nil
177180}
178181
179- // WriteAllContainersLogs writes all Docker container logs to the default logs directory
180- func WriteAllContainersLogs (dir string ) error {
182+ // SearchLogFile searches logfile using regex and return matches or error
183+ func SearchLogFile (fp string , regex string ) ([]string , error ) {
184+ file , err := os .Open (fp )
185+ if err != nil {
186+ return nil , err
187+ }
188+ defer file .Close ()
189+ scanner := bufio .NewScanner (file )
190+ re , err := regexp .Compile (regex )
191+ if err != nil {
192+ return nil , err
193+ }
194+ matches := make ([]string , 0 )
195+ for scanner .Scan () {
196+ line := scanner .Text ()
197+ if re .MatchString (line ) {
198+ L .Info ().Str ("Regex" , regex ).Msg ("Log match found" )
199+ matches = append (matches , line )
200+ }
201+ }
202+
203+ if err := scanner .Err (); err != nil {
204+ return matches , err
205+ }
206+ return matches , nil
207+ }
208+
209+ func SaveAndCheckLogs (t * testing.T ) error {
210+ _ , err := SaveContainerLogs (fmt .Sprintf ("%s-%s" , DefaultCTFLogsDir , t .Name ()))
211+ if err != nil {
212+ return err
213+ }
214+ err = CheckCLNodeContainerErrors ()
215+ if err != nil {
216+ return err
217+ }
218+ return nil
219+ }
220+
221+ // SaveContainerLogs writes all Docker container logs to some directory
222+ func SaveContainerLogs (dir string ) ([]string , error ) {
181223 L .Info ().Msg ("Writing Docker containers logs" )
182224 if _ , err := os .Stat (dir ); os .IsNotExist (err ) {
183225 if err := os .MkdirAll (dir , 0755 ); err != nil {
184- return fmt .Errorf ("failed to create directory %s: %w" , dir , err )
226+ return nil , fmt .Errorf ("failed to create directory %s: %w" , dir , err )
185227 }
186228 }
187229 provider , err := tc .NewDockerProvider ()
188230 if err != nil {
189- return fmt .Errorf ("failed to create Docker provider: %w" , err )
231+ return nil , fmt .Errorf ("failed to create Docker provider: %w" , err )
190232 }
191233 containers , err := provider .Client ().ContainerList (context .Background (), container.ListOptions {
192234 All : true ,
193- Filters : filters2 .NewArgs (filters2 .KeyValuePair {
235+ Filters : dfilter .NewArgs (dfilter .KeyValuePair {
194236 Key : "label" ,
195237 Value : "framework=ctf" ,
196238 }),
197239 })
198240 if err != nil {
199- return fmt .Errorf ("failed to list Docker containers: %w" , err )
241+ return nil , fmt .Errorf ("failed to list Docker containers: %w" , err )
200242 }
201243
202244 eg := & errgroup.Group {}
245+ logFilePaths := make ([]string , 0 )
203246
204247 for _ , containerInfo := range containers {
205248 eg .Go (func () error {
@@ -217,6 +260,7 @@ func WriteAllContainersLogs(dir string) error {
217260 L .Error ().Err (err ).Str ("Container" , containerName ).Msg ("failed to create container log file" )
218261 return err
219262 }
263+ logFilePaths = append (logFilePaths , logFilePath )
220264 // Parse and write logs
221265 header := make ([]byte , 8 ) // Docker stream header is 8 bytes
222266 for {
@@ -249,7 +293,10 @@ func WriteAllContainersLogs(dir string) error {
249293 return nil
250294 })
251295 }
252- return eg .Wait ()
296+ if err := eg .Wait (); err != nil {
297+ return nil , err
298+ }
299+ return logFilePaths , nil
253300}
254301
255302func BuildImageOnce (once * sync.Once , dctx , dfile , nameAndTag string ) error {
0 commit comments