github.com/kubeshop/testkube@v1.17.23/contrib/executor/scraper/pkg/runner/runner.go (about) 1 package runner 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "path/filepath" 8 9 "github.com/pkg/errors" 10 11 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 12 "github.com/kubeshop/testkube/pkg/envs" 13 "github.com/kubeshop/testkube/pkg/executor/output" 14 "github.com/kubeshop/testkube/pkg/executor/runner" 15 "github.com/kubeshop/testkube/pkg/executor/scraper" 16 "github.com/kubeshop/testkube/pkg/executor/scraper/factory" 17 ) 18 19 // NewRunner creates scraper runner 20 func NewRunner(ctx context.Context, params envs.Params) (*ScraperRunner, error) { 21 var err error 22 r := &ScraperRunner{ 23 Params: params, 24 } 25 26 r.Scraper, err = factory.TryGetScrapper(ctx, params) 27 if err != nil { 28 return nil, err 29 } 30 31 return r, nil 32 } 33 34 // ScraperRunner prepares data for executor 35 type ScraperRunner struct { 36 Params envs.Params 37 Scraper scraper.Scraper 38 } 39 40 var _ runner.Runner = &ScraperRunner{} 41 42 // Run prepares data for executor 43 func (r *ScraperRunner) Run(ctx context.Context, execution testkube.Execution) (result testkube.ExecutionResult, err error) { 44 if r.Scraper != nil { 45 defer r.Scraper.Close() 46 } 47 // check that the artifact dir exists 48 if execution.ArtifactRequest == nil { 49 return *result.Err(errors.Errorf("executor only support artifact based tests")), nil 50 } 51 52 if execution.ArtifactRequest.StorageClassName == "" && !execution.ArtifactRequest.UseDefaultStorageClassName { 53 return *result.Err(errors.Errorf("artifact request should have not empty storage class name")), nil 54 } 55 56 mountPath := filepath.Join(r.Params.DataDir, "artifacts") 57 if execution.ArtifactRequest.VolumeMountPath != "" { 58 mountPath = execution.ArtifactRequest.VolumeMountPath 59 } 60 61 _, err = os.Stat(mountPath) 62 if errors.Is(err, os.ErrNotExist) { 63 return result, err 64 } 65 66 if r.Params.ScrapperEnabled { 67 directories := execution.ArtifactRequest.Dirs 68 if len(directories) == 0 { 69 directories = []string{"."} 70 } 71 72 for i := range directories { 73 directories[i] = filepath.Join(mountPath, directories[i]) 74 } 75 76 masks := execution.ArtifactRequest.Masks 77 output.PrintLog(fmt.Sprintf("Scraping directories: %v with masks: %v", directories, masks)) 78 79 if err := r.Scraper.Scrape(ctx, directories, masks, execution); err != nil { 80 return *result.Err(err), errors.Wrap(err, "error scraping artifacts from container executor") 81 } 82 } 83 84 return result, nil 85 } 86 87 // GetType returns runner type 88 func (r *ScraperRunner) GetType() runner.Type { 89 return runner.TypeFin 90 }