github.com/kubeshop/testkube@v1.17.23/pkg/executor/scraper/scraper.go (about) 1 package scraper 2 3 import ( 4 "context" 5 "fmt" 6 7 cdevents "github.com/cdevents/sdk-go/pkg/api" 8 cloudevents "github.com/cloudevents/sdk-go/v2" 9 "github.com/gabriel-vasile/mimetype" 10 11 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 12 "github.com/kubeshop/testkube/pkg/log" 13 cde "github.com/kubeshop/testkube/pkg/mapper/cdevents" 14 ) 15 16 // Scraper is responsible for collecting and persisting the execution artifacts 17 // 18 //go:generate mockgen -destination=./mock_scraper.go -package=scraper "github.com/kubeshop/testkube/pkg/executor/scraper" Scraper 19 type Scraper interface { 20 // Scrape gets artifacts from the provided paths and the provided execution 21 Scrape(ctx context.Context, paths, masks []string, execution testkube.Execution) error 22 Close() error 23 } 24 25 type ExtractLoadScraper struct { 26 extractor Extractor 27 loader Uploader 28 cdeventsClient cloudevents.Client 29 clusterID string 30 dashboardURI string 31 } 32 33 func NewExtractLoadScraper(extractor Extractor, loader Uploader, cdeventsClient cloudevents.Client, 34 clusterID, dashboardURI string) *ExtractLoadScraper { 35 return &ExtractLoadScraper{ 36 extractor: extractor, 37 loader: loader, 38 cdeventsClient: cdeventsClient, 39 clusterID: clusterID, 40 dashboardURI: dashboardURI, 41 } 42 } 43 44 func (s *ExtractLoadScraper) Scrape(ctx context.Context, paths, masks []string, execution testkube.Execution) error { 45 return s. 46 extractor. 47 Extract(ctx, paths, masks, 48 func(ctx context.Context, object *Object) error { 49 return s.loader.Upload(ctx, object, execution) 50 }, 51 func(ctx context.Context, path string) error { 52 if s.cdeventsClient != nil { 53 if err := s.sendCDEvent(execution, path); err != nil { 54 return err 55 } 56 } 57 58 return nil 59 }) 60 } 61 62 func (s *ExtractLoadScraper) Close() error { 63 return s.loader.Close() 64 } 65 66 func (s *ExtractLoadScraper) sendCDEvent(execution testkube.Execution, path string) error { 67 mtype, err := mimetype.DetectFile(path) 68 if err != nil { 69 log.DefaultLogger.Warnf("failed to detect mime type %w", err) 70 } 71 72 ev, err := cde.MapTestkubeArtifactToCDEvent(&execution, s.clusterID, path, mtype.String(), s.dashboardURI) 73 if err != nil { 74 return err 75 } 76 77 ce, err := cdevents.AsCloudEvent(ev) 78 if err != nil { 79 return err 80 } 81 82 if result := s.cdeventsClient.Send(context.Background(), *ce); cloudevents.IsUndelivered(result) { 83 return fmt.Errorf("failed to send, %v", result) 84 } 85 86 return nil 87 }