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  }