github.com/kubeshop/testkube@v1.17.23/pkg/executor/scraper/minio_uploader.go (about)

     1  package scraper
     2  
     3  import (
     4  	"context"
     5  
     6  	coreminio "github.com/minio/minio-go/v7"
     7  
     8  	"github.com/kubeshop/testkube/pkg/log"
     9  
    10  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    11  
    12  	"github.com/pkg/errors"
    13  
    14  	"github.com/kubeshop/testkube/pkg/storage/minio"
    15  )
    16  
    17  type MinIOUploader struct {
    18  	Endpoint, AccessKeyID, SecretAccessKey, Region, Token, Bucket string
    19  	client                                                        *minio.Client
    20  }
    21  
    22  func NewMinIOUploader(endpoint, accessKeyID, secretAccessKey, region, token, bucket string, ssl, skipVerify bool, certFile, keyFile, caFile string) (*MinIOUploader, error) {
    23  	l := &MinIOUploader{
    24  		Endpoint:        endpoint,
    25  		AccessKeyID:     accessKeyID,
    26  		SecretAccessKey: secretAccessKey,
    27  		Region:          region,
    28  		Token:           token,
    29  		Bucket:          bucket,
    30  	}
    31  
    32  	opts := minio.GetTLSOptions(ssl, skipVerify, certFile, keyFile, caFile)
    33  	client := minio.NewClient(l.Endpoint, l.AccessKeyID, l.SecretAccessKey, l.Region, l.Token, l.Bucket, opts...)
    34  	err := client.Connect()
    35  	if err != nil {
    36  		return nil, errors.Errorf("error occured creating minio client: %v", err)
    37  	}
    38  	l.client = client
    39  
    40  	return l, nil
    41  }
    42  
    43  func (l *MinIOUploader) Upload(ctx context.Context, object *Object, execution testkube.Execution) error {
    44  	folder := execution.Id
    45  	if execution.ArtifactRequest != nil && execution.ArtifactRequest.OmitFolderPerExecution {
    46  		folder = ""
    47  	}
    48  
    49  	log.DefaultLogger.Infow("MinIO loader is uploading file", "file", object.Name, "folder", folder, "size", object.Size)
    50  	opts := coreminio.PutObjectOptions{}
    51  	switch object.DataType {
    52  	case DataTypeRaw:
    53  		opts.ContentType = "application/octet-stream"
    54  	case DataTypeTarball:
    55  		opts.DisableMultipart = true
    56  		opts.ContentEncoding = "gzip"
    57  		opts.ContentType = "application/gzip"
    58  		opts.UserMetadata = map[string]string{
    59  			"X-Amz-Meta-Snowball-Auto-Extract": "true",
    60  			"X-Amz-Meta-Minio-Snowball-Prefix": folder,
    61  		}
    62  	}
    63  
    64  	if err := l.client.SaveFileDirect(ctx, folder, object.Name, object.Data, object.Size, opts); err != nil {
    65  		return errors.Wrapf(err, "error saving file %s", object.Name)
    66  	}
    67  
    68  	return nil
    69  }
    70  
    71  func (l *MinIOUploader) Close() error {
    72  	return nil
    73  }
    74  
    75  var _ Uploader = (*MinIOUploader)(nil)