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  }