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 }