@@ -6,12 +6,16 @@ import (
66 "encoding/json"
77 "fmt"
88 "io"
9+ "os"
910 "os/exec"
11+ "path/filepath"
1012 "regexp"
1113 "syscall"
1214 "time"
1315
16+ "github.com/ethpandaops/assertoor/pkg/coordinator/db"
1417 "github.com/ethpandaops/assertoor/pkg/coordinator/types"
18+ "github.com/jmoiron/sqlx"
1519 "github.com/sirupsen/logrus"
1620)
1721
@@ -78,6 +82,19 @@ func (t *Task) Execute(ctx context.Context) error {
7882 cmdLogger := t .logger .WithField ("shell" , t .config .Shell )
7983 cmdLogger .Info ("running command" )
8084
85+ // create temp dir for task
86+ taskDir , err := os .MkdirTemp (os .TempDir (), fmt .Sprintf ("assertoor_%v_%v_" , t .ctx .Scheduler .GetTestRunID (), t .ctx .Index ))
87+ if err != nil {
88+ cmdLogger .Errorf ("failed creating task dir: %v" , err )
89+ return err
90+ }
91+
92+ defer func () {
93+ if err2 := os .RemoveAll (taskDir ); err2 != nil {
94+ cmdLogger .Errorf ("failed cleaning up task dir: %v" , err2 )
95+ }
96+ }()
97+
8198 //nolint:gosec // ignore
8299 command := exec .CommandContext (ctx , t .config .Shell , t .config .ShellArgs ... )
83100
@@ -124,6 +141,28 @@ func (t *Task) Execute(ctx context.Context) error {
124141 command .Env = append (command .Env , fmt .Sprintf ("%v=%v" , envName , string (varJSON )))
125142 }
126143
144+ // create summaries file
145+ summaryFile , err := newResultFile (filepath .Join (taskDir , "summary" ))
146+ if err != nil {
147+ cmdLogger .Errorf ("failed creating summary file: %v" , err )
148+ return err
149+ }
150+
151+ command .Env = append (command .Env , fmt .Sprintf ("ASSERTOOR_SUMMARY=%v" , summaryFile .FilePath ()))
152+
153+ // create folder for result files
154+ resultDir := filepath .Join (taskDir , "results" )
155+ if err = os .MkdirAll (resultDir , 0o700 ); err != nil {
156+ cmdLogger .Errorf ("failed creating result dir: %v" , err )
157+ return err
158+ }
159+
160+ command .Env = append (command .Env , fmt .Sprintf ("ASSERTOOR_RESULT_DIR=%v" , resultDir ))
161+
162+ defer func () {
163+ t .storeTaskResults (summaryFile , resultDir )
164+ }()
165+
127166 // start shell
128167 err = command .Start ()
129168 if err != nil {
@@ -305,3 +344,70 @@ func (t *Task) parseOutputVars(line string) bool {
305344
306345 return false
307346}
347+
348+ func (t * Task ) storeTaskResults (summaryFile * resultFile , resultDir string ) {
349+ // store files to db
350+ database := t .ctx .Scheduler .GetServices ().Database ()
351+ if err2 := database .RunTransaction (func (tx * sqlx.Tx ) error {
352+ // store summary file
353+ data , err3 := summaryFile .Cleanup ()
354+ if err3 != nil {
355+ t .logger .Errorf ("failed cleaning up summary file: %v" , err3 )
356+ } else if err3 = database .UpsertTaskResult (tx , & db.TaskResult {
357+ RunID : int (t .ctx .Scheduler .GetTestRunID ()),
358+ TaskID : int (t .ctx .Index ),
359+ Type : "summary" ,
360+ Index : 0 ,
361+ Name : "" ,
362+ Size : len (data ),
363+ Data : data ,
364+ }); err3 != nil {
365+ t .logger .Errorf ("failed storing summary file to db: %v" , err3 )
366+ }
367+
368+ // store result files
369+ fileIdx := 0
370+
371+ var storeResultFilesFn func (path string , prefix string )
372+ storeResultFilesFn = func (path string , prefix string ) {
373+ if prefix != "" {
374+ prefix += "/"
375+ }
376+
377+ files , err3 := os .ReadDir (path )
378+ if err3 != nil {
379+ t .logger .Errorf ("failed reading result dir: %v" , err3 )
380+ } else {
381+ for _ , file := range files {
382+ if file .IsDir () {
383+ storeResultFilesFn (filepath .Join (path , file .Name ()), fmt .Sprintf ("%v%v" , prefix , file .Name ()))
384+ continue
385+ }
386+
387+ data , err3 := os .ReadFile (filepath .Join (path , file .Name ()))
388+ if err3 != nil {
389+ t .logger .Errorf ("failed reading result file: %v" , err3 )
390+ } else if err3 = database .UpsertTaskResult (tx , & db.TaskResult {
391+ RunID : int (t .ctx .Scheduler .GetTestRunID ()),
392+ TaskID : int (t .ctx .Index ),
393+ Type : "result" ,
394+ Index : fileIdx ,
395+ Name : file .Name (),
396+ Size : len (data ),
397+ Data : data ,
398+ }); err3 != nil {
399+ t .logger .Errorf ("failed storing result file to db: %v" , err3 )
400+ }
401+
402+ fileIdx ++
403+ }
404+ }
405+ }
406+
407+ storeResultFilesFn (resultDir , "" )
408+
409+ return nil
410+ }); err2 != nil {
411+ t .logger .Errorf ("failed storing task results to db: %v" , err2 )
412+ }
413+ }
0 commit comments