github.com/kubeshop/testkube@v1.17.23/pkg/executor/client/common.go (about)

     1  package client
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"time"
     7  
     8  	"go.uber.org/zap"
     9  	corev1 "k8s.io/api/core/v1"
    10  	"k8s.io/apimachinery/pkg/util/yaml"
    11  	kyaml "sigs.k8s.io/kustomize/kyaml/yaml"
    12  	"sigs.k8s.io/kustomize/kyaml/yaml/merge2"
    13  
    14  	executorv1 "github.com/kubeshop/testkube-operator/api/executor/v1"
    15  	testsv3 "github.com/kubeshop/testkube-operator/api/tests/v3"
    16  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    17  	"github.com/kubeshop/testkube/pkg/featureflags"
    18  	"github.com/kubeshop/testkube/pkg/utils"
    19  )
    20  
    21  const (
    22  	WatchInterval = time.Second
    23  )
    24  
    25  type ExecuteOptions struct {
    26  	ID                   string
    27  	TestName             string
    28  	Namespace            string
    29  	TestSpec             testsv3.TestSpec
    30  	ExecutorName         string
    31  	ExecutorSpec         executorv1.ExecutorSpec
    32  	Request              testkube.ExecutionRequest
    33  	Sync                 bool
    34  	Labels               map[string]string
    35  	UsernameSecret       *testkube.SecretRef
    36  	TokenSecret          *testkube.SecretRef
    37  	RunnerCustomCASecret string
    38  	CertificateSecret    string
    39  	// AgentAPITLSSecret is a secret name that contains TLS certificate for Agent (gRPC) API
    40  	AgentAPITLSSecret    string
    41  	ImagePullSecretNames []string
    42  	Features             featureflags.FeatureFlags
    43  }
    44  
    45  type PVCOptions struct {
    46  	Name                    string
    47  	Namespace               string
    48  	PvcTemplate             string
    49  	PvcTemplateExtensions   string
    50  	ArtifactRequest         *testkube.ArtifactRequest
    51  	DefaultStorageClassName string
    52  }
    53  
    54  // NewPersistentVolumeClaimSpec is a method to create new persistent volume claim spec
    55  func NewPersistentVolumeClaimSpec(log *zap.SugaredLogger, options PVCOptions) (*corev1.PersistentVolumeClaim, error) {
    56  	tmpl, err := utils.NewTemplate("volume-claim").Parse(options.PvcTemplate)
    57  	if err != nil {
    58  		return nil, fmt.Errorf("creating volume claim spec from pvc template error: %w", err)
    59  	}
    60  
    61  	var buffer bytes.Buffer
    62  	if err = tmpl.ExecuteTemplate(&buffer, "volume-claim", options); err != nil {
    63  		return nil, fmt.Errorf("executing volume claim spec pvc template: %w", err)
    64  	}
    65  
    66  	var pvc corev1.PersistentVolumeClaim
    67  	pvcSpec := buffer.String()
    68  	if options.PvcTemplateExtensions != "" {
    69  		tmplExt, err := utils.NewTemplate("jobExt").Parse(options.PvcTemplateExtensions)
    70  		if err != nil {
    71  			return nil, fmt.Errorf("creating pvc extensions spec from executor template error: %w", err)
    72  		}
    73  
    74  		var bufferExt bytes.Buffer
    75  		if err = tmplExt.ExecuteTemplate(&bufferExt, "jobExt", options); err != nil {
    76  			return nil, fmt.Errorf("executing pvc extensions spec executor template: %w", err)
    77  		}
    78  
    79  		if pvcSpec, err = merge2.MergeStrings(bufferExt.String(), pvcSpec, false, kyaml.MergeOptions{}); err != nil {
    80  			return nil, fmt.Errorf("merging spvc spec executor templates: %w", err)
    81  		}
    82  	}
    83  
    84  	log.Debug("Volume claim specification", pvcSpec)
    85  	decoder := yaml.NewYAMLOrJSONDecoder(bytes.NewBufferString(pvcSpec), len(pvcSpec))
    86  	if err := decoder.Decode(&pvc); err != nil {
    87  		return nil, fmt.Errorf("decoding pvc spec error: %w", err)
    88  	}
    89  
    90  	return &pvc, nil
    91  }